|
427 | 427 | (print-unreadable-object (dist stream :type t) |
428 | 428 | (write-string (short-description dist) stream))) |
429 | 429 |
|
| 430 | +(defun cdb-lookup (dist key cdb) |
| 431 | + (ql-cdb:lookup key |
| 432 | + (relative-to dist cdb))) |
430 | 433 |
|
431 | 434 | (defmethod slot-unbound (class (dist dist) (slot (eql 'available-versions-url))) |
432 | 435 | (declare (ignore class)) |
|
439 | 442 |
|
440 | 443 |
|
441 | 444 | (defmethod provided-releases ((dist dist)) |
| 445 | + ;; FIXME: Should not unconditionally initialize |
| 446 | + (initialize-release-index dist) |
442 | 447 | (loop for release being each hash-value of (release-index dist) |
443 | 448 | collect release)) |
444 | 449 |
|
445 | 450 | (defmethod provided-systems ((dist dist)) |
| 451 | + ;; FIXME: totally broken |
446 | 452 | (loop for system being each hash-value of (system-index dist) |
447 | 453 | collect system)) |
448 | 454 |
|
| 455 | + |
449 | 456 | (defmethod ensure-release-index-file ((dist dist)) |
450 | 457 | (let ((pathname (relative-to dist "releases.txt"))) |
451 | 458 | (or (probe-file pathname) |
@@ -505,8 +512,29 @@ the given NAME." |
505 | 512 | (ql-impl-util:delete-directory-tree (base-directory dist)))) |
506 | 513 |
|
507 | 514 |
|
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))))))) |
510 | 538 |
|
511 | 539 |
|
512 | 540 | (defparameter *dist-enumeration-functions* |
@@ -763,7 +791,8 @@ the given NAME." |
763 | 791 |
|
764 | 792 | (defmethod slot-unbound (class (dist dist) (slot (eql 'release-index))) |
765 | 793 | (declare (ignore class)) |
766 | | - (initialize-release-index dist)) |
| 794 | + (setf (slot-value dist 'release-index) |
| 795 | + (make-hash-table :test 'equal))) |
767 | 796 |
|
768 | 797 |
|
769 | 798 | ;;; |
@@ -828,17 +857,36 @@ the given NAME." |
828 | 857 |
|
829 | 858 | (defmethod slot-unbound (class (release release) (slot (eql 'provided-systems))) |
830 | 859 | (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)))) |
835 | 865 |
|
836 | 866 | (defmethod slot-unbound (class (dist dist) (slot (eql 'system-index))) |
837 | 867 | (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)) |
839 | 881 |
|
840 | 882 | (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))))))) |
842 | 890 |
|
843 | 891 | (defmethod preference ((system system)) |
844 | 892 | (if (probe-file (preference-file system)) |
|
0 commit comments