mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-24 05:18:07 -05:00
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:
parent
ba48895899
commit
36754eee28
2 changed files with 32 additions and 24 deletions
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in a new issue