guix package: 'transaction-upgrade-entry' swallows build requests.

Fixes a regression introduced in
131f50cdc9 whereby the install/upgrade
message would not be displayed:

  $ guix upgrade -n
  2.1 MB would be downloaded:
     /gnu/store/…-something-1.2
     /gnu/store/…-its-dependency-2.3

This is because we'd directly abort from 'transaction-upgrade-entry' to
the build handler of 'build-notifier'.

* guix/scripts/package.scm (transaction-upgrade-entry): Call 'string=?'
expression in 'with-build-handler'.
* tests/packages.scm ("transaction-upgrade-entry, grafts"): New test.
This commit is contained in:
Ludovic Courtès 2020-03-30 22:11:54 +02:00
parent 190ddfe21e
commit a187cc5628
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
2 changed files with 35 additions and 3 deletions

View File

@ -234,11 +234,19 @@ non-zero relevance score."
transaction)
((=)
(let* ((new (package->manifest-entry* pkg output)))
;; Here we want to determine whether the NEW actually
;; differs from ENTRY, but we need to intercept
;; 'build-things' calls because they would prevent us from
;; displaying the list of packages to install/upgrade
;; upfront. Thus, if lowering NEW triggers a build (due
;; to grafts), assume NEW differs from ENTRY.
;; XXX: When there are propagated inputs, assume we need to
;; upgrade the whole entry.
(if (and (string=? (manifest-entry-item
(lower-manifest-entry* new))
(manifest-entry-item entry))
(if (and (with-build-handler (const #f)
(string=? (manifest-entry-item
(lower-manifest-entry* new))
(manifest-entry-item entry)))
(null? (package-propagated-inputs pkg)))
transaction
(manifest-transaction-install-entry

View File

@ -148,6 +148,30 @@
(string=? (manifest-pattern-version pattern) "1")
(string=? (manifest-pattern-output pattern) "out")))))))
(test-assert "transaction-upgrade-entry, grafts"
;; Ensure that, when grafts are enabled, 'transaction-upgrade-entry' doesn't
;; try to build stuff.
(with-build-handler (const 'failed!)
(parameterize ((%graft? #t))
(let* ((old (dummy-package "foo" (version "1")))
(bar (dummy-package "bar" (version "0")
(replacement old)))
(new (dummy-package "foo" (version "1")
(inputs `(("bar" ,bar)))))
(tx (mock ((gnu packages) find-best-packages-by-name
(const (list new)))
(transaction-upgrade-entry
%store
(manifest-entry
(inherit (package->manifest-entry old))
(item (string-append (%store-prefix) "/"
(make-string 32 #\e) "-foo-1")))
(manifest-transaction)))))
(and (match (manifest-transaction-install tx)
((($ <manifest-entry> "foo" "1" "out" item))
(eq? item new)))
(null? (manifest-transaction-remove tx)))))))
(test-assert "package-field-location"
(let ()
(define (goto port line column)