[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 2697123: Make vc-responsible-backend choose the most specific bac
From: |
Lars Ingebrigtsen |
Subject: |
master 2697123: Make vc-responsible-backend choose the most specific backend |
Date: |
Mon, 26 Oct 2020 16:24:53 -0400 (EDT) |
branch: master
commit 2697123933e3ac7ed4e21a6d12746a98ed7fa74a
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>
Make vc-responsible-backend choose the most specific backend
* 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 | 8 ++++++++
lisp/vc/vc.el | 22 ++++++++++++++++------
2 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/etc/NEWS b/etc/NEWS
index 7dd993c..2674094 100644
--- 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'.
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index 39d0fab..8def7da 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -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))))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 2697123: Make vc-responsible-backend choose the most specific backend,
Lars Ingebrigtsen <=