summaryrefslogtreecommitdiff
path: root/guix/derivations.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2015-03-25 09:42:45 +0100
committerLudovic Courtès <ludo@gnu.org>2015-03-25 10:46:22 +0100
commit3681db5d2c3c40f8796703325242998bbdb48403 (patch)
tree74053006d0f8614097460290efc6f50c5460d155 /guix/derivations.scm
parent1f4344574567337a7e32b97f8cb98104deb71666 (diff)
downloadgnu-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/derivations.scm')
-rw-r--r--guix/derivations.scm20
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)