package: Allow multiple '--manifest' options.
* guix/scripts/package.scm (manifest-action): Remove. (%actions): Remove it. (load-manifest): New procedure. (process-actions): Handle 'manifest' options. Define 'files' from 'manifest' options. Define 'manifest' based on FILES. Define 'trans' to represent the final transaction. * tests/guix-package.sh: Test it. * doc/guix.texi (Invoking guix package): Mentionmaster
parent
ce30a0eb7e
commit
bf9206d8ed
|
@ -2830,7 +2830,8 @@ $ guix package --upgrade . --do-not-upgrade emacs
|
||||||
@cindex profile declaration
|
@cindex profile declaration
|
||||||
@cindex profile manifest
|
@cindex profile manifest
|
||||||
Create a new generation of the profile from the manifest object
|
Create a new generation of the profile from the manifest object
|
||||||
returned by the Scheme code in @var{file}.
|
returned by the Scheme code in @var{file}. This option can be repeated
|
||||||
|
several times, in which case the manifests are concatenated.
|
||||||
|
|
||||||
This allows you to @emph{declare} the profile's contents rather than
|
This allows you to @emph{declare} the profile's contents rather than
|
||||||
constructing it through a sequence of @code{--install} and similar
|
constructing it through a sequence of @code{--install} and similar
|
||||||
|
|
|
@ -832,32 +832,17 @@ processed, #f otherwise."
|
||||||
(unless dry-run?
|
(unless dry-run?
|
||||||
(delete-matching-generations store profile pattern)))
|
(delete-matching-generations store profile pattern)))
|
||||||
|
|
||||||
(define* (manifest-action store profile file opts
|
(define (load-manifest file)
|
||||||
#:key dry-run?)
|
"Load the user-profile manifest (Scheme code) from FILE and return it."
|
||||||
"Change PROFILE to contain the packages specified in FILE."
|
(let ((user-module (make-user-module '((guix profiles) (gnu)))))
|
||||||
(let* ((user-module (make-user-module '((guix profiles) (gnu))))
|
(load* file user-module)))
|
||||||
(manifest (load* file user-module))
|
|
||||||
(bootstrap? (assoc-ref opts 'bootstrap?))
|
|
||||||
(substitutes? (assoc-ref opts 'substitutes?))
|
|
||||||
(allow-collisions? (assoc-ref opts 'allow-collisions?)))
|
|
||||||
(if dry-run?
|
|
||||||
(format #t (G_ "would install new manifest from '~a' with ~d entries~%")
|
|
||||||
file (length (manifest-entries manifest)))
|
|
||||||
(format #t (G_ "installing new manifest from '~a' with ~d entries~%")
|
|
||||||
file (length (manifest-entries manifest))))
|
|
||||||
(build-and-use-profile store profile manifest
|
|
||||||
#:allow-collisions? allow-collisions?
|
|
||||||
#:bootstrap? bootstrap?
|
|
||||||
#:use-substitutes? substitutes?
|
|
||||||
#:dry-run? dry-run?)))
|
|
||||||
|
|
||||||
(define %actions
|
(define %actions
|
||||||
;; List of actions that may be processed. The car of each pair is the
|
;; List of actions that may be processed. The car of each pair is the
|
||||||
;; action's symbol in the option list; the cdr is the action's procedure.
|
;; action's symbol in the option list; the cdr is the action's procedure.
|
||||||
`((roll-back? . ,roll-back-action)
|
`((roll-back? . ,roll-back-action)
|
||||||
(switch-generation . ,switch-generation-action)
|
(switch-generation . ,switch-generation-action)
|
||||||
(delete-generations . ,delete-generations-action)
|
(delete-generations . ,delete-generations-action)))
|
||||||
(manifest . ,manifest-action)))
|
|
||||||
|
|
||||||
(define (process-actions store opts)
|
(define (process-actions store opts)
|
||||||
"Process any install/remove/upgrade action from OPTS."
|
"Process any install/remove/upgrade action from OPTS."
|
||||||
|
@ -896,7 +881,13 @@ processed, #f otherwise."
|
||||||
opts)
|
opts)
|
||||||
|
|
||||||
;; Then, process normal package removal/installation/upgrade.
|
;; Then, process normal package removal/installation/upgrade.
|
||||||
(let* ((manifest (profile-manifest profile))
|
(let* ((files (filter-map (match-lambda
|
||||||
|
(('manifest . file) file)
|
||||||
|
(_ #f))
|
||||||
|
opts))
|
||||||
|
(manifest (match files
|
||||||
|
(() (profile-manifest profile))
|
||||||
|
(_ (concatenate-manifests (map load-manifest files)))))
|
||||||
(step1 (options->removable opts manifest
|
(step1 (options->removable opts manifest
|
||||||
(manifest-transaction)))
|
(manifest-transaction)))
|
||||||
(step2 (options->installable opts manifest step1))
|
(step2 (options->installable opts manifest step1))
|
||||||
|
@ -904,12 +895,23 @@ processed, #f otherwise."
|
||||||
(inherit step2)
|
(inherit step2)
|
||||||
(install (map transform-entry
|
(install (map transform-entry
|
||||||
(manifest-transaction-install step2)))))
|
(manifest-transaction-install step2)))))
|
||||||
(new (manifest-perform-transaction manifest step3)))
|
(new (manifest-perform-transaction manifest step3))
|
||||||
|
(trans (if (null? files)
|
||||||
|
step3
|
||||||
|
(fold manifest-transaction-install-entry
|
||||||
|
step3
|
||||||
|
(manifest-entries manifest)))))
|
||||||
|
|
||||||
(warn-about-old-distro)
|
(warn-about-old-distro)
|
||||||
|
|
||||||
(unless (manifest-transaction-null? step3)
|
(unless (manifest-transaction-null? trans)
|
||||||
(show-manifest-transaction store manifest step3
|
;; When '--manifest' is used, display information about TRANS as if we
|
||||||
|
;; were starting from an empty profile.
|
||||||
|
(show-manifest-transaction store
|
||||||
|
(if (null? files)
|
||||||
|
manifest
|
||||||
|
(make-manifest '()))
|
||||||
|
trans
|
||||||
#:dry-run? dry-run?)
|
#:dry-run? dry-run?)
|
||||||
(build-and-use-profile store profile new
|
(build-and-use-profile store profile new
|
||||||
#:allow-collisions? allow-collisions?
|
#:allow-collisions? allow-collisions?
|
||||||
|
|
|
@ -394,6 +394,19 @@ guix package -I | grep guile
|
||||||
test `guix package -I | wc -l` -eq 1
|
test `guix package -I | wc -l` -eq 1
|
||||||
guix package --rollback --bootstrap
|
guix package --rollback --bootstrap
|
||||||
|
|
||||||
|
# Applying two manifests.
|
||||||
|
cat > "$module_dir/manifest2.scm"<<EOF
|
||||||
|
(use-modules (gnu packages bootstrap) (guix))
|
||||||
|
(define p (package (inherit %bootstrap-guile) (name "eliug")))
|
||||||
|
(packages->manifest (list p))
|
||||||
|
EOF
|
||||||
|
guix package --bootstrap \
|
||||||
|
-m "$module_dir/manifest.scm" -m "$module_dir/manifest2.scm"
|
||||||
|
guix package -I | grep guile
|
||||||
|
guix package -I | grep eliug
|
||||||
|
test `guix package -I | wc -l` -eq 2
|
||||||
|
guix package --rollback --bootstrap
|
||||||
|
|
||||||
# Applying a manifest file with inferior packages.
|
# Applying a manifest file with inferior packages.
|
||||||
cat > "$module_dir/manifest.scm"<<EOF
|
cat > "$module_dir/manifest.scm"<<EOF
|
||||||
(use-modules (guix inferior))
|
(use-modules (guix inferior))
|
||||||
|
|
Reference in New Issue