]> git.eshelyaron.com Git - emacs.git/commitdiff
Make vc-responsible-backend choose the most specific backend
authorLars Ingebrigtsen <larsi@gnus.org>
Mon, 26 Oct 2020 20:10:36 +0000 (21:10 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 26 Oct 2020 20:24:47 +0000 (21:24 +0100)
* lisp/vc/vc.el (vc-responsible-backend): Search through all the
VC backends instead of the first one, and choose the one that's
most specific (bug#42966).

etc/NEWS
lisp/vc/vc.el

index 7dd993cdab9e450b90b17fa96e77b4d340a5d8dd..2674094c79c3614a78d0fe8482306f8389054dfc 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -403,6 +403,14 @@ their 'default-directory' under VC.
 
 *** New command 'vc-dir-root' uses the root directory without asking.
 
+---
+*** The responsible VC backend is now the most specific one.
+'vc-responsible-backend' loops over the backends in
+'vc-handled-backends' to determine which backend is responsible for a
+specific (unregistered) file.  Previously the first matching backend
+was chosen, but now the one with the most specific path is chosen (in
+case there's a directory handled by one backend inside another).
+
 *** New commands 'vc-dir-mark-registered-files' (bound to '* r') and
 'vc-dir-mark-unregistered-files'.
 
index 39d0fab391d5d2a4434abcb53d8d0a36f0a33361..8def7da3776e275afa6c2a30262209fe1b2e23ce 100644 (file)
@@ -979,12 +979,22 @@ be reported.
 If NO-ERROR is nil, signal an error that no VC backend is
 responsible for the given file."
   (or (and (not (file-directory-p file)) (vc-backend file))
-      (catch 'found
-       ;; First try: find a responsible backend.  If this is for registration,
-       ;; it must be a backend under which FILE is not yet registered.
-       (dolist (backend vc-handled-backends)
-         (and (vc-call-backend backend 'responsible-p file)
-              (throw 'found backend))))
+      ;; First try: find a responsible backend.  If this is for registration,
+      ;; it must be a backend under which FILE is not yet registered.
+      (let ((dirs (delq nil
+                        (mapcar
+                         (lambda (backend)
+                           (when-let ((dir (vc-call-backend
+                                            backend 'responsible-p file)))
+                             (cons backend dir)))
+                         vc-handled-backends))))
+        ;; Just a single response (or none); use it.
+        (if (< (length dirs) 2)
+            (caar dirs)
+          ;; Several roots; we seem to have one vc inside another's
+          ;; directory.  Choose the most specific.
+          (caar (sort dirs (lambda (d1 d2)
+                             (< (length (cdr d2)) (length (cdr d1))))))))
       (unless no-error
         (error "No VC backend is responsible for %s" file))))