From ce4a482983abaf7090d098cdda973139cefb56b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@gnu.org>
Date: Sun, 19 Jan 2014 23:03:43 +0100
Subject: [PATCH] store: Add 'with-store' convenience macro.

* guix/store.scm (with-store): New macro.
---
 .dir-locals.el |  1 +
 guix/store.scm | 12 ++++++++++++
 2 files changed, 13 insertions(+)

diff --git a/.dir-locals.el b/.dir-locals.el
index 87cdaae807b..03d9a4ec8db 100644
--- a/.dir-locals.el
+++ b/.dir-locals.el
@@ -18,6 +18,7 @@
    (eval . (put 'manifest-entry 'scheme-indent-function 0))
    (eval . (put 'manifest-pattern 'scheme-indent-function 0))
    (eval . (put 'substitute-keyword-arguments 'scheme-indent-function 1))
+   (eval . (put 'with-store 'scheme-indent-function 1))
    (eval . (put 'with-error-handling 'scheme-indent-function 0))
    (eval . (put 'with-mutex 'scheme-indent-function 1))
    (eval . (put 'with-atomic-file-output 'scheme-indent-function 1))
diff --git a/guix/store.scm b/guix/store.scm
index 393eee8d1bf..ede64341c5f 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -53,6 +53,7 @@ (define-module (guix store)
 
             open-connection
             close-connection
+            with-store
             set-build-options
             valid-path?
             query-path-hash
@@ -323,6 +324,17 @@ (define (close-connection server)
   "Close the connection to SERVER."
   (close (nix-server-socket server)))
 
+(define-syntax-rule (with-store store exp ...)
+  "Bind STORE to an open connection to the store and evaluate EXPs;
+automatically close the store when the dynamic extent of EXP is left."
+  (let ((store (open-connection)))
+    (dynamic-wind
+      (const #f)
+      (lambda ()
+        exp ...)
+      (lambda ()
+        (false-if-exception (close-connection store))))))
+
 (define current-build-output-port
   ;; The port where build output is sent.
   (make-parameter (current-error-port)))
-- 
GitLab