diff --git a/lisp/vc/vc-filewise.el b/lisp/vc/vc-filewise.el index 9bdde5e5e31..bc8a8dec416 100644 --- a/lisp/vc/vc-filewise.el +++ b/lisp/vc/vc-filewise.el @@ -81,18 +81,6 @@ If the file is not registered, or the master name is not known, return nil." (vc-file-setprop file 'vc-name result) nil)))) ; Not registered -(defun vc-possible-master (s dirname basename) - (cond - ((stringp s) (format s dirname basename)) - ((functionp s) - ;; The template is a function to invoke. If the - ;; function returns non-nil, that means it has found a - ;; master. For backward compatibility, we also handle - ;; the case that the function throws a 'found atom - ;; and a pair (cons MASTER-FILE BACKEND). - (let ((result (catch 'found (funcall s dirname basename)))) - (if (consp result) (car result) result))))) - (defun vc-check-master-templates (file templates) "Return non-nil if there is a master corresponding to FILE. diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el index 6f55a14b7ba..a084f9da73a 100644 --- a/lisp/vc/vc-hooks.el +++ b/lisp/vc/vc-hooks.el @@ -627,8 +627,7 @@ If FILE is not registered, this function always returns nil." "`working-revision' not found: using the old `workfile-version' instead") (vc-call-backend backend 'workfile-version file)) -;;;autoload -(defun vc-master-registered (backend file) +(defun vc-default-registered (backend file) "Check if FILE is registered in BACKEND using vc-BACKEND-master-templates." (let ((sym (vc-make-backend-sym backend 'master-templates))) (unless (get backend 'vc-templates-grabbed) @@ -638,6 +637,54 @@ If FILE is not registered, this function always returns nil." (vc-file-setprop file 'vc-master-name result) nil)))) ; Not registered +;;;###autoload +(defun vc-possible-master (s dirname basename) + (cond + ((stringp s) (format s dirname basename)) + ((functionp s) + ;; The template is a function to invoke. If the + ;; function returns non-nil, that means it has found a + ;; master. For backward compatibility, we also handle + ;; the case that the function throws a 'found atom + ;; and a pair (cons MASTER-FILE BACKEND). + (let ((result (catch 'found (funcall s dirname basename)))) + (if (consp result) (car result) result))))) + +(defun vc-check-master-templates (file templates) + "Return non-nil if there is a master corresponding to FILE. + +TEMPLATES is a list of strings or functions. If an element is a +string, it must be a control string as required by `format', with two +string placeholders, such as \"%sRCS/%s,v\". The directory part of +FILE is substituted for the first placeholder, the basename of FILE +for the second. If a file with the resulting name exists, it is taken +as the master of FILE, and returned. + +If an element of TEMPLATES is a function, it is called with the +directory part and the basename of FILE as arguments. It should +return non-nil if it finds a master; that value is then returned by +this function." + (let ((dirname (or (file-name-directory file) "")) + (basename (file-name-nondirectory file))) + (catch 'found + (mapcar + (lambda (s) + (let ((trial (vc-possible-master s dirname basename))) + (when (and trial (file-exists-p trial) + ;; Make sure the file we found with name + ;; TRIAL is not the source file itself. + ;; That can happen with RCS-style names if + ;; the file name is truncated (e.g. to 14 + ;; chars). See if either directory or + ;; attributes differ. + (or (not (string= dirname + (file-name-directory trial))) + (not (equal (file-attributes file) + (file-attributes trial))))) + (throw 'found trial)))) + templates)))) + + ;; toggle-read-only is obsolete since 24.3, but since vc-t-r-o was made ;; obsolete earlier, it is ok for the latter to be an alias to the former, ;; since the latter will be removed first. We can't just make it diff --git a/lisp/vc/vc-rcs.el b/lisp/vc/vc-rcs.el index 99019915490..0b839a622e1 100644 --- a/lisp/vc/vc-rcs.el +++ b/lisp/vc/vc-rcs.el @@ -90,7 +90,7 @@ to use --brief and sets this variable to remember whether it worked." :group 'vc-rcs) ;; This needs to be autoloaded because vc-rcs-registered uses it (via -;; vc-master-registered), and vc-hooks needs to be able to check +;; vc-default-registered), and vc-hooks needs to be able to check ;; for a registered backend without loading every backend. ;;;###autoload (defcustom vc-rcs-master-templates @@ -131,7 +131,7 @@ For a description of possible values, see `vc-check-master-templates'." ;; every file that is visited. ;;;###autoload (progn -(defun vc-rcs-registered (f) (vc-master-registered 'RCS f))) +(defun vc-rcs-registered (f) (vc-default-registered 'RCS f))) (defun vc-rcs-state (file) "Implementation of `vc-state' for RCS." diff --git a/lisp/vc/vc-sccs.el b/lisp/vc/vc-sccs.el index fc9c07277ae..780efc48e96 100644 --- a/lisp/vc/vc-sccs.el +++ b/lisp/vc/vc-sccs.el @@ -75,7 +75,7 @@ If nil, use the value of `vc-diff-switches'. If t, use no switches." :group 'vc-sccs) ;; This needs to be autoloaded because vc-sccs-registered uses it (via -;; vc-master-registered), and vc-hooks needs to be able to check +;; vc-default-registered), and vc-hooks needs to be able to check ;; for a registered backend without loading every backend. ;;;###autoload (defcustom vc-sccs-master-templates @@ -112,7 +112,7 @@ For a description of possible values, see `vc-check-master-templates'." ;; every file that is visited. ;;;###autoload (progn -(defun vc-sccs-registered (f) (vc-master-registered 'SCCS f))) +(defun vc-sccs-registered (f) (vc-default-registered 'SCCS f))) (defun vc-sccs-state (file) "SCCS-specific function to compute the version control state." diff --git a/lisp/vc/vc-src.el b/lisp/vc/vc-src.el index 56af2a5848c..520708c7eb0 100644 --- a/lisp/vc/vc-src.el +++ b/lisp/vc/vc-src.el @@ -123,7 +123,7 @@ If nil, use the value of `vc-diff-switches'. If t, use no switches." :group 'vc-src) ;; This needs to be autoloaded because vc-src-registered uses it (via -;; vc-master-registered), and vc-hooks needs to be able to check +;; vc-default-registered), and vc-hooks needs to be able to check ;; for a registered backend without loading every backend. ;;;###autoload (defcustom vc-src-master-templates @@ -153,7 +153,7 @@ For a description of possible values, see `vc-check-master-templates'." ;; every file that is visited. ;;;###autoload (progn -(defun vc-src-registered (f) (vc-master-registered 'src f))) +(defun vc-src-registered (f) (vc-default-registered 'src f))) (defun vc-src-state (file) "SRC-specific version of `vc-state'."