Mercurial > emacs
changeset 98517:04d30d4471c2
(vc-cvs-dir-status-heuristic): New function.
(vc-cvs-dir-status): Respect vc-stay-local-p. (Bug#1046)
author | Glenn Morris <rgm@gnu.org> |
---|---|
date | Sat, 04 Oct 2008 19:54:48 +0000 |
parents | a3386be0b080 |
children | 31c64334579f |
files | lisp/vc-cvs.el |
diffstat | 1 files changed, 40 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/vc-cvs.el Sat Oct 04 18:54:20 2008 +0000 +++ b/lisp/vc-cvs.el Sat Oct 04 19:54:48 2008 +0000 @@ -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 @@ ;; (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."