environment: Move iteration outside of 'for-each-search-path'.

* guix/search-paths.scm (search-path-definition): New procedure.
* guix/scripts/environment.scm (for-each-search-path): Rename to...
  (evaluate-input-search-paths): ... this.  Remove 'proc' and 'pure?'
  parameters, and return directly the list of search-path/value pairs.
  (create-environment): Use 'for-each' and 'evaluate-input-search-paths'
  instead of 'for-each-search-path'.
  (show-search-paths): Use 'for-each', 'search-path-definition', and
  'evaluate-search-paths' instead of 'for-each-search-path'.
This commit is contained in:
Ludovic Courtès 2015-05-05 15:02:35 +02:00
parent b9ea6c6bf4
commit 8e3a3bc290
2 changed files with 32 additions and 19 deletions

@ -36,11 +36,9 @@
#:use-module (srfi srfi-98) #:use-module (srfi srfi-98)
#:export (guix-environment)) #:export (guix-environment))
(define (for-each-search-path proc inputs derivations pure?) (define (evaluate-input-search-paths inputs derivations)
"Apply PROC for each native search path in INPUTS in addition to 'PATH'. "Evaluate the native search paths of INPUTS, a list of packages, of the
Use the output paths of DERIVATIONS to build each search path. When PURE? is outputs of DERIVATIONS, and return a list of search-path/value pairs."
#t, the existing search path value is ignored. Otherwise, the existing search
path value is appended."
(let ((directories (append-map (lambda (drv) (let ((directories (append-map (lambda (drv)
(map (match-lambda (map (match-lambda
((_ . output) ((_ . output)
@ -51,14 +49,7 @@ path value is appended."
(delete-duplicates (delete-duplicates
(append-map package-native-search-paths (append-map package-native-search-paths
inputs))))) inputs)))))
(for-each (match-lambda (evaluate-search-paths paths directories)))
((($ <search-path-specification> variable _ sep) . value)
(let ((current (getenv variable)))
(proc variable
(if (and current (not pure?))
(string-append value sep current)
value)))))
(evaluate-search-paths paths directories))))
;; Protect some env vars from purification. Borrowed from nix-shell. ;; Protect some env vars from purification. Borrowed from nix-shell.
(define %precious-variables (define %precious-variables
@ -78,15 +69,26 @@ as 'HOME' and 'USER' are left untouched."
PURE? is #t, unset the variables in the current environment. Otherwise, PURE? is #t, unset the variables in the current environment. Otherwise,
augment existing enviroment variables with additional search paths." augment existing enviroment variables with additional search paths."
(when pure? (purify-environment)) (when pure? (purify-environment))
(for-each-search-path setenv inputs derivations pure?)) (for-each (match-lambda
((($ <search-path-specification> variable _ separator) . value)
(let ((current (getenv variable)))
(setenv variable
(if (and current (not pure?))
(string-append value separator current)
value)))))
(evaluate-input-search-paths inputs derivations)))
(define (show-search-paths inputs derivations pure?) (define (show-search-paths inputs derivations pure?)
"Display the needed search paths to build an environment that contains the "Display the needed search paths to build an environment that contains the
packages within INPUTS. When PURE? is #t, do not augment existing environment packages within INPUTS. When PURE? is #t, do not augment existing environment
variables with additional search paths." variables with additional search paths."
(for-each-search-path (lambda (variable value) (for-each (match-lambda
(format #t "export ~a=\"~a\"~%" variable value)) ((search-path . value)
inputs derivations pure?)) (display
(search-path-definition search-path value
#:kind (if pure? 'exact 'prefix)))
(newline)))
(evaluate-input-search-paths inputs derivations)))
(define (show-help) (define (show-help)
(display (_ "Usage: guix environment [OPTION]... PACKAGE... (display (_ "Usage: guix environment [OPTION]... PACKAGE...

@ -36,7 +36,8 @@
search-path-specification->sexp search-path-specification->sexp
sexp->search-path-specification sexp->search-path-specification
evaluate-search-paths evaluate-search-paths
environment-variable-definition)) environment-variable-definition
search-path-definition))
;;; Commentary: ;;; Commentary:
;;; ;;;
@ -160,7 +161,7 @@ report only settings not already effective."
#:key #:key
(kind 'exact) (kind 'exact)
(separator ":")) (separator ":"))
"Return a the definition of VARIABLE to VALUE in Bash syntax: "Return a the definition of VARIABLE to VALUE in Bash syntax.
KIND can be either 'exact (return the definition of VARIABLE=VALUE), KIND can be either 'exact (return the definition of VARIABLE=VALUE),
'prefix (return the definition where VALUE is added as a prefix to VARIABLE's 'prefix (return the definition where VALUE is added as a prefix to VARIABLE's
@ -178,4 +179,14 @@ prefix/suffix."
(format #f "export ~a=\"$~a${~a:+~a}~a\"" (format #f "export ~a=\"$~a${~a:+~a}~a\""
variable variable variable separator value)))) variable variable variable separator value))))
(define* (search-path-definition search-path value
#:key (kind 'exact))
"Similar to 'environment-variable-definition', but applied to a
<search-path-specification>."
(match search-path
(($ <search-path-specification> variable _ separator)
(environment-variable-definition variable value
#:kind kind
#:separator separator))))
;;; search-paths.scm ends here ;;; search-paths.scm ends here