summaryrefslogtreecommitdiff
path: root/guix
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2013-04-12 14:35:01 +0200
committerLudovic Courtès <ludo@gnu.org>2013-04-12 21:58:47 +0200
commitc7b62db614a40c7d7dc93b7e763e3741325486df (patch)
tree078791d3394dd65cb5a9219e8c57c4b3a9479e25 /guix
parent6f80c9d8f387f5b881a73cefdbbba91a40d8eec6 (diff)
downloadguix-patches-c7b62db614a40c7d7dc93b7e763e3741325486df.tar
guix-patches-c7b62db614a40c7d7dc93b7e763e3741325486df.tar.gz
nar: Add support for symlinks.
* guix/nar.scm (write-file): Add case for type `symlink'. (restore-file): Likewise. * tests/nar.scm (random-file-size, make-file-tree, delete-file-tree, with-file-tree, file-tree-equal?, make-random-bytevector, populate-file): New procedures. (%test-dir): New variable. ("write-file + restore-file"): Use `%test-dir' and `file-tree-equal?'. ("write-file + restore-file with symlinks"): New test.
Diffstat (limited to 'guix')
-rw-r--r--guix/nar.scm23
1 files changed, 20 insertions, 3 deletions
diff --git a/guix/nar.scm b/guix/nar.scm
index 9ae76ff2a9..29b57dc989 100644
--- a/guix/nar.scm
+++ b/guix/nar.scm
@@ -161,6 +161,11 @@ sub-directories of FILE as needed."
(dump f)
(write-string ")" p)))
entries)))
+ ((symlink)
+ (write-string "type" p)
+ (write-string "symlink" p)
+ (write-string "target" p)
+ (write-string (readlink f) p))
(else
(raise (condition (&message (message "ENOSYS"))
(&nar-error)))))
@@ -178,14 +183,26 @@ Restore it as FILE."
(file #f))))))
(let restore ((file file))
+ (define (read-eof-marker)
+ (match (read-string port)
+ (")" #t)
+ (x (raise
+ (condition
+ (&message (message "invalid nar end-of-file marker"))
+ (&nar-read-error (port port) (file file) (token x)))))))
+
(match (list (read-string port) (read-string port) (read-string port))
(("(" "type" "regular")
(call-with-output-file file (cut read-contents port <>))
- (match (read-string port)
- (")" #t)
+ (read-eof-marker))
+ (("(" "type" "symlink")
+ (match (list (read-string port) (read-string port))
+ (("target" target)
+ (symlink target file)
+ (read-eof-marker))
(x (raise
(condition
- (&message (message "invalid nar end-of-file marker"))
+ (&message (message "invalid symlink tokens"))
(&nar-read-error (port port) (file file) (token x)))))))
(("(" "type" "directory")
(let ((dir file))