summaryrefslogtreecommitdiff
path: root/lisp/vc/vc-hg.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/vc/vc-hg.el')
-rw-r--r--lisp/vc/vc-hg.el52
1 files changed, 32 insertions, 20 deletions
diff --git a/lisp/vc/vc-hg.el b/lisp/vc/vc-hg.el
index 2deac2aae27..14df9d8b673 100644
--- a/lisp/vc/vc-hg.el
+++ b/lisp/vc/vc-hg.el
@@ -101,12 +101,12 @@
;;; Code:
+(require 'cl-lib)
+
(eval-when-compile
(require 'vc)
(require 'vc-dir))
-(require 'cl-lib)
-
(declare-function vc-compilation-mode "vc-dispatcher" (backend))
;;; Customization options
@@ -175,6 +175,10 @@ highlighting the Log View buffer."
:version "24.5")
+;; Clear up the cache to force vc-call to check again and discover
+;; new functions when we reload this file.
+(put 'Hg 'vc-functions nil)
+
;;; Properties of the backend
(defvar vc-hg-history nil)
@@ -1012,8 +1016,8 @@ hg binary."
(not (vc-hg--requirements-understood-p repo))
;; Dirstate too small to be valid
(< (nth 7 dirstate-attr) 40)
- ;; We want to store 32-bit unsigned values in fixnums
- (< most-positive-fixnum 4294967295)
+ ;; We want to store 32-bit unsigned values in fixnums.
+ (zerop (lsh -1 32))
(progn
(setf repo-relative-filename
(file-relative-name truename repo))
@@ -1296,12 +1300,8 @@ REV is the revision to check out into WORKFILE."
(vc-hg-command buffer 1 nil "outgoing" "-n" (unless (string= remote-location "")
remote-location)))
-(defvar vc-hg-error-regexp-alist nil
- ;; 'hg pull' does not list modified files, so, for now, the only
- ;; benefit of `vc-compilation-mode' is that one can get rid of
- ;; *vc-hg* buffer with 'q' or 'z'.
- ;; TODO: call 'hg incoming' before pull/merge to get the list of
- ;; modified files
+(defvar vc-hg-error-regexp-alist
+ '(("^M \\(.+\\)" 1 nil nil 0))
"Value of `compilation-error-regexp-alist' in *vc-hg* buffers.")
(autoload 'vc-do-async-command "vc-dispatcher")
@@ -1309,9 +1309,10 @@ REV is the revision to check out into WORKFILE."
(defvar compilation-directory)
(defvar compilation-arguments) ; defined in compile.el
-(defun vc-hg--pushpull (command prompt &optional obsolete)
+(defun vc-hg--pushpull (command prompt post-processing &optional obsolete)
"Run COMMAND (a string; either push or pull) on the current Hg branch.
If PROMPT is non-nil, prompt for the Hg command to run.
+POST-PROCESSING is a list of commands to execute after the command.
If OBSOLETE is non-nil, behave like the old versions of the Hg push/pull
commands, which only operated on marked files."
(let (marked-list)
@@ -1327,18 +1328,14 @@ commands, which only operated on marked files."
(let* ((root (vc-hg-root default-directory))
(buffer (format "*vc-hg : %s*" (expand-file-name root)))
(hg-program vc-hg-program)
- ;; Fixme: before updating the working copy to the latest
- ;; state, should check if it's visiting an old revision.
- (args (if (equal command "pull") '("-u"))))
+ args)
;; If necessary, prompt for the exact command.
;; TODO if pushing, prompt if no default push location - cf bzr.
(when prompt
(setq args (split-string
(read-shell-command
(format "Hg %s command: " command)
- (format "%s %s%s" hg-program command
- (if (not args) ""
- (concat " " (mapconcat 'identity args " "))))
+ (format "%s %s" hg-program command)
'vc-hg-history)
" " t))
(setq hg-program (car args)
@@ -1347,10 +1344,17 @@ commands, which only operated on marked files."
(apply 'vc-do-async-command buffer root hg-program command args)
(with-current-buffer buffer
(vc-run-delayed
+ (dolist (cmd post-processing)
+ (apply 'vc-do-command buffer nil hg-program nil cmd))
(vc-compilation-mode 'hg)
(setq-local compile-command
(concat hg-program " " command " "
- (if args (mapconcat 'identity args " ") "")))
+ (mapconcat 'identity args " ")
+ (mapconcat (lambda (args)
+ (concat " && " hg-program " "
+ (mapconcat 'identity
+ args " ")))
+ post-processing "")))
(setq-local compilation-directory root)
;; Either set `compilation-buffer-name-function' locally to nil
;; or use `compilation-arguments' to set `name-function'.
@@ -1371,7 +1375,15 @@ specific Mercurial pull command. The default is \"hg pull -u\",
which fetches changesets from the default remote repository and
then attempts to update the working directory."
(interactive "P")
- (vc-hg--pushpull "pull" prompt (called-interactively-p 'interactive)))
+ (vc-hg--pushpull "pull" prompt
+ ;; Fixme: before updating the working copy to the latest
+ ;; state, should check if it's visiting an old revision.
+ ;; post-processing: list modified files and update
+ ;; NB: this will not work with "pull = --rebase"
+ ;; or "pull = --update" in hgrc.
+ '(("--pager" "no" "status" "--rev" "." "--rev" "tip")
+ ("update"))
+ (called-interactively-p 'interactive)))
(defun vc-hg-push (prompt)
"Push changes from the current Mercurial branch.
@@ -1381,7 +1393,7 @@ for the Hg command to run.
If called interactively with a set of marked Log View buffers,
call \"hg push -r REVS\" to push the specified revisions REVS."
(interactive "P")
- (vc-hg--pushpull "push" prompt (called-interactively-p 'interactive)))
+ (vc-hg--pushpull "push" prompt nil (called-interactively-p 'interactive)))
(defun vc-hg-merge-branch ()
"Merge incoming changes into the current working directory.