diff options
author | Thien-Thi Nguyen <ttn@gnuvola.org> | 2008-02-18 07:46:44 +0000 |
---|---|---|
committer | Thien-Thi Nguyen <ttn@gnuvola.org> | 2008-02-18 07:46:44 +0000 |
commit | 758dc0cc60a495321f03098eb363d81215ab8fbf (patch) | |
tree | 465407f256f184c5b5a4f31f6197a2b14579a76a /lisp/vc-git.el | |
parent | 917844623bc50499a6b06c0d5f30d6a21dd1e7a5 (diff) | |
download | emacs-758dc0cc60a495321f03098eb363d81215ab8fbf.tar.gz |
(vc-git-after-dir-status, vc-git-dir-status): New funcs.
Diffstat (limited to 'lisp/vc-git.el')
-rw-r--r-- | lisp/vc-git.el | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/lisp/vc-git.el b/lisp/vc-git.el index 7920fec0289..c8c63a22181 100644 --- a/lisp/vc-git.el +++ b/lisp/vc-git.el @@ -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 () |