Use faster option for running vc-hg status (Bug#63470)

In modern Mercurial, removing the "re:" "-I" "." options provides a
10x-20x speedup because it allows the Rust implementation of "hg
status" to be used.

* lisp/vc/vc-hg.el (vc-hg--program-version): Add.
(vc-hg-dir-status-files): Use --config commands.status.relative=1 to
make paths relative when available.
This commit is contained in:
Spencer Baugh 2023-05-12 15:28:06 -04:00 committed by Dmitry Gutov
parent f33b301c29
commit d4ff1d7420

View file

@ -1372,17 +1372,28 @@ REV is the revision to check out into WORKFILE."
;; Follows vc-exec-after.
(declare-function vc-set-async-update "vc-dispatcher" (process-buffer))
(defvar vc-hg--program-version nil)
(defun vc-hg--program-version ()
(or vc-hg--program-version
(setq vc-hg--program-version
(with-temp-buffer
(condition-case _ (vc-hg-command t 0 nil "version")
(error "0")
(:success
(goto-char (point-min))
(re-search-forward "Mercurial Distributed SCM (version \\([0-9][0-9.]+\\)")
(string-trim-right (match-string 1) "\\.")))))))
(defun vc-hg-dir-status-files (dir files update-function)
;; XXX: We can't pass DIR directly to 'hg status' because that
;; returns all ignored files if FILES is non-nil (bug#22481).
(let ((default-directory dir))
;; TODO: Use "--config 'status.relative=1'" instead of "re:"
;; when we're allowed to depend on Mercurial 4.2+
;; (it's a bit faster).
(vc-hg-command (current-buffer) 'async files
"status" "re:" "-I" "."
(concat "-mardu" (if files "i"))
"-C"))
(apply #'vc-hg-command (current-buffer) 'async files
"status" (concat "-mardu" (if files "i")) "-C"
(if (version<= "4.2" (vc-hg--program-version))
'("--config" "commands.status.relative=1")
'("re:" "-I" "."))))
(vc-run-delayed
(vc-hg-after-dir-status update-function)))