Message ID | 20220227135342.10296-6-ludo@gnu.org |
---|---|
State | Accepted |
Headers | show |
Series | Home: Clarify and better test symlink-manager.scm | expand |
Context | Check | Description |
---|---|---|
cbaines/comparison | success | View comparision |
cbaines/git branch | success | View Git branch |
cbaines/applying patch | success | View Laminar job |
cbaines/issue | success | View issue |
Ludovic Courtès schreef op zo 27-02-2022 om 14:53 [+0100]: > (define (symlink-to-store? path) > - (and (equal? (stat:type (lstat path)) 'symlink) > - (store-file-name? (readlink path)))) > + (catch 'system-error > + (lambda () > + (store-file-name? (readlink path))) > + (lambda args > + (if (= EINVAL (system-error-errno args)) > + #f > + (apply throw args))))) I think it would be slightly clearer if 'store-file-name?' was moved outside the catch: (and=> (catch 'system-error (lambda () (readlink path)) [...]) store-file-name?) It is 'readlink' that might throw an exception, not 'store-file-name?'. Greetings, Maxime.
diff --git a/gnu/home/services/symlink-manager.scm b/gnu/home/services/symlink-manager.scm index 6b3a9de3d1..ba42424e8e 100644 --- a/gnu/home/services/symlink-manager.scm +++ b/gnu/home/services/symlink-manager.scm @@ -103,8 +103,13 @@ (define (get-backup-path path) (string-append backup-dir "/." path)) (define (symlink-to-store? path) - (and (equal? (stat:type (lstat path)) 'symlink) - (store-file-name? (readlink path)))) + (catch 'system-error + (lambda () + (store-file-name? (readlink path))) + (lambda args + (if (= EINVAL (system-error-errno args)) + #f + (apply throw args))))) (define (backup-file path) (mkdir-p backup-dir)