aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorBozhidar Batsov <bozhidar@batsov.dev>2026-04-26 14:17:14 +0300
committerGitHub <noreply@github.com>2026-04-26 14:17:14 +0300
commitfa890caa2b21af3895b302e22e1d74df8ee55453 (patch)
treee95dbc900ac0a8777547256e6294e7fcea2e84ab /test
parent334c7335203063ee87d260cd34566543ad2f2b4a (diff)
parentca5c96f6ed9d203f22f6d41a862449480dc46aec (diff)
Merge pull request #1999 from bbatsov/indexing-perf
Speed up indexing's ignore filtering
Diffstat (limited to 'test')
-rw-r--r--test/projectile-test.el108
1 files changed, 107 insertions, 1 deletions
diff --git a/test/projectile-test.el b/test/projectile-test.el
index 3ef1eaa..02d65ba 100644
--- a/test/projectile-test.el
+++ b/test/projectile-test.el
@@ -1086,7 +1086,113 @@ Just delegates OPERATION and ARGS for all operations except for`shell-command`'.
(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))))))))
+ (set-file-modes unreadable-dir #o755)))))))
+ (it "honors dirconfig glob ignore patterns at every level"
+ (projectile-test-with-sandbox
+ (projectile-test-with-files
+ ("project/"
+ "project/.projectile"
+ "project/keep.el"
+ "project/skip.elc"
+ "project/src/"
+ "project/src/keep.el"
+ "project/src/skip.elc")
+ (let* ((project-dir (file-name-as-directory (expand-file-name "project")))
+ (progress-reporter (make-progress-reporter "Indexing...")))
+ (with-temp-file (expand-file-name ".projectile" project-dir)
+ (insert "-*.elc\n"))
+ (spy-on 'projectile-project-root :and-return-value project-dir)
+ (let ((files (projectile-index-directory project-dir
+ (projectile-filtering-patterns)
+ progress-reporter)))
+ (expect (cl-some (lambda (f) (string-match-p "/keep.el\\'" f)) files)
+ :to-be-truthy)
+ (expect (cl-some (lambda (f) (string-match-p "/src/keep.el\\'" f)) files)
+ :to-be-truthy)
+ (expect (cl-some (lambda (f) (string-match-p "skip\\.elc\\'" f)) files)
+ :not :to-be-truthy))))))
+ (it "honors dirconfig ensure entries that override an ignore pattern"
+ (projectile-test-with-sandbox
+ (projectile-test-with-files
+ ("project/"
+ "project/.projectile"
+ "project/keep.elc"
+ "project/skip.elc")
+ (let* ((project-dir (file-name-as-directory (expand-file-name "project")))
+ (progress-reporter (make-progress-reporter "Indexing...")))
+ (with-temp-file (expand-file-name ".projectile" project-dir)
+ (insert "-*.elc\n!keep.elc\n"))
+ (spy-on 'projectile-project-root :and-return-value project-dir)
+ (let ((files (projectile-index-directory project-dir
+ (projectile-filtering-patterns)
+ progress-reporter)))
+ (expect (cl-some (lambda (f) (string-match-p "/keep\\.elc\\'" f)) files)
+ :to-be-truthy)
+ (expect (cl-some (lambda (f) (string-match-p "skip\\.elc\\'" f)) files)
+ :not :to-be-truthy)))))))
+
+(describe "projectile--list->set"
+ (it "puts all elements as keys with value t and tests with equal"
+ (let ((set (projectile--list->set '("a" "b/" "c"))))
+ (expect (gethash "a" set) :to-be t)
+ (expect (gethash "b/" set) :to-be t)
+ (expect (gethash "missing" set) :to-be nil)))
+ (it "handles the empty list without error"
+ (let ((set (projectile--list->set nil)))
+ (expect (hash-table-count set) :to-equal 0))))
+
+(describe "projectile--ignored-file-fast-p"
+ (it "returns t for files in the pre-computed ignored-files-set"
+ (let ((rules (projectile--make-walk-rules
+ '("/r/TAGS") nil nil)))
+ (expect (projectile--ignored-file-fast-p "/r/TAGS" rules) :to-be-truthy)
+ (expect (projectile--ignored-file-fast-p "/r/keep.el" rules)
+ :not :to-be-truthy)))
+ (it "honors projectile-globally-ignored-file-suffixes"
+ (let ((rules (projectile--make-walk-rules nil nil nil))
+ (projectile-globally-ignored-file-suffixes '(".elc")))
+ (expect (projectile--ignored-file-fast-p "/r/foo.elc" rules) :to-be-truthy)
+ (expect (projectile--ignored-file-fast-p "/r/foo.el" rules)
+ :not :to-be-truthy)))
+ (it "honors projectile-global-ignore-file-patterns"
+ (let ((rules (projectile--make-walk-rules nil nil nil))
+ (projectile-global-ignore-file-patterns '("\\.min\\.js\\'")))
+ (expect (projectile--ignored-file-fast-p "/r/foo.min.js" rules) :to-be-truthy)
+ (expect (projectile--ignored-file-fast-p "/r/foo.js" rules)
+ :not :to-be-truthy))))
+
+(describe "projectile--ignored-directory-fast-p"
+ (it "matches absolute ignored-dirs entries"
+ (let ((rules (projectile--make-walk-rules
+ nil '("/r/build/") nil)))
+ (expect (projectile--ignored-directory-fast-p "/r/build/" "build" rules)
+ :to-be-truthy)))
+ (it "matches globally ignored directory basenames"
+ (let ((rules (projectile--make-walk-rules nil nil '(".git"))))
+ (expect (projectile--ignored-directory-fast-p "/r/.git/" ".git" rules)
+ :to-be-truthy)
+ (expect (projectile--ignored-directory-fast-p "/r/src/" "src" rules)
+ :not :to-be-truthy))))
+
+(describe "projectile-remove-ignored"
+ (it "drops files whose basename matches an ignored entry"
+ (spy-on 'projectile-ignored-files-rel :and-return-value '("TAGS"))
+ (spy-on 'projectile-ignored-directories-rel :and-return-value nil)
+ (expect (projectile-remove-ignored '("a/TAGS" "src/foo.el" "TAGS"))
+ :to-equal '("src/foo.el")))
+ (it "treats `*'-prefixed entries as any-segment matches"
+ (spy-on 'projectile-ignored-files-rel :and-return-value nil)
+ (spy-on 'projectile-ignored-directories-rel :and-return-value '("*node_modules/"))
+ (expect (projectile-remove-ignored
+ '("src/foo.js"
+ "node_modules/lib/index.js"
+ "vendor/node_modules/lib/index.js"))
+ :to-equal '("src/foo.js")))
+ (it "treats plain entries as path-prefix matches"
+ (spy-on 'projectile-ignored-files-rel :and-return-value nil)
+ (spy-on 'projectile-ignored-directories-rel :and-return-value '("build/"))
+ (expect (projectile-remove-ignored '("build/foo.o" "src/foo.c" "buildbot/x"))
+ :to-equal '("src/foo.c" "buildbot/x"))))
(describe "projectile-get-sub-projects-command"
(it "gets sub projects command for git"