From 5684add77edd120ed640368d9795fbea7ea5a9ea Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Tue, 25 Feb 2025 11:23:23 +0000 Subject: Improve package deduplication Handle cases where there are up to 4 packages with the same name and version plus some having replacements. This is currently the case with glibc. --- guix-data-service/jobs/load-new-guix-revision.scm | 121 ++++++++++++++-------- 1 file changed, 79 insertions(+), 42 deletions(-) diff --git a/guix-data-service/jobs/load-new-guix-revision.scm b/guix-data-service/jobs/load-new-guix-revision.scm index 4d5eb7e..75400b2 100644 --- a/guix-data-service/jobs/load-new-guix-revision.scm +++ b/guix-data-service/jobs/load-new-guix-revision.scm @@ -641,48 +641,85 @@ (define (sort-and-deduplicate-inferior-packages packages pkg-to-replacement-hash-table) - (pair-fold - (lambda (pair result) - (if (null? (cdr pair)) - (cons (first pair) result) - (let* ((a (first pair)) - (b (second pair)) - (a-name (inferior-package-name a)) - (b-name (inferior-package-name b)) - (a-version (inferior-package-version a)) - (b-version (inferior-package-version b)) - (a-replacement (hashq-ref pkg-to-replacement-hash-table a)) - (b-replacement (hashq-ref pkg-to-replacement-hash-table b))) - (if (and (string=? a-name b-name) - (string=? a-version b-version) - (eq? a-replacement b-replacement)) - (begin - (simple-format (current-error-port) - "warning: ignoring duplicate package: ~A (~A)\n" - a-name - a-version) - result) - (cons a result))))) - '() - (sort packages - (lambda (a b) - (let ((a-name (inferior-package-name a)) - (b-name (inferior-package-name b))) - (if (string=? a-name b-name) - (let ((a-version (inferior-package-version a)) - (b-version (inferior-package-version b))) - (if (string=? a-version b-version) - ;; The name and version are the same, so try and pick - ;; the same package each time, by looking at the - ;; location. - (let ((a-location (inferior-package-location a)) - (b-location (inferior-package-location b))) - (> (location-line a-location) - (location-line b-location))) - (string (location-line a-location) + (location-line b-location))) + (->bool a-replacement))) + (string