profiles: 'package->manifest-entry' preserves transformations by default.

Previously, transformations applied from a manifest (rather than via
"guix install") would be lost.  This change fixes that and simplifies
things.

Reported by zimoun at
<https://lists.gnu.org/archive/html/guix-devel/2021-02/msg00153.html>.

* guix/profiles.scm (default-properties): New procedure.
(package->manifest-entry): Use it for #:properties.
* guix/scripts/pack.scm (guix-pack)[with-transformations]: Remove.
Remove caller.
* guix/scripts/package.scm (transaction-upgrade-entry): Remove calls to
'manifest-entry-with-transformations'.
* tests/guix-package.sh: Add test.
* tests/transformations.scm ("options->transformation + package->manifest-entry"):
New test.
This commit is contained in:
Ludovic Courtès 2021-03-04 10:57:46 +01:00
parent c9d42d611c
commit 90ea8b16eb
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
5 changed files with 48 additions and 23 deletions

View file

@ -362,9 +362,16 @@ (define lower-pair
#t
lst)))
(define (default-properties package)
"Return the default properties of a manifest entry for PACKAGE."
;; Preserve transformation options by default.
(match (assq-ref (package-properties package) 'transformations)
(#f '())
(transformations `((transformations . ,transformations)))))
(define* (package->manifest-entry package #:optional (output "out")
#:key (parent (delay #f))
(properties '()))
(properties (default-properties package)))
"Return a manifest entry for the OUTPUT of package PACKAGE."
;; For each dependency, keep a promise pointing to its "parent" entry.
(letrec* ((deps (map (match-lambda

View file

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015, 2017, 2018, 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2018 Konrad Hinsen <konrad.hinsen@fastmail.net>
;;; Copyright © 2018 Chris Marusich <cmmarusich@gmail.com>
@ -1170,24 +1170,19 @@ (define with-provenance
manifest))
identity))
(define (with-transformations manifest)
(map-manifest-entries manifest-entry-with-transformations
manifest))
(with-provenance
(with-transformations
(cond
((and (not (null? manifests)) (not (null? packages)))
(leave (G_ "both a manifest and a package list were given~%")))
((not (null? manifests))
(concatenate-manifests
(map (lambda (file)
(let ((user-module (make-user-module
'((guix profiles) (gnu)))))
(load* file user-module)))
manifests)))
(else
(packages->manifest packages)))))))
(cond
((and (not (null? manifests)) (not (null? packages)))
(leave (G_ "both a manifest and a package list were given~%")))
((not (null? manifests))
(concatenate-manifests
(map (lambda (file)
(let ((user-module (make-user-module
'((guix profiles) (gnu)))))
(load* file user-module)))
manifests)))
(else
(packages->manifest packages))))))
(with-error-handling
(with-store store

View file

@ -235,14 +235,12 @@ (define (upgrade entry transform)
(case (version-compare candidate-version version)
((>)
(manifest-transaction-install-entry
(manifest-entry-with-transformations
(package->manifest-entry* pkg output))
(package->manifest-entry* pkg output)
transaction))
((<)
transaction)
((=)
(let* ((new (manifest-entry-with-transformations
(package->manifest-entry* pkg output))))
(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

View file

@ -386,6 +386,21 @@ guix package -I
# '--dry-run' is passed.
GUIX_BUILD_OPTIONS="--no-grafts"
# Install using the "imperative model", export a manifest, instantiate it, and
# make sure we get the same profile.
guix package --bootstrap -i guile-bootstrap --without-tests=foo
profile_directory="$(readlink -f "$default_profile")"
guix package --export-manifest > "$tmpfile"
grep 'without-tests.*foo' "$tmpfile"
guix package --rollback --bootstrap
guix package --bootstrap -m "$tmpfile"
test "$(readlink -f "$default_profile")" = "$profile_directory"
guix package --export-manifest > "$tmpfile.2nd"
cmp "$tmpfile" "$tmpfile.2nd"
rm -f "$tmpfile.2nd"
guix package --rollback --bootstrap
# Applying a manifest file.
cat > "$module_dir/manifest.scm"<<EOF
(use-package-modules bootstrap)

View file

@ -20,6 +20,9 @@ (define-module (test-transformations)
#:use-module (guix tests)
#:use-module (guix store)
#:use-module ((guix gexp) #:select (lower-object))
#:use-module ((guix profiles)
#:select (package->manifest-entry
manifest-entry-properties))
#:use-module (guix derivations)
#:use-module (guix packages)
#:use-module (guix git-download)
@ -413,6 +416,13 @@ (define (package-name* obj)
`((with-latest . "foo")))))
(package-version (t p)))))
(test-equal "options->transformation + package->manifest-entry"
'((transformations . ((without-tests . "foo"))))
(let* ((p (dummy-package "foo"))
(t (options->transformation '((without-tests . "foo"))))
(e (package->manifest-entry (t p))))
(manifest-entry-properties e)))
(test-end)
;;; Local Variables: