changeset 81476:3dedb2297b98

(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.
author Dan Nicolaescu <dann@ics.uci.edu>
date Wed, 20 Jun 2007 06:32:42 +0000
parents d7d688f667ae
children 92dd41bc6130
files lisp/ChangeLog lisp/vc-hg.el
diffstat 2 files changed, 87 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Wed Jun 20 06:21:54 2007 +0000
+++ b/lisp/ChangeLog	Wed Jun 20 06:32:42 2007 +0000
@@ -1,3 +1,11 @@
+2007-06-20  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	* vc-hg.el (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.
+
 2007-06-20  Reto Zimmermann <reto@gnu.org>
 
 	* progmodes/vera-mode.el: New file.
--- a/lisp/vc-hg.el	Wed Jun 20 06:21:54 2007 +0000
+++ b/lisp/vc-hg.el	Wed Jun 20 06:32:42 2007 +0000
@@ -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 @@
            (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