git-download: 'git-predicate' now ignores deleted files.
authorLudovic Courtès <ludo@gnu.org>
Fri, 28 May 2021 09:02:07 +0000 (11:02 +0200)
committerLudovic Courtès <ludo@gnu.org>
Fri, 28 May 2021 09:36:02 +0000 (11:36 +0200)
When git-predicate is used on an active worktree, some files in the
index might not exist on the filesystem.  Instead of failing with "No
such file or directory", these should be ignored.

* guix/git-download.scm (git-predicate): Wrap 'lstat' call in
'false-if-exception'.  Return RESULT when STAT is #f.

Co-authored-by: Andrew Whatson <whatson@gmail.com>
guix/git-download.scm

index 199effe..72084a2 100644 (file)
@@ -231,11 +231,13 @@ absolute file name and STAT is the result of 'lstat'."
     (lambda ()
       (let* ((files  (git-file-list directory))
              (inodes (fold (lambda (file result)
-                             (let ((stat
-                                    (lstat (string-append directory "/"
-                                                          file))))
-                               (vhash-consv (stat:ino stat) (stat:dev stat)
-                                            result)))
+                             (let* ((file (string-append directory "/" file))
+                                    (stat (false-if-exception (lstat file))))
+                               ;; Ignore FILE if it has been deleted.
+                               (if stat
+                                   (vhash-consv (stat:ino stat) (stat:dev stat)
+                                                result)
+                                   result)))
                            vlist-null
                            files)))
         (lambda (file stat)