changeset 83759:493b2df20f41

(vc-hg-extra-menu-map): New variable. (vc-hg-extra-menu, vc-hg-outgoing, vc-hg-incoming, vc-hg-push) (vc-hg-pull): New functions. (vc-hg-outgoing-mode, vc-hg-incoming-mode): New derived modes.
author Dan Nicolaescu <dann@ics.uci.edu>
date Wed, 29 Aug 2007 18:15:16 +0000
parents 727d03075a75
children aa5347e75afa
files lisp/ChangeLog lisp/vc-hg.el
diffstat 2 files changed, 71 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Wed Aug 29 16:28:46 2007 +0000
+++ b/lisp/ChangeLog	Wed Aug 29 18:15:16 2007 +0000
@@ -1,5 +1,10 @@
 2007-08-29  Dan Nicolaescu  <dann@ics.uci.edu>
 
+	* vc-hg.el (vc-hg-extra-menu-map): New variable.
+	(vc-hg-extra-menu, vc-hg-outgoing, vc-hg-incoming, vc-hg-push)
+	(vc-hg-pull): New functions.
+	(vc-hg-outgoing-mode, vc-hg-incoming-mode): New derived modes.
+
 	* term/mac-win.el: Don't require url, only autoloaded url
 	functions are used in this file.
 
--- a/lisp/vc-hg.el	Wed Aug 29 16:28:46 2007 +0000
+++ b/lisp/vc-hg.el	Wed Aug 29 18:15:16 2007 +0000
@@ -257,8 +257,7 @@
 (defvar log-view-font-lock-keywords)
 
 (define-derived-mode vc-hg-log-view-mode log-view-mode "Hg-Log-View"
-  (require 'add-log) ;; we need the faces add-log
-  ;; Don't have file markers, so use impossible regexp.
+  (require 'add-log) ;; we need the add-log faces
   (set (make-local-variable 'log-view-file-re) "^File:[ \t]+\\(.+\\)")
   (set (make-local-variable 'log-view-message-re)
        "^changeset:[ \t]*\\([0-9]+\\):\\(.+\\)")
@@ -443,6 +442,71 @@
   (unless contents-done
     (with-temp-buffer (vc-hg-command t 0 file "revert"))))
 
+;;; Hg specific functionality.
+
+;;; XXX This functionality is experimental/work in progress. It might
+;;; change without notice.
+(defvar vc-hg-extra-menu-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [incoming] '(menu-item "Show incoming" vc-hg-incoming))
+    (define-key map [outgoing] '(menu-item "Show outgoing" vc-hg-outgoing))
+    map))
+
+(defun vc-hg-extra-menu () vc-hg-extra-menu-map)
+
+(define-derived-mode vc-hg-outgoing-mode vc-hg-log-view-mode "Hg-Outgoing")
+
+(define-derived-mode vc-hg-incoming-mode vc-hg-log-view-mode "Hg-Incoming")
+
+;; XXX this adds another top level menu, instead figure out how to
+;; replace the Log-View menu.
+(easy-menu-define log-view-mode-menu vc-hg-outgoing-mode-map
+  "Hg-outgoing Display Menu"
+  `("Hg-outgoing"
+    ["Push selected"  vc-hg-push]))
+
+(easy-menu-define log-view-mode-menu vc-hg-incoming-mode-map
+  "Hg-incoming Display Menu"
+  `("Hg-incoming"
+    ["Pull selected"  vc-hg-pull]))
+
+(defun vc-hg-outgoing ()
+  (interactive)
+  (let ((bname "*Hg outgoing*"))
+    (vc-hg-command bname 0 nil "outgoing" "-n")
+    (pop-to-buffer bname)
+    (vc-hg-outgoing-mode)))
+
+(defun vc-hg-incoming ()
+  (interactive)
+  (let ((bname "*Hg incoming*"))
+    (vc-hg-command bname 0 nil "incoming" "-n")
+    (pop-to-buffer bname)
+    (vc-hg-incoming-mode)))
+
+;; XXX maybe also add key bindings for these functions.
+(defun vc-hg-push ()
+  (interactive)
+  (let ((marked-list (log-view-get-marked)))
+    (if marked-list
+	(vc-hg-command 
+	 nil 0 nil
+	 (cons "push"
+	       (apply 'nconc
+		      (mapcar (lambda (arg) (list "-r" arg)) marked-list))))
+	 (error "No log entries selected for push"))))
+
+(defun vc-hg-pull ()
+  (interactive)
+  (let ((marked-list (log-view-get-marked)))
+    (if marked-list
+	(vc-hg-command 
+	 nil 0 nil
+	 (cons "pull"
+	       (apply 'nconc
+		      (mapcar (lambda (arg) (list "-r" arg)) marked-list))))
+      (error "No log entries selected for pull"))))
+
 ;;; Internal functions
 
 (defun vc-hg-command (buffer okstatus file-or-list &rest flags)