store: 'with-store' uses 'with-exception-handler'.
authorLudovic Courtès <ludo@gnu.org>
Sat, 4 Apr 2020 21:58:05 +0000 (23:58 +0200)
committerLudovic Courtès <ludo@gnu.org>
Sat, 4 Apr 2020 22:36:44 +0000 (00:36 +0200)
This ensures the stack is not unwound before the exception is re-thrown,
as was the case since 8ed597f4a261fe188de82cd1f5daed83dba948eb, leading
to '&store-protocol-error' being uncaught by 'with-error-handling'
in (guix scripts build) & co.

* guix/store.scm (call-with-store): Define 'thunk'.  Add 'cond-expand'
to use 'with-exception-handler' on 'guile-3' and 'catch' otherwise.

guix/store.scm

index 1dd5c95..fb4b92e 100644 (file)
@@ -623,16 +623,25 @@ connection.  Use with care."
 (define (call-with-store proc)
   "Call PROC with an open store connection."
   (let ((store (open-connection)))
-    (catch #t
-      (lambda ()
-        (parameterize ((current-store-protocol-version
-                        (store-connection-version store)))
-          (let ((result (proc store)))
-            (close-connection store)
-            result)))
-      (lambda (key . args)
-        (close-connection store)
-        (apply throw key args)))))
+    (define (thunk)
+      (parameterize ((current-store-protocol-version
+                      (store-connection-version store)))
+        (let ((result (proc store)))
+          (close-connection store)
+          result)))
+
+    (cond-expand
+      (guile-3
+       (with-exception-handler (lambda (exception)
+                                 (close-connection store)
+                                 (raise-exception exception))
+         thunk))
+      (else                                       ;Guile 2.2
+       (catch #t
+         thunk
+         (lambda (key . args)
+           (close-connection store)
+           (apply throw key args)))))))
 
 (define-syntax-rule (with-store store exp ...)
   "Bind STORE to an open connection to the store and evaluate EXPs;