summaryrefslogtreecommitdiff
path: root/tissue/git.scm
diff options
context:
space:
mode:
Diffstat (limited to 'tissue/git.scm')
-rw-r--r--tissue/git.scm23
1 files changed, 22 insertions, 1 deletions
diff --git a/tissue/git.scm b/tissue/git.scm
index 562e715..653f8ae 100644
--- a/tissue/git.scm
+++ b/tissue/git.scm
@@ -47,7 +47,9 @@
git-tracked-files
call-with-file-in-git
file-modification-table
- clone-options))
+ clone-options
+ call-with-temporary-checkout
+ call-with-temporary-checkouts))
;; We bind additional functions from libgit2 that are not already
;; bound in guile-git. TODO: Contribute them to guile-git.
@@ -211,3 +213,22 @@ that modified them."
'bare
(if bare? 1 0))
clone-options))
+
+(define (call-with-temporary-checkout repository proc)
+ "Call PROC with a temporary checkout of REPOSITORY, and delete the
+checkout when PROC returns or exits non-locally."
+ (call-with-temporary-directory
+ (lambda (temporary-checkout)
+ (clone repository temporary-checkout)
+ (proc temporary-checkout))))
+
+(define (call-with-temporary-checkouts repositories proc)
+ "Call PROC with temporary checkouts of REPOSITORIES, and delete the
+checkouts when PROC returns or exits non-locally."
+ (match repositories
+ ((repository other-repositories ...)
+ (call-with-temporary-checkout repository
+ (lambda (checkout)
+ (call-with-temporary-checkouts other-repositories
+ (cut proc checkout <...>)))))
+ (() (proc))))