Mercurial > emacs
diff lisp/vc-hg.el @ 81726:b7c76df62fba
(vc-hg-root): New function.
(vc-hg-registered): Use it.
(vc-hg-diff-tree): New defalias.
(vc-hg-responsible-p): Likewise.
(vc-hg-checkout): Comment out, not needed.
(vc-hg-delete-file, vc-hg-rename-file, vc-hg-could-register)
(vc-hg-find-version, vc-hg-next-version): New functions.
author | Dan Nicolaescu <dann@ics.uci.edu> |
---|---|
date | Fri, 06 Jul 2007 21:14:21 +0000 |
parents | 88604a3ac7e4 |
children | d4e68ecdb000 |
line wrap: on
line diff
--- a/lisp/vc-hg.el Fri Jul 06 17:29:20 2007 +0000 +++ b/lisp/vc-hg.el Fri Jul 06 21:14:21 2007 +0000 @@ -35,15 +35,70 @@ ;;; Todo: -;; Implement the rest of the vc interface: -;; - dired -;; - snapshot? +;; Implement the rest of the vc interface. See the comment at the +;; beginning of vc.el. The current status is: + +;; FUNCTION NAME STATUS +;; * registered (file) OK +;; * state (file) OK +;; - state-heuristic (file) ?? PROBABLY NOT NEEDED +;; - dir-state (dir) NEEDED +;; * workfile-version (file) OK +;; - latest-on-branch-p (file) ?? +;; * checkout-model (file) OK +;; - workfile-unchanged-p (file) ?? +;; - mode-line-string (file) NOT NEEDED +;; - dired-state-info (file) NEEDED +;; STATE-CHANGING FUNCTIONS +;; * register (file &optional rev comment) OK +;; - init-version () NOT NEEDED +;; - responsible-p (file) OK +;; - could-register (file) OK +;; - receive-file (file rev) ?? PROBABLY NOT NEEDED +;; - unregister (file) COMMENTED OUT, MAY BE INCORRECT +;; * checkin (file rev comment) OK +;; * find-version (file rev buffer) OK +;; * checkout (file &optional editable rev) NOT NEEDED, COMMENTED OUT +;; * revert (file &optional contents-done) OK +;; - cancel-version (file editable) ?? PROBABLY NOT NEEDED +;; - merge (file rev1 rev2) NEEDED +;; - merge-news (file) NEEDED +;; - steal-lock (file &optional version) NOT NEEDED +;; HISTORY FUNCTIONS +;; * print-log (file &optional buffer) OK +;; - log-view-mode () OK +;; - show-log-entry (version) NOT NEEDED, DEFAULT IS GOOD +;; - wash-log (file) ?? +;; - logentry-check () NOT NEEDED +;; - comment-history (file) NOT NEEDED +;; - update-changelog (files) NOT NEEDED +;; * diff (file &optional rev1 rev2 buffer) OK +;; - revision-completion-table (file) ?? +;; - diff-tree (dir &optional rev1 rev2) TEST IT +;; - annotate-command (file buf &optional rev) OK +;; - annotate-time () OK +;; - annotate-current-time () ?? NOT NEEDED +;; - annotate-extract-revision-at-line () OK +;; SNAPSHOT SYSTEM +;; - create-snapshot (dir name branchp) NEEDED (probably branch?) +;; - assign-name (file name) NOT NEEDED +;; - retrieve-snapshot (dir name update) ?? NEEDED?? +;; MISCELLANEOUS +;; - make-version-backups-p (file) ?? +;; - repository-hostname (dirname) ?? +;; - previous-version (file rev) OK +;; - next-version (file rev) OK +;; - check-headers () ?? +;; - clear-headers () ?? +;; - delete-file (file) TEST IT +;; - rename-file (old new) OK +;; - find-file-hook () PROBABLY NOT NEEDED +;; - find-file-not-found-hook () PROBABLY NOT NEEDED ;; Implement Stefan Monnier's advice: ;; vc-hg-registered and vc-hg-state ;; Both of those functions should be super extra careful to fail gracefully in -;; unexpected circumstances. The most important such case is when the `hg' -;; executable is not available. The reason this is important is that any error +;; unexpected circumstances. The reason this is important is that any error ;; there will prevent the user from even looking at the file :-( ;; Ideally, just like in vc-arch and vc-cvs, checking that the file is under ;; mercurial's control and extracting the current revision should be done @@ -67,7 +122,7 @@ (repeat :tag "Argument List" :value ("") string)) -;; :version "22.2" + :version "22.2" :group 'vc) ;;; State querying functions @@ -82,7 +137,7 @@ ;; Modelled after the similar function in vc-bzr.el (defun vc-hg-registered (file) "Return non-nil if FILE is registered with hg." - (if (vc-find-root file ".hg") ; short cut + (if (vc-hg-root file) ; short cut (vc-hg-state file))) ; expensive (defun vc-hg-state (file) @@ -198,6 +253,8 @@ (list "")) (list (file-name-nondirectory file)))))) +(defalias 'vc-hg-diff-tree 'vc-hg-diff) + (defun vc-hg-annotate-command (file buffer &optional version) "Execute \"hg annotate\" on FILE, inserting the contents in BUFFER. Optional arg VERSION is a version to annotate from." @@ -229,30 +286,83 @@ (when (>= newrev 0) (number-to-string newrev)))) +(defun vc-hg-next-version (file rev) + (let ((newrev (1+ (string-to-number rev))) + (tip-version + (with-temp-buffer + (vc-hg-command t nil nil "tip") + (goto-char (point-min)) + (re-search-forward "^changeset:[ \t]*\\([0-9]+\\):") + (string-to-number (match-string-no-properties 1))))) + ;; We don't want to exceed the maximum possible version number, ie + ;; the tip version. + (when (<= newrev tip-version) + (number-to-string newrev)))) + +;; Modelled after the similar function in vc-bzr.el +(defun vc-hg-delete-file (file) + "Delete FILE and delete it in the hg repository." + (condition-case () + (delete-file file) + (file-error nil)) + (vc-hg-command nil nil file "remove" "--after" "--force")) + +;; Modelled after the similar function in vc-bzr.el +(defun vc-hg-rename-file (old new) + "Rename file from OLD to NEW using `hg mv'." + (vc-hg-command nil nil new old "mv")) + (defun vc-hg-register (file &optional rev comment) "Register FILE under hg. REV is ignored. COMMENT is ignored." (vc-hg-command nil nil file "add")) +(defalias 'vc-hg-responsible-p 'vc-hg-root) + +;; Modelled 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)))) + +;; XXX This would remove the file. Is that correct? +;; (defun vc-hg-unregister (file) +;; "Unregister FILE from hg." +;; (vc-hg-command nil nil file "remove")) + (defun vc-hg-checkin (file rev comment) "HG-specific version of `vc-backend-checkin'. REV is ignored." (vc-hg-command nil nil file "commit" "-m" comment)) -;; Modelled after the similar function in vc-bzr.el -(defun vc-hg-checkout (file &optional editable rev workfile) - "Retrieve a revision of FILE into a WORKFILE. -EDITABLE is ignored. -REV is the revision to check out into WORKFILE." - (unless workfile - (setq workfile (vc-version-backup-file-name file rev))) +(defun vc-hg-find-version (file rev buffer) (let ((coding-system-for-read 'binary) (coding-system-for-write 'binary)) - (with-temp-file workfile (if rev - (vc-hg-command t nil file "cat" "-r" rev) - (vc-hg-command t nil file "cat"))))) + (vc-hg-command buffer nil file "cat" "-r" rev) + (vc-hg-command buffer nil file "cat")))) + +;; Modelled after the similar function in vc-bzr.el +;; This should not be needed, `vc-hg-find-version' provides the same +;; functionality. +;; (defun vc-hg-checkout (file &optional editable rev workfile) +;; "Retrieve a revision of FILE into a WORKFILE. +;; EDITABLE is ignored. +;; REV is the revision to check out into WORKFILE." +;; (unless workfile +;; (setq workfile (vc-version-backup-file-name file rev))) +;; (let ((coding-system-for-read 'binary) +;; (coding-system-for-write 'binary)) +;; (with-temp-file workfile +;; (if rev +;; (vc-hg-command t nil file "cat" "-r" rev) +;; (vc-hg-command t nil file "cat"))))) (defun vc-hg-checkout-model (file) 'implicit) @@ -274,6 +384,9 @@ (append vc-hg-global-switches flags)))) +(defun vc-hg-root (file) + (vc-find-root file ".hg")) + (provide 'vc-hg) ;;; vc-hg.el ends here