summaryrefslogtreecommitdiff
path: root/guix/inferior.scm
diff options
context:
space:
mode:
authorMathieu Othacehe <othacehe@gnu.org>2021-03-10 12:08:10 +0100
committerMathieu Othacehe <othacehe@gnu.org>2021-03-10 13:09:23 +0100
commita831ff6bc3f92ab4ecf6135e4d6386f14189ad06 (patch)
tree5f4ae61a4dfc3a4d469ff5f7d06038388c15bbe7 /guix/inferior.scm
parent8898eaec57f6294221888e6dca1802abdd3d5868 (diff)
downloadguix-patches-a831ff6bc3f92ab4ecf6135e4d6386f14189ad06.tar
guix-patches-a831ff6bc3f92ab4ecf6135e4d6386f14189ad06.tar.gz
inferior: Use a safe symlink monadic procedure.
This is a follow-up of 6ee7e3d26b8f5d2a234518cc2ab1bfeba7cd7c18. * guix/inferior.scm (cached-channel-instance): Introduce "symlink/safe" and use it instead of symlink. Remove the duplicated "file-exists?" call.
Diffstat (limited to 'guix/inferior.scm')
-rw-r--r--guix/inferior.scm15
1 files changed, 11 insertions, 4 deletions
diff --git a/guix/inferior.scm b/guix/inferior.scm
index 259be3f27d..f977f8386e 100644
--- a/guix/inferior.scm
+++ b/guix/inferior.scm
@@ -740,8 +740,16 @@ determines whether CHANNELS are authenticated."
(string-append directory "/" file))
(scandir directory base32-encoded-sha256?)))
+ (define (symlink/safe old new)
+ (catch 'system-error
+ (lambda ()
+ (symlink old new))
+ (lambda args
+ (unless (= EEXIST (system-error-errno args))
+ (apply throw args)))))
+
(define symlink*
- (lift2 symlink %store-monad))
+ (lift2 symlink/safe %store-monad))
(define add-indirect-root*
(store-lift add-indirect-root))
@@ -766,9 +774,8 @@ determines whether CHANNELS are authenticated."
(built-derivations (list profile))
;; Note: Caching is fine even when AUTHENTICATE? is false because
;; we always call 'latest-channel-instances?'.
- (unless (file-exists? cached)
- (symlink* (derivation->output-path profile) cached)
- (add-indirect-root* cached))
+ (symlink* (derivation->output-path profile) cached)
+ (add-indirect-root* cached)
(return cached))))))
(define* (inferior-for-channels channels