pack: Allow multiple '--manifest' options.

* guix/scripts/pack.scm (guix-pack): Collect 'manifest' options, and
concatenate the resulting manifests.
* tests/guix-pack.sh: Test it.
* doc/guix.texi (Invoking guix pack): Document it.
This commit is contained in:
Ludovic Courtès 2019-11-20 12:13:32 +01:00
parent bf9206d8ed
commit ca541f9ce6
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
3 changed files with 25 additions and 6 deletions

View file

@ -5178,7 +5178,8 @@ build} (@pxref{Additional Build Options, @code{--expression} in
@item --manifest=@var{file}
@itemx -m @var{file}
Use the packages contained in the manifest object returned by the Scheme
code in @var{file}.
code in @var{file}. This option can be repeated several times, in which
case the manifests are concatenated.
This has a similar purpose as the same-named option in @command{guix
package} (@pxref{profile-manifest, @option{--manifest}}) and uses the

View file

@ -965,7 +965,10 @@ (define (manifest-from-args store opts)
(list (transform store package) "out")))
(reverse
(filter-map maybe-package-argument opts))))
(manifest-file (assoc-ref opts 'manifest)))
(manifests (filter-map (match-lambda
(('manifest . file) file)
(_ #f))
opts)))
(define properties
(if (assoc-ref opts 'save-provenance?)
(lambda (package)
@ -979,11 +982,15 @@ (define properties
(const '())))
(cond
((and manifest-file (not (null? packages)))
((and (not (null? manifests)) (not (null? packages)))
(leave (G_ "both a manifest and a package list were given~%")))
(manifest-file
(let ((user-module (make-user-module '((guix profiles) (gnu)))))
(load* manifest-file user-module)))
((not (null? manifests))
(concatenate-manifests
(map (lambda (file)
(let ((user-module (make-user-module
'((guix profiles) (gnu)))))
(load* file user-module)))
manifests)))
(else
(manifest
(map (match-lambda

View file

@ -109,3 +109,14 @@ drv1="`guix pack -n guile 2>&1 | grep pack.*\.drv`"
drv2="`guix pack -n --with-source=guile=$test_directory guile 2>&1 | grep pack.*\.drv`"
test -n "$drv1"
test "$drv1" != "$drv2"
# Try '--manifest' options.
cat > "$test_directory/manifest1.scm" <<EOF
(specifications->manifest '("guile"))
EOF
cat > "$test_directory/manifest2.scm" <<EOF
(specifications->manifest '("emacs"))
EOF
drv="`guix pack -nd -m "$test_directory/manifest1.scm" -m "$test_directory/manifest2.scm"`"
guix gc -R "$drv" | grep `guix build guile -nd`
guix gc -R "$drv" | grep `guix build emacs -nd`