From 31a4fffa3008ce222a4f25e5c0f8ba6bceed34a2 Mon Sep 17 00:00:00 2001 From: Pierre Neidhardt Date: Fri, 15 Jan 2021 13:54:00 +0100 Subject: [PATCH] ambrevar/file: Return NIL for files that cannot be stat'ed. For instance, Emacs unsaved buffer locks. --- .../common-lisp/source/ambrevar/file.lisp | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/.local/share/common-lisp/source/ambrevar/file.lisp b/.local/share/common-lisp/source/ambrevar/file.lisp index 0844a2a8..3e6c1bf7 100644 --- a/.local/share/common-lisp/source/ambrevar/file.lisp +++ b/.local/share/common-lisp/source/ambrevar/file.lisp @@ -83,25 +83,27 @@ This returns the directory name for directories." (uiop:parse-native-namestring path))))) (assert (or (uiop:file-exists-p native-path) (uiop:directory-exists-p native-path))) - (let ((stat (osicat-posix:stat native-path))) - ;; From Osicat's `file-permissions': - (flet ((stat-permissions (stat) - (let ((mode (osicat-posix:stat-mode stat))) - (loop for (name . value) in osicat::+permissions+ - when (plusp (logand mode value)) - collect name)))) - (make-instance 'file - :path (uiop:unix-namestring native-path) - :inode (osicat-posix:stat-ino stat) - :link-count (osicat-posix:stat-nlink stat) - :kind (osicat:file-kind native-path) ; TODO: Don't recall `stat'. - :size (osicat-posix:stat-size stat) - :user-id (osicat-posix:stat-uid stat) - :group-id (osicat-posix:stat-gid stat) - :creation-date (local-time:unix-to-timestamp (osicat-posix:stat-ctime stat)) - :modification-date (local-time:unix-to-timestamp (osicat-posix:stat-mtime stat)) - :access-date (local-time:unix-to-timestamp (osicat-posix:stat-atime stat)) - :permissions (stat-permissions stat)))))) + ;; TODO: What do we do with non-existent files (e.g. unsaved emacs buffers)? Just return nil? + (let ((stat (ignore-errors (osicat-posix:stat native-path)))) + (when stat + ;; From Osicat's `file-permissions': + (flet ((stat-permissions (stat) + (let ((mode (osicat-posix:stat-mode stat))) + (loop for (name . value) in osicat::+permissions+ + when (plusp (logand mode value)) + collect name)))) + (make-instance 'file + :path (uiop:unix-namestring native-path) + :inode (osicat-posix:stat-ino stat) + :link-count (osicat-posix:stat-nlink stat) + :kind (osicat:file-kind native-path) ; TODO: Don't recall `stat'. + :size (osicat-posix:stat-size stat) + :user-id (osicat-posix:stat-uid stat) + :group-id (osicat-posix:stat-gid stat) + :creation-date (local-time:unix-to-timestamp (osicat-posix:stat-ctime stat)) + :modification-date (local-time:unix-to-timestamp (osicat-posix:stat-mtime stat)) + :access-date (local-time:unix-to-timestamp (osicat-posix:stat-atime stat)) + :permissions (stat-permissions stat))))))) (export-always '*finder-include-directories*) (defvar *finder-include-directories* t