~ruther/guix-local

aa92cf980cab9f085df11c79c4b27d2b8b0d88aa — Ludovic Courtès 13 years ago 0f5378e
guix-package: Gracefully report non-existing outputs.

* guix-package.in (guix-package)[find-package](ensure-output): New
  procedure. Use it to validate SUB-DRV.
2 files changed, 19 insertions(+), 3 deletions(-)

M guix-package.in
M tests/guix-package.sh
M guix-package.in => guix-package.in +10 -2
@@ 402,6 402,14 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n"))
    ;; sub-derivation name.
    (define request name)

    (define (ensure-output p sub-drv)
      (if (member sub-drv (package-outputs p))
          p
          (leave (_ "~a: error: package `~a' lacks output `~a'~%")
                 (location->string (package-location p))
                 (package-full-name p)
                 sub-drv)))

    (let*-values (((name sub-drv)
                   (match (string-rindex name #\:)
                     (#f    (values name "out"))


@@ 411,7 419,7 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n"))
                   (package-name->name+version name)))
      (match (find-packages-by-name name version)
        ((p)
         (list name (package-version p) sub-drv p))
         (list name (package-version p) sub-drv (ensure-output p sub-drv)))
        ((p p* ...)
         (format (current-error-port)
                 (_ "warning: ambiguous package specification `~a'~%")


@@ 420,7 428,7 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n"))
                 (_ "warning: choosing ~a from ~a~%")
                 (package-full-name p)
                 (location->string (package-location p)))
         (list name (package-version p) sub-drv p))
         (list name (package-version p) sub-drv (ensure-output p sub-drv)))
        (()
         (leave (_ "~a: package not found~%") request)))))


M tests/guix-package.sh => tests/guix-package.sh +9 -1
@@ 120,6 120,13 @@ fi
# Make sure the `:' syntax works.
guix-package --bootstrap -i "binutils:lib" -p "$profile" -n

# Make sure nonexistent outputs are reported.
guix-package --bootstrap -i "guile-bootstrap:out" -p "$profile" -n
if guix-package --bootstrap -i "guile-bootstrap:does-not-exist" -p "$profile" -n;
then false; else true; fi
if guix-package --bootstrap -i "guile-bootstrap:does-not-exist" -p "$profile";
then false; else true; fi

# Check whether `--list-available' returns something sensible.
guix-package -A 'gui.*e' | grep guile



@@ 161,4 168,5 @@ do
done

# Extraneous argument.
! guix-package install foo-bar
if guix-package install foo-bar;
then false; else true; fi