diff --git a/guix/ui.scm b/guix/ui.scm index 09cb6f48ff..9558d38ca8 100644 --- a/guix/ui.scm +++ b/guix/ui.scm @@ -769,7 +769,7 @@ Command-line options take precedence those passed via 'GUIX_BUILD_OPTIONS'. ARGUMENT-HANDLER is called for non-option arguments, like the 'operand-proc' parameter of 'args-fold'." - (define (parse-options-from args) + (define (parse-options-from args seeds) ;; Actual parsing takes place here. (apply args-fold* args options (lambda (opt name arg . rest) @@ -777,8 +777,12 @@ parameter of 'args-fold'." argument-handler seeds)) - (append (parse-options-from args) - (parse-options-from (environment-build-options)))) + (call-with-values + (lambda () + (parse-options-from (environment-build-options) seeds)) + (lambda seeds + ;; ARGS take precedence over what the environment variable specifies. + (parse-options-from args seeds)))) (define (show-guix-usage) (format (current-error-port) diff --git a/tests/ui.scm b/tests/ui.scm index c71fc71cc1..1478fe213e 100644 --- a/tests/ui.scm +++ b/tests/ui.scm @@ -82,6 +82,15 @@ interface, and powerful string processing.") %standard-build-options (list '())))) +(test-equal "parse-command-line and --no options" + '((argument . "foo") + (substitutes? . #f)) ;takes precedence + + (with-environment-variable "GUIX_BUILD_OPTIONS" "--no-substitutes" + (parse-command-line '("foo") + %standard-build-options + (list '((substitutes? . #t)))))) + (test-assert "fill-paragraph" (every (lambda (column) (every (lambda (width)