emacs-diffs
[Top][All Lists]
Advanced

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

master 01a0e17 3/3: Merge from origin/emacs-27


From: Glenn Morris
Subject: master 01a0e17 3/3: Merge from origin/emacs-27
Date: Fri, 27 Dec 2019 10:55:04 -0500 (EST)

branch: master
commit 01a0e17c8015a91aef17ef52eefb788c60477a4f
Merge: 7808453 3f2788d
Author: Glenn Morris <address@hidden>
Commit: Glenn Morris <address@hidden>

    Merge from origin/emacs-27
    
    3f2788d4ac (origin/emacs-27) project--vc-list-files: Recurse into sub...
    f0da3aa83e Merge branch 'emacs-27' of git.savannah.gnu.org:/srv/git/e...
    3b199614cc Minor improvements of buffer documentation
    e1e0a7a751 xref--collect-matches: Speed up on remote
    219b91eb2c ; project--find-regexp-in-files: Avoid prepending remote-i...
---
 doc/emacs/buffers.texi    |  4 ++++
 lisp/progmodes/project.el | 53 +++++++++++++++++++++++++++++++++++++++--------
 lisp/progmodes/xref.el    |  7 +++++--
 3 files changed, 53 insertions(+), 11 deletions(-)

diff --git a/doc/emacs/buffers.texi b/doc/emacs/buffers.texi
index 7b4e070..fc2ee6f 100644
--- a/doc/emacs/buffers.texi
+++ b/doc/emacs/buffers.texi
@@ -13,6 +13,10 @@ the directory listing.  If you send a message with @kbd{C-x 
m}, a
 buffer is used to hold the text of the message.  When you ask for a
 command's documentation, that appears in a buffer named @file{*Help*}.
 
+  Buffers exist as long as they are in use, and are deleted
+(``killed'') when no longer needed, either by you (@pxref{Kill
+Buffer}) or by Emacs (e.g., when you exit Emacs, @pxref{Exiting}).
+
   Each buffer has a unique name, which can be of any length.  When a
 buffer is displayed in a window, its name is shown in the mode line
 (@pxref{Mode Line}).  The distinction between upper and lower case
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index e21600f..74c2bf9 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -262,8 +262,15 @@ backend implementation of `project-external-roots'.")
 
 (defun project-try-vc (dir)
   (let* ((backend (ignore-errors (vc-responsible-backend dir)))
-         (root (and backend (ignore-errors
-                              (vc-call-backend backend 'root dir)))))
+         (root
+          (pcase backend
+            ('Git
+             ;; Don't stop at submodule boundary.
+             (or (vc-file-getprop dir 'project-git-root)
+                 (vc-file-setprop dir 'project-git-root
+                                  (vc-find-root dir ".git/"))))
+            ('nil nil)
+            (_ (ignore-errors (vc-call-backend backend 'root dir))))))
     (and root (cons 'vc root))))
 
 (cl-defmethod project-roots ((project (head vc)))
@@ -303,7 +310,8 @@ backend implementation of `project-external-roots'.")
   (pcase backend
     (`Git
      (let ((default-directory (expand-file-name (file-name-as-directory dir)))
-           (args '("-z")))
+           (args '("-z"))
+           files)
        ;; Include unregistered.
        (setq args (append args '("-c" "-o" "--exclude-standard")))
        (when extra-ignores
@@ -315,11 +323,26 @@ backend implementation of `project-external-roots'.")
                                          (format ":!/:%s" (substring i 2))
                                        (format ":!:%s" i)))
                                    extra-ignores)))))
-       (mapcar
-        (lambda (file) (concat default-directory file))
-        (split-string
-         (apply #'vc-git--run-command-string nil "ls-files" args)
-         "\0" t))))
+       (setq files
+             (mapcar
+              (lambda (file) (concat default-directory file))
+              (split-string
+               (apply #'vc-git--run-command-string nil "ls-files" args)
+               "\0" t)))
+       ;; Unfortunately, 'ls-files --recurse-submodules' conflicts with '-o'.
+       (let* ((submodules (project--git-submodules))
+              (sub-files
+               (mapcar
+                (lambda (module)
+                  (when (file-directory-p module)
+                    (project--vc-list-files
+                     (concat default-directory module)
+                     backend
+                     extra-ignores)))
+                submodules)))
+         (setq files
+               (apply #'nconc files sub-files)))
+       files))
     (`Hg
      (let ((default-directory (expand-file-name (file-name-as-directory dir)))
            args)
@@ -337,6 +360,18 @@ backend implementation of `project-external-roots'.")
           (lambda (s) (concat default-directory s))
           (split-string (buffer-string) "\0" t)))))))
 
+(defun project--git-submodules ()
+  ;; 'git submodule foreach' is much slower.
+  (condition-case nil
+      (with-temp-buffer
+        (insert-file-contents ".gitmodules")
+        (let (res)
+          (goto-char (point-min))
+          (while (re-search-forward "path *= *\\(.+\\)" nil t)
+            (push (match-string 1) res))
+          (nreverse res)))
+    (file-missing nil)))
+
 (cl-defmethod project-ignores ((project (head vc)) dir)
   (let* ((root (cdr project))
           backend)
@@ -485,7 +520,7 @@ pattern to search for."
                     (buffer-substring (point-min) (line-end-position))))
       (while (re-search-forward grep-re nil t)
         (push (list (string-to-number (match-string line-group))
-                    (concat remote-id (match-string file-group))
+                    (match-string file-group)
                     (buffer-substring-no-properties (point) 
(line-end-position)))
               hits)))
     (setq xrefs (xref--convert-hits (nreverse hits) regexp))
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 13a1600..bbd3940 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -1291,8 +1291,11 @@ Such as the current syntax table and the applied syntax 
properties."
 
 (defun xref--collect-matches (hit regexp tmp-buffer)
   (pcase-let* ((`(,line ,file ,text) hit)
-               (file (and file (concat (file-remote-p default-directory) 
file)))
-               (buf (xref--find-buffer-visiting file))
+               (remote-id (file-remote-p default-directory))
+               (file (and file (concat remote-id file)))
+               (buf (unless remote-id
+                      ;; find-buffer-visiting is slow on remote.
+                      (xref--find-buffer-visiting file)))
                (syntax-needed (xref--regexp-syntax-dependent-p regexp)))
     (if buf
         (with-current-buffer buf



reply via email to

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