* vc/vc-git.el (vc-git-registered): Use cache property

`git-registered'.
(vc-git-mode-line-string): Call `vc-working-revision' instead of
`vc-git-working-revision' in order to benefit from the cache.
(vc-git-root): Use cache property `git-root'.
This commit is contained in:
Michael Albinus 2012-06-30 15:18:16 +02:00
parent ac87de9763
commit a40c87a009
2 changed files with 36 additions and 24 deletions

View file

@ -1,3 +1,11 @@
2012-06-30 Michael Albinus <michael.albinus@gmx.de>
* vc/vc-git.el (vc-git-registered): Use cache property
`git-registered'.
(vc-git-mode-line-string): Call `vc-working-revision' instead of
`vc-git-working-revision' in order to benefit from the cache.
(vc-git-root): Use cache property `git-root'.
2012-06-30 Dmitry Gutov <dgutov@yandex.ru>
* vc/vc-hooks.el (vc-before-save): Clear cache if file has been

View file

@ -173,28 +173,31 @@ matching the resulting Git log output, and KEYWORDS is a list of
(defun vc-git-registered (file)
"Check whether FILE is registered with git."
(let ((dir (vc-git-root file)))
(when dir
(with-temp-buffer
(let* (process-file-side-effects
;; Do not use the `file-name-directory' here: git-ls-files
;; sometimes fails to return the correct status for relative
;; path specs.
;; See also: http://marc.info/?l=git&m=125787684318129&w=2
(name (file-relative-name file dir))
(str (ignore-errors
(cd dir)
(vc-git--out-ok "ls-files" "-c" "-z" "--" name)
;; If result is empty, use ls-tree to check for deleted
;; file.
(when (eq (point-min) (point-max))
(vc-git--out-ok "ls-tree" "--name-only" "-z" "HEAD"
"--" name))
(buffer-string))))
(and str
(> (length str) (length name))
(string= (substring str 0 (1+ (length name)))
(concat name "\0"))))))))
(or (vc-file-getprop file 'git-registered)
(vc-file-setprop
file 'git-registered
(let ((dir (vc-git-root file)))
(when dir
(with-temp-buffer
(let* (process-file-side-effects
;; Do not use the `file-name-directory' here: git-ls-files
;; sometimes fails to return the correct status for relative
;; path specs.
;; See also: http://marc.info/?l=git&m=125787684318129&w=2
(name (file-relative-name file dir))
(str (ignore-errors
(cd dir)
(vc-git--out-ok "ls-files" "-c" "-z" "--" name)
;; If result is empty, use ls-tree to check for deleted
;; file.
(when (eq (point-min) (point-max))
(vc-git--out-ok "ls-tree" "--name-only" "-z" "HEAD"
"--" name))
(buffer-string))))
(and str
(> (length str) (length name))
(string= (substring str 0 (1+ (length name)))
(concat name "\0"))))))))))
(defun vc-git--state-code (code)
"Convert from a string to a added/deleted/modified state."
@ -248,7 +251,7 @@ matching the resulting Git log output, and KEYWORDS is a list of
(defun vc-git-mode-line-string (file)
"Return a string for `vc-mode-line' to put in the mode line for FILE."
(let* ((branch (vc-git-working-revision file))
(let* ((branch (vc-working-revision file))
(def-ml (vc-default-mode-line-string 'Git file))
(help-echo (get-text-property 0 'help-echo def-ml)))
(if (zerop (length branch))
@ -959,7 +962,8 @@ or BRANCH^ (where \"^\" can be repeated)."
(defun vc-git-extra-status-menu () vc-git-extra-menu-map)
(defun vc-git-root (file)
(vc-find-root file ".git"))
(or (vc-file-getprop file 'git-root)
(vc-file-setprop file 'git-root (vc-find-root file ".git"))))
;; Derived from `lgrep'.
(defun vc-git-grep (regexp &optional files dir)