]> code.delx.au - gnu-emacs/blobdiff - lisp/vc-hg.el
Fix typos.
[gnu-emacs] / lisp / vc-hg.el
index 9ced663fadea297d85a4748edc37e6f80bb04c95..b6e1d39c2ff38c0cf6d3a6f976a45132f1f1926d 100644 (file)
@@ -1,6 +1,6 @@
 ;;; vc-hg.el --- VC backend for the mercurial version control system
 
-;; Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+;; Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
 ;; Author: Ivan Kanis
 ;; Keywords: tools
@@ -68,7 +68,7 @@
 ;; - merge-news (file)                         NEEDED
 ;; - steal-lock (file &optional revision)      NOT NEEDED
 ;; HISTORY FUNCTIONS
-;; * print-log (files &optional buffer shortlog)OK
+;; * print-log (files buffer &optional shortlog start-revision limit) OK
 ;; - log-view-mode ()                          OK
 ;; - show-log-entry (revision)                 NOT NEEDED, DEFAULT IS GOOD
 ;; - comment-history (file)                    NOT NEEDED
@@ -159,6 +159,7 @@ If nil, use the value of `vc-diff-switches'.  If t, use no switches."
   "Hg-specific version of `vc-state'."
   (let*
       ((status nil)
+       (default-directory (file-name-directory file))
        (out
         (with-output-to-string
           (with-current-buffer
@@ -166,9 +167,13 @@ If nil, use the value of `vc-diff-switches'.  If t, use no switches."
             (setq status
                   (condition-case nil
                       ;; Ignore all errors.
-                      (call-process
-                       "hg" nil t nil "--cwd" (file-name-directory file)
-                       "status" "-A" (file-name-nondirectory file))
+                     (let ((process-environment
+                            ;; Avoid localization of messages so we can parse the output.
+                            (append (list "TERM=dumb" "LANGUAGE=C" "HGRC=") process-environment)))
+
+                     (process-file
+                       "hg" nil t nil
+                       "status" "-A" (file-relative-name file)))
                     ;; Some problem happened.  E.g. We can't find an `hg'
                     ;; executable.
                     (error nil)))))))
@@ -190,23 +195,25 @@ If nil, use the value of `vc-diff-switches'.  If t, use no switches."
   "Hg-specific version of `vc-working-revision'."
   (let*
       ((status nil)
+       (default-directory (file-name-directory file))
        (out
         (with-output-to-string
           (with-current-buffer
               standard-output
             (setq status
                   (condition-case nil
-                      ;; Ignore all errors.
-                      (call-process
-                       "hg" nil t nil "--cwd" (file-name-directory file)
-                       "log" "-l1" (file-name-nondirectory file))
+                     (let ((process-environment
+                            ;; Avoid localization of messages so we can parse the output.
+                            (append (list "TERM=dumb" "LANGUAGE=C" "HGRC=")
+                                    process-environment)))
+                       ;; Ignore all errors.
+                       (process-file
+                        "hg" nil t nil
+                        "parent" "--template" "{rev}" (file-relative-name file)))
                     ;; Some problem happened.  E.g. We can't find an `hg'
                     ;; executable.
                     (error nil)))))))
-    (when (eq 0 status)
-      (if (string-match "changeset: *\\([0-9]*\\)" out)
-          (match-string 1 out)
-        "0"))))
+    (when (eq 0 status) out)))
 
 ;;; History functions
 
@@ -217,12 +224,8 @@ If nil, use the value of `vc-diff-switches'.  If t, use no switches."
                  (repeat :tag "Argument List" :value ("") string))
   :group 'vc-hg)
 
-(defun vc-hg-print-log (files &optional buffer shortlog)
+(defun vc-hg-print-log (files buffer &optional shortlog start-revision limit)
   "Get change log associated with FILES."
-  ;; `log-view-mode' needs to have the file names in order to function
-  ;; correctly. "hg log" does not print it, so we insert it here by
-  ;; hand.
-
   ;; `vc-do-command' creates the buffer, but we need it before running
   ;; the command.
   (vc-setup-buffer buffer)
@@ -232,9 +235,11 @@ If nil, use the value of `vc-diff-switches'.  If t, use no switches."
     (with-current-buffer
        buffer
       (apply 'vc-hg-command buffer 0 files "log"
-            (if shortlog
-                 (append '("--style" "compact") vc-hg-log-switches)
-                 vc-hg-log-switches)))))
+            (append
+             (when start-revision (list (format "-r%s:" start-revision)))
+             (when limit (list "-l" (format "%s" limit)))
+             (when shortlog '("--style" "compact"))
+             vc-hg-log-switches)))))
 
 (defvar log-view-message-re)
 (defvar log-view-file-re)
