changeset 91929:3299b785d830

(vc-git-after-dir-status, vc-git-dir-status): New funcs.
author Thien-Thi Nguyen <ttn@gnuvola.org>
date Mon, 18 Feb 2008 07:46:14 +0000
parents e788f311729d
children 9974c43b4820
files lisp/vc-git.el
diffstat 1 files changed, 47 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/vc-git.el	Mon Feb 18 04:08:04 2008 +0000
+++ b/lisp/vc-git.el	Mon Feb 18 07:46:14 2008 +0000
@@ -207,6 +207,53 @@
       ;; fall back to the default VC representation
       (vc-default-dired-state-info 'Git file))))
 
+;;; vc-dir-status support (EXPERIMENTAL)
+;;; If vc-directory (which is not half bad under Git, w/ some tweaking)
+;;; is to go away, vc-dir-status must at least support the same operations.
+;;; At the moment, vc-dir-status design is still fluid (a kind way to say
+;;; half-baked, undocumented, and spottily-supported), so the following
+;;; should be considered likewise ripe for sudden unannounced change.
+;;; YHBW, HAND.  --ttn
+
+(defun vc-git-after-dir-status (callback buffer)
+  (sort-regexp-fields t "^. \\(.+\\)$" "\\1" (point-min) (point-max))
+  (let ((map '((?H . cached)
+               (?M . unmerged)
+               (?R . removed)
+               (?C . edited)
+               (?K . removed)           ; ??? "to be killed"
+               (?? . unregistered)))
+        status filename result)
+    (goto-char (point-min))
+    (while (> (point-max) (point))
+      (setq status (string-to-char (buffer-substring (point) (1+ (point))))
+            status (cdr (assq status map))
+            filename (buffer-substring (+ 2 (point)) (line-end-position)))
+      ;; TODO: Add dynamic selection of which status(es) to display, and
+      ;; bubble that up to vc-dir-status.  For now, we consider `cached'
+      ;; to be uninteresting, to mimic vc-directory (somewhat).
+      (unless (eq 'cached status)
+        (push (cons filename status) result))
+      (forward-line 1))
+    (funcall callback result buffer)))
+
+(defun vc-git-dir-status (dir update-function status-buffer)
+  "Return a list of conses (file . state) for DIR."
+  (with-current-buffer
+      (get-buffer-create
+       (expand-file-name " *VC-Git* tmp status" dir))
+    (erase-buffer)
+    (vc-git-command (current-buffer) 'async dir "ls-files" "-t"
+                    "-c"                ; cached
+                    "-d"                ; deleted
+                    "-k"                ; killed
+                    "-m"                ; modified
+                    "-o"                ; others
+                    "--directory"
+                    "--exclude-per-directory=.gitignore")
+    (vc-exec-after
+     `(vc-git-after-dir-status (quote ,update-function) ,status-buffer))))
+
 ;;; STATE-CHANGING FUNCTIONS
 
 (defun vc-git-create-repo ()