branch: elpa/projectile
commit 5560f083b69d40eb1a0e359fdd4ba9712f8a1bd8
Author: Bozhidar Batsov <[email protected]>
Commit: Bozhidar Batsov <[email protected]>
Skip unreadable directories in projectile-index-directory (#1873)
Wrap the directory-files call in ignore-errors so that unreadable
directories (e.g. .Spotlight-V100 on macOS) are silently skipped
instead of aborting the entire native indexing operation.
---
CHANGELOG.md | 1 +
projectile.el | 5 ++++-
test/projectile-test.el | 19 +++++++++++++++++++
3 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2af852cd38..014544af90 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,7 @@
### Bugs fixed
+* [#1873](https://github.com/bbatsov/projectile/issues/1873): Skip unreadable
directories during native indexing instead of aborting with a permission error.
* [#1961](https://github.com/bbatsov/projectile/issues/1961): Prevent
directories from matching file-type project root markers (e.g., a `workspace`
directory no longer matches the `WORKSPACE` Bazel marker on case-insensitive
filesystems).
* [#1749](https://github.com/bbatsov/projectile/issues/1749): Strip `./`
prefix from `fd` output in `projectile-files-via-ext-command`, fixing
compatibility with older `fd` versions that don't support `--strip-cwd-prefix`.
diff --git a/projectile.el b/projectile.el
index 90e2d48dfe..0acc7f40b3 100644
--- a/projectile.el
+++ b/projectile.el
@@ -1524,7 +1524,10 @@ IGNORED-DIRECTORIES may optionally be provided."
(projectile-index-directory f patterns
progress-reporter ignored-files ignored-directories
globally-ignored-directories))
(unless (projectile-ignored-file-p f ignored-files)
(list f))))))
- (directory-files directory t)))))
+ ;; Use ignore-errors to skip unreadable directories (e.g.
+ ;; .Spotlight-V100 on macOS) instead of aborting the entire
+ ;; indexing operation.
+ (ignore-errors (directory-files directory t))))))
;;; Alien Project Indexing
;;
diff --git a/test/projectile-test.el b/test/projectile-test.el
index 0880d6d40d..c658dcd10a 100644
--- a/test/projectile-test.el
+++ b/test/projectile-test.el
@@ -532,6 +532,25 @@ Just delegates OPERATION and ARGS for all operations
except for`shell-command`'.
(let ((projectile-indexing-method 'hybrid))
(expect (projectile-dir-files "/my/root/") :to-equal '("a/b/c"
"a/d/e")))))
+(describe "projectile-index-directory"
+ (it "skips unreadable directories"
+ (unless (eq system-type 'windows-nt)
+ (projectile-test-with-sandbox
+ (projectile-test-with-files
+ ("project/"
+ "project/.projectile"
+ "project/readable-file.el"
+ "project/unreadable-dir/")
+ (let* ((project-dir (file-name-as-directory (expand-file-name
"project")))
+ (unreadable-dir (expand-file-name "unreadable-dir" project-dir))
+ (progress-reporter (make-progress-reporter "Indexing...")))
+ (set-file-modes unreadable-dir #o000)
+ (unwind-protect
+ (let ((files (projectile-index-directory project-dir nil
progress-reporter)))
+ (expect (cl-some (lambda (f) (string-match-p "readable-file"
f)) files) :to-be-truthy)
+ (expect (cl-some (lambda (f) (string-match-p "unreadable-dir"
f)) files) :not :to-be-truthy))
+ (set-file-modes unreadable-dir #o755))))))))
+
(describe "projectile-get-sub-projects-command"
(it "gets sub projects command for git"
(expect (string-prefix-p "git" (projectile-get-sub-projects-command 'git))
:to-be-truthy))