summaryrefslogtreecommitdiff
path: root/lisp/vc-git.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/vc-git.el')
-rw-r--r--lisp/vc-git.el58
1 files changed, 23 insertions, 35 deletions
diff --git a/lisp/vc-git.el b/lisp/vc-git.el
index 64bcbeb0b2b..7920fec0289 100644
--- a/lisp/vc-git.el
+++ b/lisp/vc-git.el
@@ -1,6 +1,6 @@
;;; vc-git.el --- VC backend for the git version control system
-;; Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+;; Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
;; Author: Alexandre Julliard <julliard@winehq.org>
;; Keywords: tools
@@ -151,41 +151,26 @@
'edited
'up-to-date)))
-(defun vc-git-dir-state (dir)
- "Git-specific version of `dir-state'."
- ;; FIXME: This can't set 'ignored yet
+(defun vc-git--ls-files-state (state &rest args)
+ "Set state to STATE on all files found with git-ls-files ARGS."
(with-temp-buffer
- (vc-git-command (current-buffer) nil nil "ls-files" "-t" "-c" "-m" "-o")
+ (apply 'vc-git-command (current-buffer) nil nil "ls-files" "-z" args)
(goto-char (point-min))
- (let ((status-char nil)
- (file nil))
- (while (not (eobp))
- (setq status-char (char-after))
- (setq file
- (expand-file-name
- (buffer-substring-no-properties (+ (point) 2)
- (line-end-position))))
- (cond
- ;; The rest of the possible states in "git ls-files -t" output:
- ;; K to be killed
- ;; should not show up in vc-dired, so don't deal with them
- ;; here.
- ((eq status-char ?H)
- (vc-file-setprop file 'vc-backend 'Git)
- (vc-file-setprop file 'vc-state 'up-to-date))
- ((eq status-char ?R)
- (vc-file-setprop file 'vc-backend 'Git)
- (vc-file-setprop file 'vc-state 'removed))
- ((eq status-char ?M)
- (vc-file-setprop file 'vc-backend 'Git)
- (vc-file-setprop file 'vc-state 'edited))
- ((eq status-char ?C)
- (vc-file-setprop file 'vc-backend 'Git)
- (vc-file-setprop file 'vc-state 'edited))
- ((eq status-char ??)
- (vc-file-setprop file 'vc-backend 'none)
- (vc-file-setprop file 'vc-state nil)))
- (forward-line)))))
+ (let ((start (point)))
+ (while (search-forward "\0" nil t)
+ (let ((file (expand-file-name
+ (buffer-substring-no-properties start (1- (point))))))
+ (vc-file-setprop file 'vc-backend (if state 'Git 'none))
+ (vc-file-setprop file 'vc-state state))
+ (setq start (point))))))
+
+(defun vc-git-dir-state (dir)
+ "Git-specific version of `dir-state'."
+ (vc-git--ls-files-state 'up-to-date "-c")
+ (vc-git--ls-files-state 'edited "-m")
+ (vc-git--ls-files-state 'removed "-d")
+ (vc-git--ls-files-state 'ignored "-o" "-i" "--exclude-standard")
+ (vc-git--ls-files-state nil "-o" "--exclude-standard"))
(defun vc-git-working-revision (file)
"Git-specific version of `vc-working-revision'."
@@ -459,7 +444,10 @@ The difference to vc-do-command is that this function always invokes `git'."
(apply 'vc-do-command buffer okstatus "git" file-or-list flags))
(defun vc-git--call (buffer command &rest args)
- (apply 'call-process "git" nil buffer nil command args))
+ ;; We don't need to care the arguments. If there is a file name, it
+ ;; is always a relative one. This works also for remote
+ ;; directories.
+ (apply 'process-file "git" nil buffer nil command args))
(defun vc-git--out-ok (command &rest args)
(zerop (apply 'vc-git--call '(t nil) command args)))