branch: elpa/vc-fossil commit 2fd4bf0113797fb3155f24087af4e281f8a0d8c3 Author: pdo <pdo> Commit: pdo <pdo>
Improved vc-dir performance on large repositories. Query fossil classification of all managed files up front, instead of per-file when "fossil update" says UNCHANGED. --- vc/el/vc-fossil.el | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/vc/el/vc-fossil.el b/vc/el/vc-fossil.el index 7c92165..60e1231 100644 --- a/vc/el/vc-fossil.el +++ b/vc/el/vc-fossil.el @@ -216,9 +216,22 @@ Allow user to edit command in minibuffer if PROMPT is non-nil." "Get fossil status for all files in a directory" (vc-fossil--dir-status-files dir nil update-function)) +(defvar vc-fossil--file-classifications nil + "An alist of (filename . classification) pairs.") + +(defun vc-fossil--classify-all-files (dir) + (setq vc-fossil--file-classifications nil) + (let* ((default-directory dir) + (lines (split-string (vc-fossil--run "changes" "--classify" "--all") "[\n\r]+" t))) + (dolist (line lines) + (string-match "^\\(\\w+\\)\\s-+\\(.+\\)$" line) + (let ((pair (cons (match-string 2 line) (match-string 1 line)))) + (push pair vc-fossil--file-classifications))))) + (defun vc-fossil--dir-status-files (dir files update-function) "Get fossil status for all specified files in a directory. If `files` is nil return the status for all files." + (vc-fossil--classify-all-files dir) (insert (apply 'vc-fossil--run "update" "-n" "-v" "current" (or files (list dir)))) (let ((result '()) @@ -235,9 +248,7 @@ If `files` is nil return the status for all files." (setq file (file-relative-name file dir)) ;; if 'fossil update' says file is UNCHANGED check to see if it has been RENAMED (when (or (not state) (eql state 'up-to-date)) - (let ((line (vc-fossil--run "changes" "--classify" "--unchanged" "--renamed" - (file-truename file)))) - (setq state (and line (vc-fossil-state-code (car (split-string line))))))) + (setq state (vc-fossil-state-code (cdr (assoc file vc-fossil--file-classifications))))) (push (list file state) result))) (forward-line))) ;; now collect untracked files @@ -264,8 +275,6 @@ If `files` is nil return the status for all files." (concat (propertize name 'face 'font-lock-type-face) (propertize value 'face 'font-lock-variable-name-face))) -(defun vc-fossil-checkout-model (files) 'implicit) - (defun vc-fossil-dir-extra-headers (dir) (let ((info (vc-fossil--run "info")) (settings (vc-fossil--run "settings"))