emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] scratch/tsdh-vc-list-files 8992bc7 1/2: ; more on vc list-


From: Tassilo Horn
Subject: [Emacs-diffs] scratch/tsdh-vc-list-files 8992bc7 1/2: ; more on vc list-files
Date: Sun, 22 Sep 2019 05:05:24 -0400 (EDT)

branch: scratch/tsdh-vc-list-files
commit 8992bc7d1b7e7babbf2899b5c45e84b486f504e6
Author: Tassilo Horn <address@hidden>
Commit: Tassilo Horn <address@hidden>

    ; more on vc list-files
---
 lisp/progmodes/project.el |  5 +++--
 lisp/vc/vc-git.el         | 25 +++++++++++++++++++------
 lisp/vc/vc-hg.el          | 33 ++++++++++++++++++++++-----------
 lisp/vc/vc.el             | 27 +++++++++++++++++++++++----
 4 files changed, 67 insertions(+), 23 deletions(-)

diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index dab2683..b1ba00e 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -225,7 +225,7 @@ to find the list of ignores for each directory."
   :type '(repeat string)
   :safe 'listp)
 
-(defcustom project-vc-project-files-backends '(Bzr Git Hg SVN)
+(defcustom project-vc-project-files-backends '(Git Hg)
   "List of vc backends which should be used by `project-files'.
 
 For projects using a backend in this list, `project-files' will
@@ -302,7 +302,8 @@ backend implementation of `project-external-roots'.")
      (let ((backend (ignore-errors (vc-responsible-backend dir))))
        (if (and backend
                 (memq backend project-vc-project-files-backends))
-           (vc-call-backend backend 'list-files dir)
+           (vc-call-backend backend 'list-files
+                            dir t project-vc-ignores)
          (cl-call-next-method))))
    (or dirs (project-roots project))))
 
diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el
index abb5012..f8c5fd9 100644
--- a/lisp/vc/vc-git.el
+++ b/lisp/vc/vc-git.el
@@ -1709,14 +1709,27 @@ Returns nil if not possible."
 
 (declare-function cl-remove-if "cl-seq")
 
-(defun vc-git-list-files (&optional dir)
-  (let ((default-directory (or dir default-directory)))
+(defun vc-git-list-files (&optional dir
+                                    include-unregistered
+                                    extra-ignores)
+  (let ((default-directory (or dir default-directory))
+        (args '("-z")))
+    (when include-unregistered
+      (setq args (append args '("-c" "-o" "--exclude-standard"))))
+    (when extra-ignores
+      (setq args (append args
+                         (cons "--"
+                               (mapcar
+                                (lambda (i)
+                                  (format ":!:%s" i))
+                                extra-ignores)))))
     (mapcar
      #'expand-file-name
-     (cl-remove-if #'string-empty-p
-                   (split-string
-                    (vc-git--run-command-string nil "ls-files" "-z")
-                    "\0")))))
+     (cl-remove-if
+      #'string-empty-p
+      (split-string
+       (apply #'vc-git--run-command-string nil "ls-files" args)
+       "\0")))))
 
 (provide 'vc-git)
 
diff --git a/lisp/vc/vc-hg.el b/lisp/vc/vc-hg.el
index 5b3493d..a9b6485 100644
--- a/lisp/vc/vc-hg.el
+++ b/lisp/vc/vc-hg.el
@@ -1458,17 +1458,28 @@ This function differs from vc-do-command in that it 
invokes
 (defun vc-hg-root (file)
   (vc-find-root file ".hg"))
 
-(defun vc-hg-list-files (&optional dir)
-  (let ((default-directory (or dir default-directory)))
-    (mapcar
-     #'expand-file-name
-     (cl-remove-if #'string-empty-p
-                   (split-string
-                    (with-output-to-string
-                      (with-current-buffer standard-output
-                        (vc-hg-command t 0 "."
-                                       "files" "--print0")))
-                    "\0")))))
+(defun vc-hg-list-files (&optional dir
+                                   include-unregistered
+                                   extra-ignores)
+  (let ((default-directory (or dir default-directory))
+        args
+        files)
+    (when include-unregistered
+      (setq args (nconc args '("--all"))))
+    (when extra-ignores
+      (setq args (nconc args
+                        (mapcan
+                         (lambda (i)
+                           (list "--exclude" i))
+                         (copy-list extra-ignores)))))
+    (with-temp-buffer
+      (apply #'vc-hg-command t 0 "."
+             "status" args)
+      (goto-char (point-min))
+      (while (re-search-forward "^[?C]\s+\\(.*\\)$" nil t)
+        (setq files (cons (expand-file-name (match-string 1))
+                          files))))
+    (nreverse files)))
 
 (provide 'vc-hg)
 
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index c8b0488..90899d2 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -3108,13 +3108,32 @@ Invoke FUNC f ARGS on each VC-managed file f underneath 
it."
 
 
 
-(defun vc-default-list-files (_backend &optional dir)
+(defun vc--glob-pattern-to-regex (glob)
+  (replace-regexp-in-string
+   "\\?" "."
+   (replace-regexp-in-string
+    "\\*" ".*"
+    (replace-regexp-in-string "\\." "\\\\." glob))))
+
+(defun vc--any-string-match-p (str regexes)
+  (catch 'match
+    (dolist (regex regexes)
+      (when (string-match-p regex str)
+        (throw 'match t)))))
+
+(defun vc-default-list-files (_backend &optional dir
+                                       _include-unregistered
+                                       extra-ignores)
+  ;; FIXME: We collect only tracked files and ignore
+  ;; include-unregistered.
   (let* ((default-directory (or dir default-directory))
          (inhibit-message t)
          files)
-    (vc-file-tree-walk default-directory
-                       (lambda (f)
-                         (setq files (cons f files))))
+    (vc-file-tree-walk
+     default-directory
+     (lambda (f)
+       (unless (vc--any-string-match-p f extra-ignores)
+         (setq files (cons f files)))))
     files))
 
 (provide 'vc)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]