Mercurial > emacs
changeset 87512:4146f1cc135e
* vc.el (vc-dired-hook): Speed tuning. Replace a vc-backend call
with vc-state.
author | Eric S. Raymond <esr@snark.thyrsus.com> |
---|---|
date | Tue, 01 Jan 2008 11:17:37 +0000 |
parents | b8ae06eabc33 |
children | 2af4faa10fab |
files | lisp/ChangeLog lisp/vc-svn.el lisp/vc.el |
diffstat | 3 files changed, 36 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Mon Dec 31 23:23:39 2007 +0000 +++ b/lisp/ChangeLog Tue Jan 01 11:17:37 2008 +0000 @@ -1,3 +1,8 @@ +2008-01-01 Eric S. Raymond <esr@snark.thyrsus.com> + + * vc.el (vc-dired-hook): Speed tuning. Replace a vc-backend call + with vc-state. + 2007-12-31 Tom Tromey <address@hidden> * emacs-lisp/elp.el (elp-results): Use header-line-format for
--- a/lisp/vc-svn.el Mon Dec 31 23:23:39 2007 +0000 +++ b/lisp/vc-svn.el Tue Jan 01 11:17:37 2008 +0000 @@ -536,6 +536,10 @@ nil) (message "There are unresolved conflicts in this file"))) +(defun vc-file-setprop2 (f p v) + (message (format "On file %s. setting property %s to %s" f p v)) + (sit-for 2)) + (defun vc-svn-parse-status (&optional filename) "Parse output of \"svn status\" command in the current buffer. Set file properties accordingly. Unless FILENAME is non-nil, parse only @@ -544,7 +548,7 @@ (goto-char (point-min)) (while (re-search-forward ;; Ignore the files with status X. - "^[ ACDGIMR!?~][ MC][ L][ +][ S]..\\([ *]\\) +\\([-0-9]+\\) +\\([0-9?]+\\) +\\([^ ]+\\) +" nil t) + "^\\? +|^[ ACDGIMR!~][ MC][ L][ +][ S]..\\([ *]\\) +\\([-0-9]+\\) +\\([0-9?]+\\) +\\([^ ]+\\) +" nil t) ;; If the username contains spaces, the output format is ambiguous, ;; so don't trust the output's filename unless we have to. (setq file (or filename @@ -552,37 +556,37 @@ (buffer-substring (point) (line-end-position))))) (setq status (char-after (line-beginning-position))) (if (eq status ??) - (vc-file-setprop file 'vc-state 'unregistered) + (vc-file-setprop2 file 'vc-state 'unregistered) ;; `vc-BACKEND-registered' must not set vc-backend, ;; which is instead set in vc-registered. - (unless filename (vc-file-setprop file 'vc-backend 'SVN)) + (unless filename (vc-file-setprop2 file 'vc-backend 'SVN)) ;; Use the last-modified revision, so that searching in vc-print-log ;; output works. - (vc-file-setprop file 'vc-working-revision (match-string 3)) + (vc-file-setprop2 file 'vc-working-revision (match-string 3)) ;; Remember Svn's own status. - (vc-file-setprop file 'vc-svn-status status) - (vc-file-setprop + (vc-file-setprop2 file 'vc-svn-status status) + (vc-file-setprop2 file 'vc-state (cond ((eq status ?\ ) (if (eq (char-after (match-beginning 1)) ?*) 'needs-patch - (vc-file-setprop file 'vc-checkout-time + (vc-file-setprop2 file 'vc-checkout-time (nth 5 (file-attributes file))) 'up-to-date)) ((eq status ?A) ;; If the file was actually copied, (match-string 2) is "-". - (vc-file-setprop file 'vc-working-revision "0") - (vc-file-setprop file 'vc-checkout-time 0) + (vc-file-setprop2 file 'vc-working-revision "0") + (vc-file-setprop2 file 'vc-checkout-time 0) 'added) ((memq status '(?M ?C)) (if (eq (char-after (match-beginning 1)) ?*) 'needs-merge 'edited)) ((eq status ?I) - (vc-file-setprop file 'vc-state 'ignored)) + (vc-file-setprop2 file 'vc-state 'ignored)) ((eq status ?R) - (vc-file-setprop file 'vc-state 'removed)) + (vc-file-setprop2 file 'vc-state 'removed)) (t 'edited))))) (if filename (vc-file-getprop filename 'vc-state))))
--- a/lisp/vc.el Mon Dec 31 23:23:39 2007 +0000 +++ b/lisp/vc.el Tue Jan 01 11:17:37 2008 +0000 @@ -2393,27 +2393,25 @@ (t (vc-dired-reformat-line nil) (forward-line 1)))) - ;; try to head off calling the expensive state query - + ;; Try to head off calling the expensive state query - ;; ignore object files, TeX intermediate files, and so forth. ((vc-dired-ignorable-p filename) (dired-kill-line)) - ;; ordinary file -- call the (possibly expensive) state query - (t - (let ((backend (vc-backend filename))) - (cond - ;; Not registered - ((not backend) - (if vc-dired-terse-mode - (dired-kill-line) - (vc-dired-reformat-line "?") - (forward-line 1))) - ;; Either we're in non-terse mode or it's out of date - ((not (and vc-dired-terse-mode (vc-up-to-date-p filename))) - (vc-dired-reformat-line (vc-call dired-state-info filename)) - (forward-line 1)) - ;; Remaining cases are under version control but uninteresting - (t - (dired-kill-line))))))) + ;; Ordinary file -- call the (possibly expensive) state query + ;; + ;; First case: unregistered or unknown. (Unknown shouldn't happen here) + ((member (vc-state filename) '(nil unregistered)) + (if vc-dired-terse-mode + (dired-kill-line) + (vc-dired-reformat-line "?") + (forward-line 1))) + ;; Either we're in non-terse mode or it's out of date + ((not (and vc-dired-terse-mode (vc-up-to-date-p filename))) + (vc-dired-reformat-line (vc-call dired-state-info filename)) + (forward-line 1)) + ;; Remaining cases are under version control but uninteresting + (t + (dired-kill-line)))) ;; any other line (t (forward-line 1)))) (vc-dired-purge))