diff options
author | Mathieu Othacehe <othacehe@gnu.org> | 2021-03-10 12:08:10 +0100 |
---|---|---|
committer | Mathieu Othacehe <othacehe@gnu.org> | 2021-03-10 13:09:23 +0100 |
commit | a831ff6bc3f92ab4ecf6135e4d6386f14189ad06 (patch) | |
tree | 5f4ae61a4dfc3a4d469ff5f7d06038388c15bbe7 /guix/inferior.scm | |
parent | 8898eaec57f6294221888e6dca1802abdd3d5868 (diff) |
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.scm | 15 |
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 |