Browse Source

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.
wip-deploy2
Ludovic Courtès 3 years ago
parent
commit
36754eee28
No known key found for this signature in database GPG Key ID: 90B11993D9AEBB5
  1. 53
      gnu/packages.scm
  2. 3
      tests/packages.scm

53
gnu/packages.scm

@ -371,34 +371,41 @@ reducing the memory footprint."
(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

3
tests/packages.scm

@ -1037,7 +1037,8 @@
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…
Cancel
Save