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): Mention
This commit is contained in:
		
							parent
							
								
									ce30a0eb7e
								
							
						
					
					
						commit
						bf9206d8ed
					
				
					 3 changed files with 41 additions and 25 deletions
				
			
		| 
						 | 
				
			
			@ -2830,7 +2830,8 @@ $ guix package --upgrade . --do-not-upgrade emacs
 | 
			
		|||
@cindex profile declaration
 | 
			
		||||
@cindex profile manifest
 | 
			
		||||
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
 | 
			
		||||
constructing it through a sequence of @code{--install} and similar
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -832,32 +832,17 @@ processed, #f otherwise."
 | 
			
		|||
  (unless dry-run?
 | 
			
		||||
    (delete-matching-generations store profile pattern)))
 | 
			
		||||
 | 
			
		||||
(define* (manifest-action store profile file opts
 | 
			
		||||
                          #:key dry-run?)
 | 
			
		||||
  "Change PROFILE to contain the packages specified in FILE."
 | 
			
		||||
  (let* ((user-module  (make-user-module '((guix profiles) (gnu))))
 | 
			
		||||
         (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 (load-manifest file)
 | 
			
		||||
  "Load the user-profile manifest (Scheme code) from FILE and return it."
 | 
			
		||||
  (let ((user-module (make-user-module '((guix profiles) (gnu)))))
 | 
			
		||||
    (load* file user-module)))
 | 
			
		||||
 | 
			
		||||
(define %actions
 | 
			
		||||
  ;; 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.
 | 
			
		||||
  `((roll-back? . ,roll-back-action)
 | 
			
		||||
    (switch-generation . ,switch-generation-action)
 | 
			
		||||
    (delete-generations . ,delete-generations-action)
 | 
			
		||||
    (manifest . ,manifest-action)))
 | 
			
		||||
    (delete-generations . ,delete-generations-action)))
 | 
			
		||||
 | 
			
		||||
(define (process-actions store opts)
 | 
			
		||||
  "Process any install/remove/upgrade action from OPTS."
 | 
			
		||||
| 
						 | 
				
			
			@ -896,7 +881,13 @@ processed, #f otherwise."
 | 
			
		|||
              opts)
 | 
			
		||||
 | 
			
		||||
    ;; 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
 | 
			
		||||
                                         (manifest-transaction)))
 | 
			
		||||
           (step2    (options->installable opts manifest step1))
 | 
			
		||||
| 
						 | 
				
			
			@ -904,12 +895,23 @@ processed, #f otherwise."
 | 
			
		|||
                      (inherit step2)
 | 
			
		||||
                      (install (map transform-entry
 | 
			
		||||
                                    (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)
 | 
			
		||||
 | 
			
		||||
      (unless (manifest-transaction-null? step3)
 | 
			
		||||
        (show-manifest-transaction store manifest step3
 | 
			
		||||
      (unless (manifest-transaction-null? trans)
 | 
			
		||||
        ;; 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?)
 | 
			
		||||
        (build-and-use-profile store profile new
 | 
			
		||||
                               #:allow-collisions? allow-collisions?
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -394,6 +394,19 @@ guix package -I | grep guile
 | 
			
		|||
test `guix package -I | wc -l` -eq 1
 | 
			
		||||
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.
 | 
			
		||||
cat > "$module_dir/manifest.scm"<<EOF
 | 
			
		||||
(use-modules (guix inferior))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in a new issue