diff options
Diffstat (limited to 'lisp/vc/vc-hg.el')
-rw-r--r-- | lisp/vc/vc-hg.el | 129 |
1 files changed, 58 insertions, 71 deletions
diff --git a/lisp/vc/vc-hg.el b/lisp/vc/vc-hg.el index c8b811feecc..e65009db2ef 100644 --- a/lisp/vc/vc-hg.el +++ b/lisp/vc/vc-hg.el @@ -43,29 +43,22 @@ ;; STATE-QUERYING FUNCTIONS ;; * registered (file) OK ;; * state (file) OK -;; - state-heuristic (file) NOT NEEDED -;; - dir-status (dir update-function) OK -;; - dir-status-files (dir files ds uf) OK +;; - dir-status-files (dir files uf) OK ;; - dir-extra-headers (dir) OK ;; - dir-printer (fileinfo) OK ;; * working-revision (file) OK -;; - latest-on-branch-p (file) ?? ;; * checkout-model (files) OK -;; - workfile-unchanged-p (file) OK ;; - mode-line-string (file) NOT NEEDED ;; STATE-CHANGING FUNCTIONS ;; * register (files &optional rev comment) OK ;; * create-repo () OK -;; - init-revision () NOT NEEDED ;; - responsible-p (file) OK -;; - could-register (file) OK ;; - receive-file (file rev) ?? PROBABLY NOT NEEDED ;; - unregister (file) OK ;; * checkin (files rev comment) OK ;; * find-revision (file rev buffer) OK -;; * checkout (file &optional editable rev) OK +;; * checkout (file &optional rev) OK ;; * revert (file &optional contents-done) OK -;; - rollback (files) ?? PROBABLY NOT NEEDED ;; - merge (file rev1 rev2) NEEDED ;; - merge-news (file) NEEDED ;; - steal-lock (file &optional revision) NOT NEEDED @@ -82,15 +75,13 @@ ;; - annotate-current-time () NOT NEEDED ;; - annotate-extract-revision-at-line () OK ;; TAG SYSTEM -;; - create-tag (dir name branchp) NEEDED -;; - retrieve-tag (dir name update) NEEDED +;; - create-tag (dir name branchp) OK +;; - retrieve-tag (dir name update) OK FIXME UPDATE BUFFERS ;; MISCELLANEOUS ;; - make-version-backups-p (file) ?? -;; - repository-hostname (dirname) ?? ;; - previous-revision (file rev) OK ;; - next-revision (file rev) OK ;; - check-headers () ?? -;; - clear-headers () ?? ;; - delete-file (file) TEST IT ;; - rename-file (old new) OK ;; - find-file-hook () added for bug#10709 @@ -195,6 +186,7 @@ highlighting the Log View buffer." (defun vc-hg-state (file) "Hg-specific version of `vc-state'." + (setq file (expand-file-name file)) (let* ((status nil) (default-directory (file-name-directory file)) @@ -211,34 +203,28 @@ highlighting the Log View buffer." (append (list "TERM=dumb" "LANGUAGE=C" "HGPLAIN=1") process-environment))) - (if (file-remote-p file) - (process-file - "env" nil t nil - "HGPLAIN=1" vc-hg-program - "--config" "alias.status=status" - "--config" "defaults.status=" - "status" "-A" (file-relative-name file)) - (process-file - vc-hg-program nil t nil - "--config" "alias.status=status" - "--config" "defaults.status=" - "status" "-A" (file-relative-name file)))) + (process-file + vc-hg-program nil t nil + "--config" "alias.status=status" + "--config" "defaults.status=" + "status" "-A" (file-relative-name file))) ;; Some problem happened. E.g. We can't find an `hg' ;; executable. (error nil))))))) - (when (eq 0 status) - (when (null (string-match ".*: No such file or directory$" out)) - (let ((state (aref out 0))) - (cond - ((eq state ?=) 'up-to-date) - ((eq state ?A) 'added) - ((eq state ?M) 'edited) - ((eq state ?I) 'ignored) - ((eq state ?R) 'removed) - ((eq state ?!) 'missing) - ((eq state ??) 'unregistered) - ((eq state ?C) 'up-to-date) ;; Older mercurial versions use this. - (t 'up-to-date))))))) + (when (and (eq 0 status) + (> (length out) 0) + (null (string-match ".*: No such file or directory$" out))) + (let ((state (aref out 0))) + (cond + ((eq state ?=) 'up-to-date) + ((eq state ?A) 'added) + ((eq state ?M) 'edited) + ((eq state ?I) 'ignored) + ((eq state ?R) 'removed) + ((eq state ?!) 'missing) + ((eq state ??) 'unregistered) + ((eq state ?C) 'up-to-date) ;; Older mercurial versions use this. + (t 'up-to-date)))))) (defun vc-hg-working-revision (file) "Hg-specific version of `vc-working-revision'." @@ -327,7 +313,7 @@ If LIMIT is non-nil, show no more than this many entries." (autoload 'vc-switches "vc") -(defun vc-hg-diff (files &optional oldvers newvers buffer) +(defun vc-hg-diff (files &optional oldvers newvers buffer async) "Get a difference report using hg between two revisions of FILES." (let* ((firstfile (car files)) (working (and firstfile (vc-working-revision firstfile)))) @@ -335,7 +321,10 @@ If LIMIT is non-nil, show no more than this many entries." (setq oldvers nil)) (when (and (not oldvers) newvers) (setq oldvers working)) - (apply #'vc-hg-command (or buffer "*vc-diff*") nil files "diff" + (apply #'vc-hg-command + (or buffer "*vc-diff*") + (if async 'async nil) + files "diff" (append (vc-switches 'hg 'diff) (when oldvers @@ -396,8 +385,26 @@ Optional arg REVISION is a revision to annotate from." (if (match-beginning 3) (match-string-no-properties 1) (cons (match-string-no-properties 1) - (expand-file-name (match-string-no-properties 4) - (vc-hg-root default-directory))))))) + (expand-file-name (match-string-no-properties 4) + (vc-hg-root default-directory))))))) + +;;; Tag system + +(defun vc-hg-create-tag (dir name branchp) + "Attach the tag NAME to the state of the working copy." + (let ((default-directory dir)) + (and (vc-hg-command nil 0 nil "status") + (vc-hg-command nil 0 nil (if branchp "bookmark" "tag") name)))) + +(defun vc-hg-retrieve-tag (dir name _update) + "Retrieve the version tagged by NAME of all registered files at or below DIR." + (let ((default-directory dir)) + (vc-hg-command nil 0 nil "update" name) + ;; FIXME: update buffers if `update' is true + ;; TODO: update *vc-change-log* buffer so can see @ if --graph + )) + +;;; Miscellaneous (defun vc-hg-previous-revision (_file rev) (let ((newrev (1- (string-to-number rev)))) @@ -430,10 +437,8 @@ Optional arg REVISION is a revision to annotate from." "Rename file from OLD to NEW using `hg mv'." (vc-hg-command nil 0 new "mv" old)) -(defun vc-hg-register (files &optional _rev _comment) - "Register FILES under hg. -REV is ignored. -COMMENT is ignored." +(defun vc-hg-register (files &optional _comment) + "Register FILES under hg. COMMENT is ignored." (vc-hg-command nil 0 files "add")) (defun vc-hg-create-repo () @@ -442,24 +447,13 @@ COMMENT is ignored." (defalias 'vc-hg-responsible-p 'vc-hg-root) -;; Modeled after the similar function in vc-bzr.el -(defun vc-hg-could-register (file) - "Return non-nil if FILE could be registered under hg." - (and (vc-hg-responsible-p file) ; shortcut - (condition-case () - (with-temp-buffer - (vc-hg-command t nil file "add" "--dry-run")) - ;; The command succeeds with no output if file is - ;; registered. - (error)))) - (defun vc-hg-unregister (file) "Unregister FILE from hg." (vc-hg-command nil 0 file "forget")) (declare-function log-edit-extract-headers "log-edit" (headers string)) -(defun vc-hg-checkin (files _rev comment) +(defun vc-hg-checkin (files comment) "Hg-specific version of `vc-backend-checkin'. REV is ignored." (apply 'vc-hg-command nil 0 files @@ -481,7 +475,7 @@ REV is ignored." (vc-hg-root file))) ;; Modeled after the similar function in vc-bzr.el -(defun vc-hg-checkout (file &optional _editable rev) +(defun vc-hg-checkout (file &optional rev) "Retrieve a revision of FILE. EDITABLE is ignored. REV is the revision to check out into WORKFILE." @@ -522,10 +516,6 @@ REV is the revision to check out into WORKFILE." ;; Modeled after the similar function in vc-bzr.el -(defun vc-hg-workfile-unchanged-p (file) - (eq 'up-to-date (vc-hg-state file))) - -;; Modeled after the similar function in vc-bzr.el (defun vc-hg-revert (file &optional contents-done) (unless contents-done (with-temp-buffer (vc-hg-command t 0 file "revert")))) @@ -622,15 +612,12 @@ REV is the revision to check out into WORKFILE." ;; Follows vc-exec-after. (declare-function vc-set-async-update "vc-dispatcher" (process-buffer)) -(defun vc-hg-dir-status (dir update-function) - (vc-hg-command (current-buffer) 'async dir "status" "-C") - (vc-run-delayed - (vc-hg-after-dir-status update-function))) - -(defun vc-hg-dir-status-files (dir files _default-state update-function) - (apply 'vc-hg-command (current-buffer) 'async dir "status" "-mardui" "-C" files) +(defun vc-hg-dir-status-files (dir files update-function) + (apply 'vc-hg-command (current-buffer) 'async dir "status" + (concat "-mardu" (if files "i")) + "-C" files) (vc-run-delayed - (vc-hg-after-dir-status update-function))) + (vc-hg-after-dir-status update-function))) (defun vc-hg-dir-extra-header (name &rest commands) (concat (propertize name 'face 'font-lock-type-face) |