diff options
author | Glenn Morris <rgm@gnu.org> | 2008-10-04 19:55:00 +0000 |
---|---|---|
committer | Glenn Morris <rgm@gnu.org> | 2008-10-04 19:55:00 +0000 |
commit | f3e6c9f3a480ccf5214e601caa66af6670712986 (patch) | |
tree | b83bd3945c0d4f2c9528b81952265a7924dea6b5 /lisp/vc-cvs.el | |
parent | d1a5744de011dca994907682bf8279a850fc9f5f (diff) | |
download | emacs-f3e6c9f3a480ccf5214e601caa66af6670712986.tar.gz |
(vc-cvs-dir-status-heuristic): New function.
(vc-cvs-dir-status): Respect vc-stay-local-p. (Bug#1046)
Diffstat (limited to 'lisp/vc-cvs.el')
-rw-r--r-- | lisp/vc-cvs.el | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/lisp/vc-cvs.el b/lisp/vc-cvs.el index 5d2b56012e1..303e6d63e3c 100644 --- a/lisp/vc-cvs.el +++ b/lisp/vc-cvs.el @@ -6,8 +6,6 @@ ;; Author: FSF (see vc.el for full credits) ;; Maintainer: Andre Spiegel <spiegel@gnu.org> -;; $Id$ - ;; This file is part of GNU Emacs. ;; GNU Emacs is free software: you can redistribute it and/or modify @@ -905,16 +903,48 @@ state." ;; (funcall update-function result))) ) +;; Based on vc-cvs-dir-state-heuristic from Emacs 22. +(defun vc-cvs-dir-status-heuristic (dir update-function &optional basedir) + "Find the CVS state of all files in DIR, using only local information." + (let (file basename status result dirlist) + (with-temp-buffer + (vc-cvs-get-entries dir) + (goto-char (point-min)) + (while (not (eobp)) + (if (looking-at "D/\\([^/]*\\)////") + (push (expand-file-name (match-string 1) dir) dirlist) + ;; CVS-removed files are not taken under VC control. + (when (looking-at "/\\([^/]*\\)/[^/-]") + (setq basename (match-string 1) + file (expand-file-name basename dir) + status (or (vc-file-getprop file 'vc-state) + (vc-cvs-parse-entry file t))) + (unless (eq status 'up-to-date) + (push (list (if basedir + (file-relative-name file basedir) + basename) + status) result)))) + (forward-line 1))) + (dolist (subdir dirlist) + (setq result (append result + (vc-cvs-dir-status-heuristic subdir nil + (or basedir dir))))) + (if basedir result + (funcall update-function result)))) + (defun vc-cvs-dir-status (dir update-function) "Create a list of conses (file . state) for DIR." - (vc-cvs-command (current-buffer) 'async dir "-f" "status") - ;; Alternative implementation: use the "update" command instead of - ;; the "status" command. - ;; (vc-cvs-command (current-buffer) 'async - ;; (file-relative-name dir) - ;; "-f" "-n" "update" "-d" "-P") - (vc-exec-after - `(vc-cvs-after-dir-status (quote ,update-function)))) + ;; FIXME check all files in DIR instead? + (if (vc-stay-local-p dir) + (vc-cvs-dir-status-heuristic dir update-function) + (vc-cvs-command (current-buffer) 'async dir "-f" "status") + ;; Alternative implementation: use the "update" command instead of + ;; the "status" command. + ;; (vc-cvs-command (current-buffer) 'async + ;; (file-relative-name dir) + ;; "-f" "-n" "update" "-d" "-P") + (vc-exec-after + `(vc-cvs-after-dir-status (quote ,update-function))))) (defun vc-cvs-dir-status-files (dir files default-state update-function) "Create a list of conses (file . state) for DIR." |