changeset 81526:145f53e0ff66

Add to do items. (vc-hg-diff): Add support for comparing different revisions. (vc-hg-diff, vc-hg-annotate-command, vc-hg-annotate-time) (vc-hg-annotate-extract-revision-at-line) (vc-hg-previous-version, vc-hg-checkin): New functions. (vc-hg-annotate-re): New constant.
author Dan Nicolaescu <dann@ics.uci.edu>
date Thu, 21 Jun 2007 05:44:54 +0000
parents 225a1895f8dd
children 2c694b2926c7
files lisp/ChangeLog lisp/vc-hg.el
diffstat 2 files changed, 64 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Thu Jun 21 03:29:18 2007 +0000
+++ b/lisp/ChangeLog	Thu Jun 21 05:44:54 2007 +0000
@@ -1,3 +1,12 @@
+2007-06-21  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	* vc-hg.el: Add to do items.
+	(vc-hg-diff): Add support for comparing different revisions.
+	(vc-hg-diff, vc-hg-annotate-command, vc-hg-annotate-time)
+	(vc-hg-annotate-extract-revision-at-line)
+	(vc-hg-previous-version, vc-hg-checkin): New functions.
+	(vc-hg-annotate-re): New constant.
+
 2007-06-20  Jay Belanger  <jay.p.belanger@gmail.com>
 
 	* calc/calc.el (math-standard-ops): Fix precedence of
--- a/lisp/vc-hg.el	Thu Jun 21 03:29:18 2007 +0000
+++ b/lisp/vc-hg.el	Thu Jun 21 05:44:54 2007 +0000
@@ -35,7 +35,10 @@
 
 ;;; Todo:
 
-;; Implement the rest of the vc interface
+;; Implement the rest of the vc interface:
+;; - regexps for log-view to understand the "hg log" output
+;; - dired
+;; - snapshot?
 
 ;; Implement Stefan Monnier's advice: 
 ;; vc-hg-registered and vc-hg-state
@@ -108,15 +111,53 @@
    (if (and (vc-stay-local-p file) (fboundp 'start-process)) 'async 0)
    file "log"))
 
-(defun vc-hg-diff (file &optional oldvers newvers buffers)
+(defun vc-hg-diff (file &optional oldvers newvers buffer)
   "Get a difference report using hg between two versions of FILE."
-  (when buffers (message buffers))
-  (unless buffers (setq buffers "*vc-diff*"))
-  (when oldvers (message oldvers))
-  (when newvers (message newvers))
-  (call-process "hg" nil buffers nil
-                "--cwd" (file-name-directory file)
-                "diff" (file-name-nondirectory file)))
+  (let ((working (vc-workfile-version file)))
+    (if (and (equal oldvers working) (not newvers))
+	(setq oldvers nil))
+    (if (and (not oldvers) newvers)
+	(setq oldvers working))
+    (apply 'call-process "hg" nil (or buffer "*vc-diff*") nil
+	   "--cwd" (file-name-directory file) "diff" 
+	   (append 
+	    (if oldvers
+		(if newvers
+		    (list "-r" oldvers "-r" newvers)
+		  (list "-r" oldvers))
+	      (list ""))
+	   (list (file-name-nondirectory file))))))
+
+(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."
+  (vc-hg-command buffer 0 file "annotate" "-d" "-n" (if version (concat "-r" version)))
+  (with-current-buffer buffer
+    (goto-char (point-min))
+    (re-search-forward "^[0-9]")
+    (delete-region (point-min) (1- (point)))))
+
+
+;;; The format for one line output by "hg annotate -d -n" looks like this:
+;;;215 Wed Jun 20 21:22:58 2007 -0700: CONTENTS
+;;; i.e: VERSION_NUMBER DATE: CONTENTS
+(defconst vc-hg-annotate-re "^[ \t]*\\([0-9]+\\) \\(.\\{30\\}\\): ")
+
+(defun vc-hg-annotate-time ()
+  (when (looking-at vc-hg-annotate-re)
+    (goto-char (match-end 0))
+    (vc-annotate-convert-time 
+     (date-to-time (match-string-no-properties 2)))))
+
+(defun vc-hg-annotate-extract-revision-at-line ()
+  (save-excursion
+    (beginning-of-line)
+    (if (looking-at vc-hg-annotate-re) (match-string-no-properties 1))))
+
+(defun vc-hg-previous-version (file rev)
+  (let ((newrev (1- (string-to-number rev))))
+    (when (>= newrev 0)
+      (number-to-string newrev))))
 
 (defun vc-hg-register (file &optional rev comment)
   "Register FILE under hg.
@@ -124,6 +165,11 @@
 COMMENT is ignored."
   (vc-hg-command nil nil file "add"))
 
+(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.