emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/vc-cvs.el,v


From: Glenn Morris
Subject: [Emacs-diffs] Changes to emacs/lisp/vc-cvs.el,v
Date: Sat, 04 Oct 2008 19:54:49 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Glenn Morris <gm>       08/10/04 19:54:48

Index: vc-cvs.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/vc-cvs.el,v
retrieving revision 1.149
retrieving revision 1.150
diff -u -b -r1.149 -r1.150
--- vc-cvs.el   4 Oct 2008 01:22:29 -0000       1.149
+++ vc-cvs.el   4 Oct 2008 19:54:48 -0000       1.150
@@ -6,8 +6,6 @@
 ;; Author:      FSF (see vc.el for full credits)
 ;; Maintainer:  Andre Spiegel <address@hidden>
 
-;; $Id$
-
 ;; This file is part of GNU Emacs.
 
 ;; GNU Emacs is free software: you can redistribute it and/or modify
@@ -905,8 +903,40 @@
   ;;   (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."
+  ;; 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.
@@ -914,7 +944,7 @@
   ;;             (file-relative-name dir)
   ;;             "-f" "-n" "update" "-d" "-P")
   (vc-exec-after
-   `(vc-cvs-after-dir-status (quote ,update-function))))
+     `(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."




reply via email to

[Prev in Thread] Current Thread [Next in Thread]