summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Thompson <davet@gnu.org>2015-06-24 21:16:11 -0400
committerDavid Thompson <dthompson2@worcester.edu>2015-07-07 18:47:25 -0400
commitdb6e5e2b2c63c6b6dab2601656928e25f501cadf (patch)
tree4bb951c2b492d16fc21d63a3da0cd4186004bb36
parentb4abdeb63b4e29f89a0a8e54f7b442bb31da87c9 (diff)
downloadguix-db6e5e2b2c63c6b6dab2601656928e25f501cadf.tar.gz
utils: Add call-with-temporary-directory.
* guix/utils.scm (call-with-temporary-directory): New procedure.
-rw-r--r--guix/utils.scm16
1 files changed, 15 insertions, 1 deletions
diff --git a/guix/utils.scm b/guix/utils.scm
index a2ade2bf97..44913c6159 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -30,7 +30,7 @@
   #:use-module (rnrs bytevectors)
   #:use-module ((rnrs io ports) #:select (put-bytevector))
   #:use-module ((guix build utils) #:select (dump-port))
-  #:use-module ((guix build syscalls) #:select (errno))
+  #:use-module ((guix build syscalls) #:select (errno mkdtemp!))
   #:use-module (ice-9 vlist)
   #:use-module (ice-9 format)
   #:autoload   (ice-9 popen)  (open-pipe*)
@@ -77,6 +77,7 @@
             file-extension
             file-sans-extension
             call-with-temporary-output-file
+            call-with-temporary-directory
             with-atomic-file-output
             fold2
             fold-tree
@@ -652,6 +653,19 @@ call."
         (false-if-exception (close out))
         (false-if-exception (delete-file template))))))
 
+(define (call-with-temporary-directory proc)
+  "Call PROC with a name of a temporary directory; close the directory and
+delete it when leaving the dynamic extent of this call."
+  (let* ((directory (or (getenv "TMPDIR") "/tmp"))
+         (template  (string-append directory "/guix-directory.XXXXXX"))
+         (tmp-dir   (mkdtemp! template)))
+    (dynamic-wind
+      (const #t)
+      (lambda ()
+        (proc tmp-dir))
+      (lambda ()
+        (false-if-exception (rmdir tmp-dir))))))
+
 (define (with-atomic-file-output file proc)
   "Call PROC with an output port for the file that is going to replace FILE.
 Upon success, FILE is atomically replaced by what has been written to the