diff options
author | Ludovic Courtès <ludo@gnu.org> | 2012-12-12 00:01:17 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2012-12-12 00:01:17 +0100 |
commit | 1c67d639d5497cdae5bf7a6ececdd789e8537a01 (patch) | |
tree | def17e40cb40bd9b18c3949aa44f3a93691eb9b9 | |
parent | a09ec3a5af3eb38b31d4eff0f323a2c47b82c114 (diff) | |
download | patches-1c67d639d5497cdae5bf7a6ececdd789e8537a01.tar patches-1c67d639d5497cdae5bf7a6ececdd789e8537a01.tar.gz |
guix-package: Gracefully handle multiple installs of the same path.
* guix-package.in (guix-package)[process-actions]: Compute PACKAGES such
that packages listed in INSTALL* are first removed from the remainder
of the list. When PROF is equal to the previous profile's store path,
do nothing. Reported by Andreas Enge <andreas@enge.fr>.
* tests/guix-package.sh: Test the behavior of installing the same store
path twice. When removing a package, omit its version number.
-rw-r--r-- | guix-package.in | 31 | ||||
-rw-r--r-- | tests/guix-package.sh | 8 |
2 files changed, 28 insertions, 11 deletions
diff --git a/guix-package.in b/guix-package.in index dab58719c3..7bc32f851b 100644 --- a/guix-package.in +++ b/guix-package.in @@ -359,10 +359,15 @@ Report bugs to: ~a.~%") "@PACKAGE_BUGREPORT@")) (_ #f)) opts)) (packages (append install* - (fold alist-delete - (manifest-packages - (profile-manifest profile)) - remove)))) + (fold (lambda (package result) + (match package + ((name _ ...) + (alist-delete name result)))) + (fold alist-delete + (manifest-packages + (profile-manifest profile)) + remove) + install*)))) (show-what-to-build drv dry-run?) @@ -370,16 +375,22 @@ Report bugs to: ~a.~%") "@PACKAGE_BUGREPORT@")) (and (build-derivations %store drv) (let* ((prof-drv (profile-derivation %store packages)) (prof (derivation-path->output-path prof-drv)) + (old-drv (profile-derivation + %store (manifest-packages + (profile-manifest profile)))) + (old-prof (derivation-path->output-path old-drv)) (number (latest-profile-number profile)) (name (format #f "~a/~a-~a-link" (dirname profile) (basename profile) (+ 1 number)))) - (and (build-derivations %store (list prof-drv)) - (begin - (symlink prof name) - (when (file-exists? profile) - (delete-file profile)) - (symlink name profile)))))))) + (if (string=? old-prof prof) + (format (current-error-port) (_ "nothing to be done~%")) + (and (build-derivations %store (list prof-drv)) + (begin + (symlink prof name) + (when (file-exists? profile) + (delete-file profile)) + (symlink name profile))))))))) (define (process-query opts) ;; Process any query specified by OPTS. Return #t when a query was diff --git a/tests/guix-package.sh b/tests/guix-package.sh index 2bc8c573ec..83108601cf 100644 --- a/tests/guix-package.sh +++ b/tests/guix-package.sh @@ -30,6 +30,12 @@ guix-package -b -p "$profile" \ test -L "$profile" && test -L "$profile-1-link" test -f "$profile/bin/guile" +# Installing the same package a second time does nothing. +guix-package -b -p "$profile" \ + -i `guix-build -e '(@@ (distro packages base) %bootstrap-guile)'` +test -L "$profile" && test -L "$profile-1-link" +! test -f "$profile-2-link" +test -f "$profile/bin/guile" guix-package -b -p "$profile" \ -i `guix-build -e '(@@ (distro packages base) gnu-make-boot0)'` @@ -53,7 +59,7 @@ esac test "`guix-package -p "$profile" -I 'g.*e' | cut -f1`" = "guile-bootstrap" # Remove a package. -guix-package -b -p "$profile" -r "guile-bootstrap-2.0" +guix-package -b -p "$profile" -r "guile-bootstrap" test -L "$profile-3-link" test -f "$profile/bin/make" && ! test -f "$profile/bin/guile" |