Function: projectile-project-files
projectile-project-files is a byte-compiled function defined in
projectile.el.
Signature
(projectile-project-files PROJECT-ROOT)
Documentation
Return a list of files for the PROJECT-ROOT.
Source Code
;; Defined in ~/.emacs.d/elpa/projectile-20260820.1509/projectile.el
(defun projectile-project-files (project-root)
"Return a list of files for the PROJECT-ROOT."
(let (files)
;; If the cache is too stale, don't use it.
(when projectile-files-cache-expire
(let ((cache-time
(gethash project-root projectile-projects-cache-time)))
(when (or (null cache-time)
(< (+ cache-time projectile-files-cache-expire)
(projectile-time-seconds)))
(remhash project-root projectile-projects-cache)
(remhash project-root projectile-projects-cache-time))))
;; Use the cache, if requested and available.
(when projectile-enable-caching
(setq files (or (gethash project-root projectile-projects-cache)
;; load the cache from disk only if persistent cache is
;; enabled
(and (eq projectile-enable-caching 'persistent)
(projectile-load-project-cache project-root)))))
;; Calculate the list of files.
(when (null files)
(when projectile-enable-caching
(message "Indexing %s..." project-root))
(setq files
(if (eq projectile-indexing-method 'alien)
;; In alien mode the external tool does the walking. The
;; ignore rules ride along as exclusion arguments on the
;; command; dirconfig `+' keep entries ride along as
;; pathspecs (or, for a tool that can't take them, as a
;; filter over its output). Only the tools that can't
;; express the ignores need a further pass here.
(let* ((vcs (projectile-project-vcs project-root))
(dirs (projectile-get-project-directories project-root))
(subdirs (unless (equal dirs (list project-root))
(mapcar (lambda (d)
(file-relative-name d project-root))
dirs))))
(projectile--alien-apply-ignores
project-root vcs
(projectile--dir-files-alien-maybe-async project-root vcs subdirs)))
(let ((dirs (projectile-get-project-directories project-root)))
(cond
((and (eq projectile-indexing-method 'hybrid) (cdr dirs))
;; Hybrid + dirconfig `+' keep entries: batch the
;; external command into a single invocation with
;; the kept subdirectories as pathspecs, then run
;; projectile-adjust-files once over the combined
;; result. Avoids one shell-out per kept directory.
(let* ((vcs (projectile-project-vcs project-root))
(subdirs (mapcar
(lambda (d) (file-relative-name d project-root))
dirs)))
(projectile-adjust-files
project-root vcs
(projectile--dir-files-alien-maybe-async project-root vcs subdirs))))
(t
;; Native, or hybrid without keep entries: walk each
;; project directory. For native this is the only
;; implementation; for hybrid+single-dir it's
;; equivalent to the batched call above.
(mapcan
(lambda (dir)
(let ((files (projectile-dir-files dir project-root)))
;; `projectile-dir-files' already returns paths
;; relative to DIR, so when DIR is the project root
;; itself (the single-directory case - native, or
;; hybrid without keep entries) re-relativising every
;; path against PROJECT-ROOT is a no-op. Skip it
;; rather than pay a `file-relative-name' per file.
(if (string= dir project-root)
files
(mapcar (lambda (f)
(file-relative-name (concat dir f)
project-root))
files))))
dirs))))))
;; Save the cached list.
(when projectile-enable-caching
(projectile-cache-project project-root files)
;; Close the `Indexing...' notice opened above. The manual asks
;; for this pairing, and without it a long index leaves the echo
;; area claiming to still be working.
(message "Indexing %s...done" project-root)))
;;; Sorting
;;
;; Files can't be cached in sorted order as some sorting schemes
;; require dynamic data. Sorting is ignored completely when in
;; alien mode.
(if (eq projectile-indexing-method 'alien)
files
(projectile-sort-files files))))