From 3ad2008c98d861f8d8f99844d42569a1ee951c50 Mon Sep 17 00:00:00 2001 From: ax487 Date: Thu, 10 Dec 2020 10:25:09 +0100 Subject: [Fix #1250] Respect projectile-globally-ignored-directories when using native indexing (#1461) --- CHANGELOG.md | 1 + projectile.el | 58 +++++++++++++++++++++++++++++++------------------ test/projectile-test.el | 17 ++++++++++++++- 3 files changed, 54 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae9a9cf..fa9da39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ ### Bugs fixed +* [#1250](https://github.com/bbatsov/projectile/issues/1250): `projectile-globally-ignored-directories` not working with native indexing. * [#1438](https://github.com/bbatsov/projectile/pull/1438): Make sure `projectile-files-via-ext-command` returns files not errors. * [#1450](https://github.com/bbatsov/projectile/pull/1450): Call `switch-project-action` within project's temp buffer. * [#1340](https://github.com/bbatsov/projectile/pull/1340): Fix remote projects being removed if TRAMP can't connect. diff --git a/projectile.el b/projectile.el index cefc4af..4d47d35 100644 --- a/projectile.el +++ b/projectile.el @@ -1217,7 +1217,7 @@ Files are returned as relative paths to DIRECTORY." (projectile-index-directory directory (projectile-filtering-patterns) progress-reporter)))) -(defun projectile-index-directory (directory patterns progress-reporter &optional ignored-files ignored-directories) +(defun projectile-index-directory (directory patterns progress-reporter &optional ignored-files ignored-directories globally-ignored-directories) "Index DIRECTORY taking into account PATTERNS. The function calls itself recursively until all sub-directories @@ -1227,22 +1227,24 @@ IGNORED-DIRECTORIES may optionally be provided." ;; we compute the ignored files and directories only once and then we reuse the ;; pre-computed values in the subsequent recursive invocations of the function (let ((ignored-files (or ignored-files (projectile-ignored-files))) - (ignored-directories (or ignored-directories (projectile-ignored-directories)))) + (ignored-directories (or ignored-directories (projectile-ignored-directories))) + (globally-ignored-directories (or globally-ignored-directories (projectile-globally-ignored-directory-names)))) (apply #'append (mapcar (lambda (f) - (unless (or (and patterns (projectile-ignored-rel-p f directory patterns)) - (member (file-name-nondirectory (directory-file-name f)) - '("." ".." ".svn" ".cvs"))) - (progress-reporter-update progress-reporter) - (if (file-directory-p f) - (unless (projectile-ignored-directory-p - (file-name-as-directory f) - ignored-directories) - (projectile-index-directory - f patterns progress-reporter ignored-files ignored-directories)) - (unless (projectile-ignored-file-p f ignored-files) - (list f))))) + (let ((local-f (file-name-nondirectory (directory-file-name f)))) + (unless (or (and patterns (projectile-ignored-rel-p f directory patterns)) + (member local-f '("." ".."))) + (progress-reporter-update progress-reporter) + (if (file-directory-p f) + (unless (projectile-ignored-directory-p + (file-name-as-directory f) + ignored-directories + local-f + globally-ignored-directories) + (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))))) ;;; Alien Project Indexing @@ -1635,15 +1637,23 @@ projectile project root." (mapcar (lambda (f) (file-relative-name f project-root)) files))) (defun projectile-ignored-directory-p - (directory &optional ignored-directories) + (directory &optional ignored-directories local-directory globally-ignored-directories) "Check if DIRECTORY should be ignored. -Regular expressions can be used. A pre-computed list of -IGNORED-DIRECTORIES may optionally be provided." - (cl-some - (lambda (name) - (string-match-p name directory)) - (or ignored-directories (projectile-ignored-directories)))) +Regular expressions can be used. Pre-computed lists of +IGNORED-DIRECTORIES and GLOBALLY-IGNORED-DIRECTORIES +and the LOCAL-DIRECTORY name may optionally be provided." + (let ((ignored-directories (or ignored-directories (projectile-ignored-directories))) + (globally-ignored-directories (or globally-ignored-directories (projectile-globally-ignored-directory-names))) + (local-directory (or local-directory (file-name-nondirectory (directory-file-name directory))))) + (or (cl-some + (lambda (name) + (string-match-p name directory)) + ignored-directories) + (cl-some + (lambda (name) + (string-match-p name local-directory)) + globally-ignored-directories)))) (defun projectile-ignored-file-p (file &optional ignored-files) "Check if FILE should be ignored. @@ -1682,6 +1692,12 @@ according to PATTERNS: (ignored . unignored)" (projectile-project-ignored-files))) (projectile-unignored-files))) +(defun projectile-globally-ignored-directory-names () + "Return list of ignored directory names." + (projectile-difference + projectile-globally-ignored-directories + projectile-globally-unignored-directories)) + (defun projectile-ignored-directories () "Return list of ignored directories." (projectile-difference diff --git a/test/projectile-test.el b/test/projectile-test.el index c85b75a..e4baa9d 100644 --- a/test/projectile-test.el +++ b/test/projectile-test.el @@ -1545,10 +1545,25 @@ You'd normally combine this with `projectile-test-with-sandbox'." ;; verify that indexing only invokes these funcs once during recursion (spy-on 'projectile-ignored-files :and-call-through) (spy-on 'projectile-ignored-directories :and-call-through) + (spy-on 'projectile-globally-ignored-directory-names :and-call-through) (projectile-dir-files-native "projectA/") (expect 'projectile-ignored-files :to-have-been-called-times 1) - (expect 'projectile-ignored-directories :to-have-been-called-times 1))))) + (expect 'projectile-globally-ignored-directory-names :to-have-been-called-times 1) + (expect 'projectile-ignored-directories :to-have-been-called-times 1)))) + (it "ignores globally ignored directories when using native indexing" + (projectile-test-with-sandbox + (projectile-test-with-files + ("project/" + "project/.ignoreme/" + "project/.ignoreme/should_ignore" + "project/src/" + "project/src/.ignoreme/" + "project/src/.ignoreme/should_ignore" + "project/config.conf") + + (setq projectile-globally-ignored-directories '(".ignoreme")) + (expect (projectile-dir-files-native "project") :to-equal '("config.conf")))))) (describe "projectile-process-current-project-buffers-current" (it "expects projectile-process-current-project-buffers and -- cgit v1.0