aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBozhidar Batsov <bozhidar@toptal.com>2026-04-26 12:13:04 +0100
committerBozhidar Batsov <bozhidar@toptal.com>2026-04-26 12:13:04 +0100
commitca5c96f6ed9d203f22f6d41a862449480dc46aec (patch)
treee95dbc900ac0a8777547256e6294e7fcea2e84ab
parenta2e2a751885291ef9ec88aec7551e2b98a9b17a8 (diff)
Add tests for the indexing fast-path helpers
Cover the new internal helpers (`projectile--list->set', `projectile--ignored-file-fast-p', `projectile--ignored-directory- fast-p') and add end-to-end tests for the previously uncovered behaviour: * `projectile-index-directory' honors dirconfig glob ignore patterns at every directory level - previously only the alien-mode dirconfig warning had any test coverage for this. * Ensure (`!') entries in `.projectile' override an ignore pattern. * `projectile-remove-ignored' drops basename matches, treats `*'- prefixed ignored-dir entries as any-segment matches, and treats plain entries as path-prefix matches.
-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"