diff mbox series

[bug#54180,06/12] home: symlink-manager: Avoid extra 'lstat' call.

Message ID 20220227135342.10296-6-ludo@gnu.org
State Accepted
Headers show
Series Home: Clarify and better test symlink-manager.scm | expand

Checks

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

Commit Message

Ludovic Courtès Feb. 27, 2022, 1:53 p.m. UTC
* gnu/home/services/symlink-manager.scm (update-symlinks-script)[symlink-to-store?]:
Avoid extra 'lstat' call.
---
 gnu/home/services/symlink-manager.scm | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

Comments

M Feb. 27, 2022, 3:52 p.m. UTC | #1
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 mbox series

Patch

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)