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."