Function: project--vc-list-files
project--vc-list-files is a byte-compiled function defined in
project.el.gz.
Signature
(project--vc-list-files DIR BACKEND EXTRA-IGNORES)
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/project.el.gz
(defun project--vc-list-files (dir backend extra-ignores)
(defvar vc-git-use-literal-pathspecs)
(pcase backend
(`Git
(let* ((default-directory (expand-file-name (file-name-as-directory dir)))
(args '("-z"))
(vc-git-use-literal-pathspecs nil)
(include-untracked (project--value-in-dir
'project-vc-include-untracked
dir))
(submodules (project--git-submodules))
files)
(setq args (append args
'("-c" "--exclude-standard")
(and include-untracked '("-o"))))
(when extra-ignores
(setq args (append args
(cons "--"
(mapcar
(lambda (i)
(format
":(exclude,glob,top)%s"
(if (string-match "\\*\\*" i)
;; Looks like pathspec glob
;; format already.
i
(if (string-match "\\./" i)
;; ./abc -> abc
(setq i (substring i 2))
;; abc -> **/abc
(setq i (concat "**/" i))
;; FIXME: '**/abc' should also
;; match a directory with that
;; name, but doesn't (git 2.25.1).
;; Maybe we should replace
;; such entries with two.
(if (string-match "/\\'" i)
;; abc/ -> abc/**
(setq i (concat i "**"))))
i)))
extra-ignores)))))
(setq files
(delq nil
(mapcar
(lambda (file)
(unless (member file submodules)
(if project-files-relative-names
file
(concat default-directory file))))
(split-string
(with-output-to-string
(apply #'vc-git-command standard-output 0 nil "ls-files" args))
"\0" t))))
(when (project--vc-merge-submodules-p default-directory)
;; Unfortunately, 'ls-files --recurse-submodules' conflicts with '-o'.
(let ((sub-files
(mapcar
(lambda (module)
(when (file-directory-p module)
(let ((sub-files
(project--vc-list-files
(concat default-directory module)
backend
extra-ignores)))
(if project-files-relative-names
(mapcar (lambda (file)
(concat (file-name-as-directory module) file))
sub-files)
sub-files))))
submodules)))
(setq files
(apply #'nconc files sub-files))))
;; 'git ls-files' returns duplicate entries for merge conflicts.
;; XXX: Better solutions welcome, but this seems cheap enough.
(delete-consecutive-dups files)))
(`Hg
(let* ((default-directory (expand-file-name (file-name-as-directory dir)))
(include-untracked (project--value-in-dir
'project-vc-include-untracked
dir))
(args (list (concat "-mcard" (and include-untracked "u"))
"--no-status"
"-0"))
files)
(when extra-ignores
(setq args (nconc args
(mapcan
(lambda (i)
(list "--exclude" i))
extra-ignores))))
(with-temp-buffer
(apply #'vc-hg-command t 0 "." "status" args)
(setq files (split-string (buffer-string) "\0" t))
(unless project-files-relative-names
(setq files (mapcar
(lambda (s) (concat default-directory s))
files)))
files)))))