summaryrefslogtreecommitdiff
path: root/lisp/vc-hg.el
diff options
context:
space:
mode:
authorDan Nicolaescu <dann@ics.uci.edu>2007-06-20 06:32:42 +0000
committerDan Nicolaescu <dann@ics.uci.edu>2007-06-20 06:32:42 +0000
commit248c66458e495ed4851f93811b43c47e151d9814 (patch)
tree17a84f14f9677e5936d1b239ff9b9568100d585a /lisp/vc-hg.el
parent37d4643c6002aa17b4b441b854e06380d0727c9e (diff)
downloademacs-248c66458e495ed4851f93811b43c47e151d9814.tar.gz
(vc-hg-global-switches): Simplify.
(vc-hg-state): Handle more states. (vc-hg-diff): Fix doc-string. (vc-hg-register): New function. (vc-hg-checkout): Likewise.
Diffstat (limited to 'lisp/vc-hg.el')
-rw-r--r--lisp/vc-hg.el111
1 files changed, 79 insertions, 32 deletions
diff --git a/lisp/vc-hg.el b/lisp/vc-hg.el
index 79296f8bbb9..a50b4f75d16 100644
--- a/lisp/vc-hg.el
+++ b/lisp/vc-hg.el
@@ -1,8 +1,10 @@
;;; vc-hg.el --- VC backend for the mercurial version control system
-;; Copyright (C) 2006 Ivan Kanis
+;; Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+
;; Author: Ivan Kanis
-;; $Id: vc-hg.el 1889 2007-06-17 12:39:26Z ivan $
+;; Keywords: tools
+;; Version: 1889
;;
;; This program is free software ; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -22,18 +24,38 @@
;; This is a mercurial version control backend
-;;; THANKS:
+;;; Thanks:
+
+;;; Bugs:
+
+;;; Installation:
+
+;;; Todo:
+
+;; Implement the rest of the vc interface
-;;; BUGS:
+;; 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
+;; 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
+;; without even using `hg' (this way even if you don't have `hg' installed,
+;; Emacs is able to tell you this file is under mercurial's control).
-;;; INSTALLATION:
+;;; History:
+;;
;;; Code:
(eval-when-compile
(require 'vc))
-;; (setq vc-handled-backends '(CVS SVN hg))
+;; XXX This should be moved to vc-hooks when the full vc interface is
+;; implemented.
+(add-to-list 'vc-handled-backends 'HG)
;;; Customization options
@@ -44,44 +66,36 @@
(repeat :tag "Argument List"
:value ("")
string))
- :version "22.1"
+;; :version "22.2"
:group 'vc)
;;; State querying functions
+;;; Modelled after the similar function in vc-bzr.el
(defun vc-hg-registered (file)
- "Return t if FILE is registered in Hg"
- (if (eq 0 (call-process "hg" nil nil nil
- "--cwd" (file-name-directory file)
- "status" (file-name-nondirectory file)))
- (vc-file-setprop file 'vc-name file) nil))
+ "Return non-nil if FILE is registered with hg."
+ (if (vc-find-root file ".hg") ; short cut
+ (vc-hg-state file))) ; expensive
(defun vc-hg-state (file)
- "Return state of files in Hg"
+ "Hg-specific version of `vc-state'."
(let ((out (vc-hg-internal-status file)))
(if (eq 0 (length out)) 'up-to-date
(let ((state (aref out 0)))
(cond
((eq state ?M) 'edited)
+ ((eq state ?A) 'edited)
((eq state ?P) 'needs-patch)
+ ((eq state ??) nil)
(t 'up-to-date))))))
(defun vc-hg-workfile-version (file)
- "Return version number of file"
+ "Hg-specific version of `vc-workfile-version'."
(let ((out (vc-hg-internal-log file)))
(if (string-match "changeset: *\\([0-9]*\\)" out)
(match-string 1 out)
"0")))
-(defun vc-hg-internal-log(file)
- "Return log of FILE"
- (with-output-to-string
- (with-current-buffer
- standard-output
- (call-process
- "hg" nil t nil "--cwd" (file-name-directory file)
- "log" "-l1" (file-name-nondirectory file)))))
-
;;; History functions
(defun vc-hg-print-log(file &optional buffer)
@@ -91,15 +105,6 @@
(if (and (vc-stay-local-p file) (fboundp 'start-process)) 'async 0)
file "log"))
-(defun vc-hg-internal-status(file)
- "Return status of FILE"
- (with-output-to-string
- (with-current-buffer
- standard-output
- (call-process
- "hg" nil t nil "--cwd" (file-name-directory file)
- "status" (file-name-nondirectory file)))))
-
(defun vc-hg-diff (file &optional oldvers newvers buffers)
"Get a difference report using hg between two versions of FILE."
(when buffers (message buffers))
@@ -110,6 +115,29 @@
"--cwd" (file-name-directory file)
"diff" (file-name-nondirectory file)))
+(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"))
+
+;;; 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)))
+ (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)
+
;;; Internal functions
(defun vc-hg-command (buffer okstatus file &rest flags)
@@ -122,5 +150,24 @@ and that it passes `vc-hg-global-switches' to it before FLAGS."
(append vc-hg-global-switches
flags))))
+(defun vc-hg-internal-log (file)
+ "Return log of FILE."
+ (with-output-to-string
+ (with-current-buffer
+ standard-output
+ (call-process
+ "hg" nil t nil "--cwd" (file-name-directory file)
+ "log" "-l1" (file-name-nondirectory file)))))
+
+(defun vc-hg-internal-status(file)
+ "Return status of FILE."
+ (with-output-to-string
+ (with-current-buffer
+ standard-output
+ (call-process
+ "hg" nil t nil "--cwd" (file-name-directory file)
+ "status" (file-name-nondirectory file)))))
+
(provide 'vc-hg)
+;;; vc-hg.el ends here