From aea851cb7248841e70dd2526ac8db4b0b91b0d32 Mon Sep 17 00:00:00 2001 From: Ami Fischman Date: Mon, 26 Mar 2012 11:08:15 +0800 Subject: [PATCH] * vc/vc-git.el (vc-git-state): Avoid unnecessarily locking. --- lisp/ChangeLog | 4 ++++ lisp/vc/vc-git.el | 19 ++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index cec2aec0f9c..e97af38ade0 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2012-03-26 Ami Fischman + + * vc/vc-git.el (vc-git-state): Avoid unnecessarily locking. + 2012-03-26 Glenn Morris * files.el (save-buffers-kill-emacs): Doc fix. diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index 3ec32243796..bf7b7fb9e17 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -217,12 +217,21 @@ matching the resulting Git log output, and KEYWORDS is a list of ;; operation. (if (not (vc-git-registered file)) 'unregistered - (vc-git--call nil "add" "--refresh" "--" (file-relative-name file)) (let ((diff (vc-git--run-command-string - file "diff-index" "-z" "HEAD" "--"))) - (if (and diff (string-match ":[0-7]\\{6\\} [0-7]\\{6\\} [0-9a-f]\\{40\\} [0-9a-f]\\{40\\} \\([ADMUT]\\)\0[^\0]+\0" - diff)) - (vc-git--state-code (match-string 1 diff)) + file "diff-index" "-p" "--raw" "-z" "HEAD" "--"))) + (if (and diff + (string-match ":[0-7]\\{6\\} [0-7]\\{6\\} [0-9a-f]\\{40\\} [0-9a-f]\\{40\\} \\([ADMUT]\\)\0[^\0]+\0\\(\\(?:.\\|\n\\)*\\)\\'" + diff)) + (let ((diff-letter (match-string 1 diff)) + (diff-contents (match-string 2 diff))) + (if (not (string-match "\n." diff-contents)) + ;; Empty diff: file contents is the same as the HEAD + ;; revision, but timestamps are different (eg, file + ;; was "touch"ed). Update timestamp in index: + (prog1 'up-to-date + (vc-git--call nil "add" "--refresh" "--" + (file-relative-name file))) + (vc-git--state-code diff-letter))) (if (vc-git--empty-db-p) 'added 'up-to-date))))) (defun vc-git-working-revision (file) -- 2.11.4.GIT