Skip to content

Commit c6b6820

Browse files
committed
First cut at CDB dist support.
Very fast direct system/release lookup compared to before, but enumerating all systems/releases is quite a bit slower. A hybrid approach might help.
1 parent 2e6a726 commit c6b6820

File tree

1 file changed

+57
-9
lines changed

1 file changed

+57
-9
lines changed

dist.lisp

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,9 @@
427427
(print-unreadable-object (dist stream :type t)
428428
(write-string (short-description dist) stream)))
429429

430+
(defun cdb-lookup (dist key cdb)
431+
(ql-cdb:lookup key
432+
(relative-to dist cdb)))
430433

431434
(defmethod slot-unbound (class (dist dist) (slot (eql 'available-versions-url)))
432435
(declare (ignore class))
@@ -439,13 +442,17 @@
439442

440443

441444
(defmethod provided-releases ((dist dist))
445+
;; FIXME: Should not unconditionally initialize
446+
(initialize-release-index dist)
442447
(loop for release being each hash-value of (release-index dist)
443448
collect release))
444449

445450
(defmethod provided-systems ((dist dist))
451+
;; FIXME: totally broken
446452
(loop for system being each hash-value of (system-index dist)
447453
collect system))
448454

455+
449456
(defmethod ensure-release-index-file ((dist dist))
450457
(let ((pathname (relative-to dist "releases.txt")))
451458
(or (probe-file pathname)
@@ -505,8 +512,29 @@ the given NAME."
505512
(ql-impl-util:delete-directory-tree (base-directory dist))))
506513

507514

508-
(defmethod find-release-in-dist (release dist)
509-
(values (gethash release (release-index dist))))
515+
(defun make-release-from-line (line dist)
516+
(let ((release
517+
(make-line-instance line 'release
518+
:project-name
519+
:archive-url
520+
:archive-size
521+
:archive-md5
522+
:archive-content-sha1
523+
:prefix
524+
:system-files)))
525+
(setf (dist release) dist)
526+
(setf (archive-size release)
527+
(parse-integer (archive-size release)))
528+
release))
529+
530+
(defmethod find-release-in-dist (release-name dist)
531+
(let* ((index (release-index dist))
532+
(release (gethash release-name index)))
533+
(or release
534+
(let ((line (cdb-lookup dist release-name "releases.cdb")))
535+
(when line
536+
(setf (gethash release-name index)
537+
(make-release-from-line line dist)))))))
510538

511539

512540
(defparameter *dist-enumeration-functions*
@@ -763,7 +791,8 @@ the given NAME."
763791

764792
(defmethod slot-unbound (class (dist dist) (slot (eql 'release-index)))
765793
(declare (ignore class))
766-
(initialize-release-index dist))
794+
(setf (slot-value dist 'release-index)
795+
(make-hash-table :test 'equal)))
767796

768797

769798
;;;
@@ -828,17 +857,36 @@ the given NAME."
828857

829858
(defmethod slot-unbound (class (release release) (slot (eql 'provided-systems)))
830859
(declare (ignore class))
831-
(initialize-system-index (dist release))
832-
(if (slot-boundp release 'provided-systems)
833-
(provided-systems release)
834-
(setf (provided-systems release) nil)))
860+
(setf (slot-value release 'provided-systems)
861+
(mapcar (lambda (system-file)
862+
(find-system-in-dist (pathname-name system-file)
863+
(dist release)))
864+
(system-files release))))
835865

836866
(defmethod slot-unbound (class (dist dist) (slot (eql 'system-index)))
837867
(declare (ignore class))
838-
(initialize-system-index dist))
868+
(setf (slot-value dist 'system-index)
869+
(make-hash-table :test 'equal)))
870+
871+
(defun make-system-from-line (line dist)
872+
(let ((system (make-line-instance line 'system
873+
:release
874+
:system-file-name
875+
:name
876+
:required-systems)))
877+
(setf (dist system) dist)
878+
(setf (release system)
879+
(find-release-in-dist (release system) dist))
880+
system))
839881

840882
(defmethod find-system-in-dist (system-name dist)
841-
(values (gethash system-name (system-index dist))))
883+
(let* ((index (system-index dist))
884+
(system (gethash system-name index)))
885+
(or system
886+
(let ((line (cdb-lookup dist system-name "systems.cdb")))
887+
(when line
888+
(setf (gethash system-name index)
889+
(make-system-from-line line dist)))))))
842890

843891
(defmethod preference ((system system))
844892
(if (probe-file (preference-file system))

0 commit comments

Comments
 (0)