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)
#:export (guix-environment))
(define (for-each-search-path proc inputs derivations pure?)
"Apply PROC for each native search path in INPUTS in addition to 'PATH'.
Use the output paths of DERIVATIONS to build each search path. When PURE? is
#t, the existing search path value is ignored. Otherwise, the existing search
path value is appended."
(define (evaluate-input-search-paths inputs derivations)
"Evaluate the native search paths of INPUTS, a list of packages, of the
outputs of DERIVATIONS, and return a list of search-path/value pairs."
(let ((directories (append-map (lambda (drv)
(map (match-lambda
((_ . output)
@ -51,14 +49,7 @@ path value is appended."
(delete-duplicates
(append-map package-native-search-paths
inputs)))))
(for-each (match-lambda
((($ <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))))
(evaluate-search-paths paths directories)))
;; Protect some env vars from purification. Borrowed from nix-shell.
(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,
augment existing enviroment variables with additional search paths."
(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?)
"Display the needed search paths to build an environment that contains the
packages within INPUTS. When PURE? is #t, do not augment existing environment
variables with additional search paths."
(for-each-search-path (lambda (variable value)
(format #t "export ~a=\"~a\"~%" variable value))
inputs derivations pure?))
(for-each (match-lambda
((search-path . value)
(display
(search-path-definition search-path value
#:kind (if pure? 'exact 'prefix)))
(newline)))
(evaluate-input-search-paths inputs derivations)))
(define (show-help)
(display (_ "Usage: guix environment [OPTION]... PACKAGE...

@ -36,7 +36,8 @@
search-path-specification->sexp
sexp->search-path-specification
evaluate-search-paths
environment-variable-definition))
environment-variable-definition
search-path-definition))
;;; Commentary:
;;;
@ -160,7 +161,7 @@ report only settings not already effective."
#:key
(kind 'exact)
(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),
'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\""
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