summaryrefslogtreecommitdiff
path: root/guix
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2016-06-16 00:06:27 +0200
committerLudovic Courtès <ludo@gnu.org>2016-06-16 09:34:32 +0200
commit0687fc9cd98e38feab80e2f9c8044e77ad52c7fd (patch)
treed7e4b82bb0325a433a0d6e5123297b9459291825 /guix
parent07c8a98c3b45dca9fd36af7c4a300d3af58734dd (diff)
gexp: Add #:select? parameter to 'local-file'.
* guix/gexp.scm (<local-file>)[select?]: New field. (true): New procedure. (%local-file): Add #:select? and honor it. (local-file): Likewise. * tests/gexp.scm ("local-file, #:select?"): New test. * doc/guix.texi (G-Expressions): Adjust accordingly.
Diffstat (limited to 'guix')
-rw-r--r--guix/gexp.scm20
1 files changed, 14 insertions, 6 deletions
diff --git a/guix/gexp.scm b/guix/gexp.scm
index 8e604ff7cf..2bf1013b3c 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -189,18 +189,21 @@ cross-compiling.)"
;; absolute file name. We keep it in a promise to compute it lazily and avoid
;; repeated 'stat' calls.
(define-record-type <local-file>
- (%%local-file file absolute name recursive?)
+ (%%local-file file absolute name recursive? select?)
local-file?
(file local-file-file) ;string
(absolute %local-file-absolute-file-name) ;promise string
(name local-file-name) ;string
- (recursive? local-file-recursive?)) ;Boolean
+ (recursive? local-file-recursive?) ;Boolean
+ (select? local-file-select?)) ;string stat -> Boolean
+
+(define (true file stat) #t)
(define* (%local-file file promise #:optional (name (basename file))
- #:key recursive?)
+ #:key recursive? (select? true))
;; This intermediate procedure is part of our ABI, but the underlying
;; %%LOCAL-FILE is not.
- (%%local-file file promise name recursive?))
+ (%%local-file file promise name recursive? select?))
(define (absolute-file-name file directory)
"Return the canonical absolute file name for FILE, which lives in the
@@ -222,6 +225,10 @@ When RECURSIVE? is true, the contents of FILE are added recursively; if FILE
designates a flat file and RECURSIVE? is true, its contents are added, and its
permission bits are kept.
+When RECURSIVE? is true, call (SELECT? FILE STAT) for each directory entry,
+where FILE is the entry's absolute file name and STAT is the result of
+'lstat'; exclude entries for which SELECT? does not return true.
+
This is the declarative counterpart of the 'interned-file' monadic procedure."
(%local-file file
(delay (absolute-file-name file (current-source-directory)))
@@ -235,12 +242,13 @@ This is the declarative counterpart of the 'interned-file' monadic procedure."
(define-gexp-compiler (local-file-compiler (file local-file?) system target)
;; "Compile" FILE by adding it to the store.
(match file
- (($ <local-file> file (= force absolute) name recursive?)
+ (($ <local-file> file (= force absolute) name recursive? select?)
;; Canonicalize FILE so that if it's a symlink, it is resolved. Failing
;; to do that, when RECURSIVE? is #t, we could end up creating a dangling
;; symlink in the store, and when RECURSIVE? is #f 'add-to-store' would
;; just throw an error, both of which are inconvenient.
- (interned-file absolute name #:recursive? recursive?))))
+ (interned-file absolute name
+ #:recursive? recursive? #:select? select?))))
(define-record-type <plain-file>
(%plain-file name content references)