From 2697123933e3ac7ed4e21a6d12746a98ed7fa74a Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Mon, 26 Oct 2020 21:10:36 +0100 Subject: [PATCH] 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 7dd993cdab9..2674094c79c 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 39d0fab391d..8def7da3776 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)))) -- 2.39.2