emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/vc-hg.el,v


From: Dan Nicolaescu
Subject: [Emacs-diffs] Changes to emacs/lisp/vc-hg.el,v
Date: Wed, 20 Jun 2007 06:32:44 +0000

CVSROOT:        /cvsroot/emacs
Module name:    emacs
Changes by:     Dan Nicolaescu <dann>   07/06/20 06:32:42

Index: vc-hg.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/vc-hg.el,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- vc-hg.el    20 Jun 2007 05:59:40 -0000      1.1
+++ vc-hg.el    20 Jun 2007 06:32:41 -0000      1.2
@@ -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,v 1.1 2007/06/20 05:59:40 dann Exp $
+;; 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]