Mercurial > emacs
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