packages: Remove duplicates from package cache.

Previously the same package could appear several times if several
variables were bound to it, as is notably the case for "python"
currently.  This, in turn, would lead to obnoxious "ambiguous package
specification" messages.

* gnu/packages.scm (generate-package-cache)[expand-cache]: Change RESULT
to RESULT+SEEN and adjust accordingly.
Call 'first' on the result of 'fold-module-public-variables*'.
* tests/packages.scm ("fold-available-packages with/without cache"):
Check for lack of duplicates in FROM-CACHE.
This commit is contained in:
Ludovic Courtès 2019-02-15 22:58:29 +01:00
parent ba48895899
commit 36754eee28
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 32 additions and 24 deletions

View file

@ -371,34 +371,41 @@ (define (generate-package-cache directory)
(define cache-file
(string-append directory %package-cache-file))
(define (expand-cache module symbol variable result)
(define (expand-cache module symbol variable result+seen)
(match (false-if-exception (variable-ref variable))
((? package? package)
(if (hidden-package? package)
result
(cons `#(,(package-name package)
,(package-version package)
,(module-name module)
,symbol
,(package-outputs package)
,(->bool (member (%current-system)
(package-supported-systems package)))
,(->bool (package-superseded package))
,@(let ((loc (package-location package)))
(if loc
`(,(location-file loc)
,(location-line loc)
,(location-column loc))
'(#f #f #f))))
result)))
(match result+seen
((result . seen)
(if (or (vhash-assq package seen)
(hidden-package? package))
(cons result seen)
(cons (cons `#(,(package-name package)
,(package-version package)
,(module-name module)
,symbol
,(package-outputs package)
,(->bool
(member (%current-system)
(package-supported-systems package)))
,(->bool (package-superseded package))
,@(let ((loc (package-location package)))
(if loc
`(,(location-file loc)
,(location-line loc)
,(location-column loc))
'(#f #f #f))))
result)
(vhash-consq package #t seen))))))
(_
result)))
result+seen)))
(define exp
(fold-module-public-variables* expand-cache '()
(all-modules (%package-module-path)
#:warn
warn-about-load-error)))
(first
(fold-module-public-variables* expand-cache
(cons '() vlist-null)
(all-modules (%package-module-path)
#:warn
warn-about-load-error))))
(mkdir-p (dirname cache-file))
(call-with-output-file cache-file

View file

@ -1037,7 +1037,8 @@ (define from-cache
result))
'()))))))
(lset= equal? no-cache from-cache)))
(and (equal? (delete-duplicates from-cache) from-cache)
(lset= equal? no-cache from-cache))))
(test-assert "find-packages-by-name"
(match (find-packages-by-name "hello")