diff options
author | Ludovic Courtès <ludo@gnu.org> | 2015-03-25 09:42:45 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2015-03-25 10:46:22 +0100 |
commit | 3681db5d2c3c40f8796703325242998bbdb48403 (patch) | |
tree | 74053006d0f8614097460290efc6f50c5460d155 /guix | |
parent | 1f4344574567337a7e32b97f8cb98104deb71666 (diff) | |
download | gnu-guix-3681db5d2c3c40f8796703325242998bbdb48403.tar gnu-guix-3681db5d2c3c40f8796703325242998bbdb48403.tar.gz |
derivations: Add a 'cut?' parameter to 'derivation-prerequisites'.
* guix/derivations.scm (valid-derivation-input?): New procedure.
(derivation-prerequisites): Add 'cut?' parameter and honor it.
* tests/derivations.scm ("derivation-prerequisites and
derivation-input-is-valid?"): New test.
Diffstat (limited to 'guix')
-rw-r--r-- | guix/derivations.scm | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/guix/derivations.scm b/guix/derivations.scm index 9b5ee367b6..8daad4b81d 100644 --- a/guix/derivations.scm +++ b/guix/derivations.scm @@ -60,6 +60,7 @@ derivation-input-path derivation-input-sub-derivations derivation-input-output-paths + valid-derivation-input? &derivation-error derivation-error? @@ -187,12 +188,25 @@ download with a fixed hash (aka. `fetchurl')." (map (cut derivation-path->output-path path <>) sub-drvs)))) -(define (derivation-prerequisites drv) - "Return the list of derivation-inputs required to build DRV, recursively." +(define (valid-derivation-input? store input) + "Return true if INPUT is valid--i.e., if all the outputs it requests are in +the store." + (every (cut valid-path? store <>) + (derivation-input-output-paths input))) + +(define* (derivation-prerequisites drv #:optional (cut? (const #f))) + "Return the list of derivation-inputs required to build DRV, recursively. + +CUT? is a predicate that is passed a derivation-input and returns true to +eliminate the given input and its dependencies from the search. An example of +search a predicate is 'valid-derivation-input?'; when it is used as CUT?, the +result is the set of prerequisites of DRV not already in valid." (let loop ((drv drv) (result '()) (input-set (set))) - (let ((inputs (remove (cut set-contains? input-set <>) + (let ((inputs (remove (lambda (input) + (or (set-contains? input-set input) + (cut? input))) (derivation-inputs drv)))) (fold2 loop (append inputs result) |