# HG changeset patch # User Glenn Morris # Date 1223150088 0 # Node ID 04d30d4471c246453c8c0b12bedf09d71e06ef02 # Parent a3386be0b08076cb47d0e777017cfb5da2cc73c4 (vc-cvs-dir-status-heuristic): New function. (vc-cvs-dir-status): Respect vc-stay-local-p. (Bug#1046) diff -r a3386be0b080 -r 04d30d4471c2 lisp/vc-cvs.el --- 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 -;; $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."