# HG changeset patch # User Dan Nicolaescu # Date 1208244396 0 # Node ID 9ec1b62752b12e91210ac145201677101da7e1e5 # Parent c040fae879e0b88e750d101999f75c45fa40cd98 (vc-cvs-after-dir-status, vc-cvs-dir-status): Add alternative implementation based on "cvs update". diff -r c040fae879e0 -r 9ec1b62752b1 lisp/ChangeLog --- a/lisp/ChangeLog Tue Apr 15 06:46:11 2008 +0000 +++ b/lisp/ChangeLog Tue Apr 15 07:26:36 2008 +0000 @@ -1,3 +1,8 @@ +2008-04-15 Dan Nicolaescu + + * vc-cvs.el (vc-cvs-after-dir-status, vc-cvs-dir-status): Add + alternative implementation based on "cvs update". + 2008-04-15 Tassilo Horn * doc-view.el: Changed requirements section to tell that only one diff -r c040fae879e0 -r 9ec1b62752b1 lisp/vc-cvs.el --- a/lisp/vc-cvs.el Tue Apr 15 06:46:11 2008 +0000 +++ b/lisp/vc-cvs.el Tue Apr 15 07:26:36 2008 +0000 @@ -908,15 +908,88 @@ (push (list file status) result)))))) (goto-char (point-max)) (widen)) - (funcall update-function result))) + (funcall update-function result)) + ;; Alternative implementation: use the "update" command instead of + ;; the "status" command. + ;; (let ((result nil) + ;; (translation '((?? . unregistered) + ;; (?A . added) + ;; (?C . conflict) + ;; (?M . edited) + ;; (?P . needs-merge) + ;; (?R . removed) + ;; (?U . needs-patch)))) + ;; (goto-char (point-min)) + ;; (while (not (eobp)) + ;; (if (looking-at "^[ACMPRU?] \\(.*\\)$") + ;; (push (list (match-string 1) + ;; (cdr (assoc (char-after) translation))) + ;; result) + ;; (cond + ;; ((looking-at "cvs update: warning: \\(.*\\) was lost") + ;; ;; Format is: + ;; ;; cvs update: warning: FILENAME was lost + ;; ;; U FILENAME + ;; (push (list (match-string 1) 'missing) result) + ;; ;; Skip the "U" line + ;; (forward-line 1)) + ;; ((looking-at "cvs update: New directory `\\(.*\\)' -- ignored") + ;; (push (list (match-string 1) 'unregistered) result)))) + ;; (forward-line 1)) + ;; (funcall update-function result))) + ) ;; XXX Experimental function for the vc-dired replacement. (defun vc-cvs-dir-status (dir update-function) "Create a list of conses (file . state) for DIR." (vc-cvs-command (current-buffer) 'async dir "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-after-dir-status (update-function) + ;; Heavily inspired by vc-cvs-parse-status. AKA a quick hack. + ;; It needs a lot of testing. + (let ((result nil) + (translation '((?? . unregistered) + (?A . added) + (?C . conflict) + (?M . edited) + (?P . needs-merge) + (?R . removed) + (?U . needs-patch)))) + (goto-char (point-min)) + (while (not (eobp)) + (if (looking-at "^[ACMPRU?] \\(.*\\)$") + (push (list (match-string 1) + (cdr (assoc (char-after) translation))) + result) + (cond + ((looking-at "cvs update: warning: \\(.*\\) was lost") + ;; Format is: + ;; cvs update: warning: FILENAME was lost + ;; U FILENAME + (push (list (match-string 1) 'missing) result) + ;; Skip the "U" line + (forward-line 1)) + ((looking-at "cvs update: New directory `\\(.*\\)' -- ignored") + (push (list (match-string 1) 'unregistered) result)))) + (forward-line 1)) + (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 + (file-relative-name dir) + "-f" "-n" "update" "-d" "-P") + (vc-exec-after + `(vc-cvs-after-dir-status (quote ,update-function)))) + + (defun vc-cvs-get-entries (dir) "Insert the CVS/Entries file from below DIR into the current buffer. This function ensures that the correct coding system is used for that,