~ruther/guix-local

3caab236c49012643ab46afd7e82a287ec413ee8 — Ludovic Courtès 8 years ago 147d42f
guix gc: '--verify=foo' is reported as an error.

Fixes <https://bugs.gnu.org/29761>.
Reported by Martin Castillo <castilma@uni-bremen.de>.

* guix/scripts/gc.scm (argument->verify-options): New procedure.
(%options) ["verify"]: Adjust to use it.
* tests/guix-gc.sh: Add test.
2 files changed, 24 insertions(+), 10 deletions(-)

M guix/scripts/gc.scm
M tests/guix-gc.sh
M guix/scripts/gc.scm => guix/scripts/gc.scm +21 -10
@@ 78,6 78,21 @@ Invoke the garbage collector.\n"))
  (newline)
  (show-bug-report-information))

(define argument->verify-options
  (let ((not-comma (char-set-complement (char-set #\,)))
        (validate  (lambda (option)
                     (unless (memq option '(repair contents))
                       (leave (G_ "~a: invalid '--verify' option~%")
                              option)))))
    (lambda (arg)
      "Turn ARG into a list of symbols denoting '--verify' options."
      (if arg
          (let ((lst (map string->symbol
                          (string-tokenize arg not-comma))))
            (for-each validate lst)
            lst)
          '()))))

(define %options
  ;; Specification of the command-line options.
  (list (option '(#\h "help") #f #f


@@ 112,16 127,12 @@ Invoke the garbage collector.\n"))
                  (alist-cons 'action 'optimize
                              (alist-delete 'action result))))
        (option '("verify") #f #t
                (let ((not-comma (char-set-complement (char-set #\,))))
                  (lambda (opt name arg result)
                    (let ((options (if arg
                                       (map string->symbol
                                            (string-tokenize arg not-comma))
                                       '())))
                      (alist-cons 'action 'verify
                                  (alist-cons 'verify-options options
                                              (alist-delete 'action
                                                            result)))))))
                (lambda (opt name arg result)
                  (let ((options (argument->verify-options arg)))
                    (alist-cons 'action 'verify
                                (alist-cons 'verify-options options
                                            (alist-delete 'action
                                                          result))))))
        (option '("list-dead") #f #f
                (lambda (opt name arg result)
                  (alist-cons 'action 'list-dead

M tests/guix-gc.sh => tests/guix-gc.sh +3 -0
@@ 39,6 39,9 @@ do
    if guix gc $option whatever; then false; else true; fi
done

# This should fail.
if guix gc --verify=foo; then false; else true; fi

# Check the references of a .drv.
drv="`guix build guile-bootstrap -d`"
out="`guix build guile-bootstrap`"