@@ -277,17 +282,12 @@ If nil, use the value of `vc-diff-switches'.  If t, use no switches."
 (defun vc-hg-diff (files &optional oldvers newvers buffer)
   "Get a difference report using hg between two revisions of FILES."
   (let* ((firstfile (car files))
-         (cwd (if firstfile (file-name-directory firstfile)
-                (expand-file-name default-directory)))
          (working (and firstfile (vc-working-revision firstfile))))
     (when (and (equal oldvers working) (not newvers))
       (setq oldvers nil))
     (when (and (not oldvers) newvers)
       (setq oldvers working))
-    (apply #'vc-hg-command (or buffer "*vc-diff*") nil
-           (mapcar (lambda (file) (file-relative-name file cwd)) files)
-           "--cwd" cwd
-           "diff"
+    (apply #'vc-hg-command (or buffer "*vc-diff*") nil files "diff"
            (append
             (vc-switches 'hg 'diff)
             (when oldvers
@@ -313,12 +313,8 @@ If nil, use the value of `vc-diff-switches'.  If t, use no switches."
 (defun vc-hg-annotate-command (file buffer &optional revision)
   "Execute \"hg annotate\" on FILE, inserting the contents in BUFFER.
 Optional arg REVISION is a revision to annotate from."
-  (vc-hg-command buffer 0 file "annotate" "-d" "-n"
-                 (when revision (concat "-r" revision)))
-  (with-current-buffer buffer
-    (goto-char (point-min))
-    (re-search-forward "^[ \t]*[0-9]")
-    (delete-region (point-min) (match-beginning 0))))
+  (vc-hg-command buffer 0 file "annotate" "-d" "-n" "--follow"
+                 (when revision (concat "-r" revision))))
 
 (declare-function vc-annotate-convert-time "vc-annotate" (time))
 
@@ -329,7 +325,7 @@ Optional arg REVISION is a revision to annotate from."
 ;;215 Wed Jun 20 21:22:58 2007 -0700 foo.c: CONTENTS
 ;; i.e. VERSION_NUMBER DATE FILENAME: CONTENTS
 (defconst vc-hg-annotate-re
-  "^[ \t]*\\([0-9]+\\) \\(.\\{30\\}\\)[^:\n]*\\(:[^ \n][^:\n]*\\)*: ")
+  "^[ \t]*\\([0-9]+\\) \\(.\\{30\\}\\)\\(?:\\(: \\)\\|\\(?: +\\(.+\\): \\)\\)")
 
 (defun vc-hg-annotate-time ()
   (when (looking-at vc-hg-annotate-re)
@@ -340,7 +336,11 @@ Optional arg REVISION is a revision to annotate from."
 (defun vc-hg-annotate-extract-revision-at-line ()
   (save-excursion
     (beginning-of-line)
-    (when (looking-at vc-hg-annotate-re) (match-string-no-properties 1))))
+    (when (looking-at vc-hg-annotate-re)
+      (if (match-beginning 3)
+         (match-string-no-properties 1)
+       (cons (match-string-no-properties 1)
+             (expand-file-name (match-string-no-properties 4)))))))
 
 (defun vc-hg-previous-revision (file rev)
   (let ((newrev (1- (string-to-number rev))))
@@ -446,9 +446,15 @@ REV is the revision to check out into WORKFILE."
 
 (defun vc-hg-extra-status-menu () vc-hg-extra-menu-map)
 
-(define-derived-mode vc-hg-outgoing-mode vc-hg-log-view-mode "Hg-Outgoing")
+(defvar log-view-vc-backend)
+
+(define-derived-mode vc-hg-outgoing-mode vc-hg-log-view-mode "Hg-Outgoing"
+  "Mode for browsing Hg outgoing changes."
+  (set (make-local-variable 'log-view-vc-backend) 'Hg))
 
-(define-derived-mode vc-hg-incoming-mode vc-hg-log-view-mode "Hg-Incoming")
+(define-derived-mode vc-hg-incoming-mode vc-hg-log-view-mode "Hg-Incoming"
+  "Mode for browsing Hg incoming changes."
+  (set (make-local-variable 'log-view-vc-backend) 'Hg))
 
 (defstruct (vc-hg-extra-fileinfo
             (:copier nil)
@@ -569,14 +575,16 @@ REV is the revision to check out into WORKFILE."
 
 (defun vc-hg-outgoing ()
   (interactive)
-  (let ((bname "*Hg outgoing*") (vc-short-log nil))
+  (let ((bname "*Hg outgoing*")
+       (vc-short-log nil))
     (vc-hg-command bname 1 nil "outgoing" "-n")
     (pop-to-buffer bname)
     (vc-hg-outgoing-mode)))
 
 (defun vc-hg-incoming ()
   (interactive)
-  (let ((bname "*Hg incoming*") (vc-short-log nil))
+  (let ((bname "*Hg incoming*")
+       (vc-short-log nil))
     (vc-hg-command bname 0 nil "incoming" "-n")
     (pop-to-buffer bname)
     (vc-hg-incoming-mode)))