changeset 106384:8272f561b710

Support applying stashes. Improve UI. * vc-git.el (vc-git-dir-extra-headers): Add tooltips. (vc-git-stash-apply, vc-git-stash-pop) (vc-git-stash-apply-at-point, vc-git-stash-pop-at-point) (vc-git-stash-menu): New functions. (vc-git-stash-menu-map): New variable. (vc-git-stash-map): Add bindings to popup a menu and to apply stashes.
author Dan Nicolaescu <dann@ics.uci.edu>
date Thu, 03 Dec 2009 04:08:08 +0000
parents 09d0cce6cdd3
children cd8b405d57c6
files etc/NEWS lisp/ChangeLog lisp/vc-git.el
diffstat 3 files changed, 64 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/etc/NEWS	Thu Dec 03 03:11:14 2009 +0000
+++ b/etc/NEWS	Thu Dec 03 04:08:08 2009 +0000
@@ -264,7 +264,7 @@
 Signed-off-by line when committing.
 
 **** Support for operating with stashes has been added to vc-dir: the stash list is
-displayed in the *vc-dir* header, stashes can be created, removed and
+displayed in the *vc-dir* header, stashes can be created, removed, applied and
 their content displayed.
 
 **** vc-dir displays the stash status
--- a/lisp/ChangeLog	Thu Dec 03 03:11:14 2009 +0000
+++ b/lisp/ChangeLog	Thu Dec 03 04:08:08 2009 +0000
@@ -1,3 +1,13 @@
+2009-12-03  Dan Nicolaescu  <dann@ics.uci.edu>
+
+	Support applying stashes.  Improve UI.
+	* vc-git.el (vc-git-dir-extra-headers): Add tooltips.
+	(vc-git-stash-apply, vc-git-stash-pop)
+	(vc-git-stash-apply-at-point, vc-git-stash-pop-at-point)
+	(vc-git-stash-menu): New functions.
+	(vc-git-stash-menu-map): New variable.
+	(vc-git-stash-map): Add bindings to popup a menu and to apply stashes.
+
 2009-12-03  Glenn Morris  <rgm@gnu.org>
 
 	* vc.el (log-view-vc-backend, log-view-vc-fileset): Declare.
--- a/lisp/vc-git.el	Thu Dec 03 03:11:14 2009 +0000
+++ b/lisp/vc-git.el	Thu Dec 03 04:08:08 2009 +0000
@@ -405,9 +405,31 @@
 
 (defvar vc-git-stash-map
   (let ((map (make-sparse-keymap)))
+    ;; Turn off vc-dir marking
+    (define-key map [mouse-2] 'ignore)
+
+    (define-key map [down-mouse-3] 'vc-git-stash-menu)
     (define-key map "\C-k" 'vc-git-stash-delete-at-point)
     (define-key map "=" 'vc-git-stash-show-at-point)
     (define-key map "\C-m" 'vc-git-stash-show-at-point)
+    (define-key map "A" 'vc-git-stash-apply-at-point)
+    (define-key map "P" 'vc-git-stash-pop-at-point)
+    map))
+
+(defvar vc-git-stash-menu-map
+  (let ((map (make-sparse-keymap "Git Stash")))
+    (define-key map [de]
+      '(menu-item "Delete stash" vc-git-stash-delete-at-point
+		  :help "Delete the current stash"))
+    (define-key map [ap]
+      '(menu-item "Apply stash" vc-git-stash-apply-at-point
+		  :help "Apply the current stash and keep it in the stash list"))
+    (define-key map [po]
+      '(menu-item "Apply and remove stash (pop)" vc-git-stash-pop-at-point
+		  :help "Apply the current stash and remove it"))
+    (define-key map [sh]
+      '(menu-item "Show stash" vc-git-stash-show-at-point
+		  :help "Show the contents of the current stash"))
     map))
 
 (defun vc-git-dir-extra-headers (dir)
@@ -415,6 +437,7 @@
                (with-current-buffer standard-output
                  (vc-git--out-ok "symbolic-ref" "HEAD"))))
 	(stash (vc-git-stash-list))
+	(stash-help-echo "Use M-x vc-git-stash to create stashes.")
 	branch remote remote-url)
     (if (string-match "^\\(refs/heads/\\)?\\(.+\\)$" str)
 	(progn
@@ -447,17 +470,21 @@
      "\n"
      (if stash
        (concat
-	(propertize "Stash      :\n" 'face 'font-lock-type-face)
+	(propertize "Stash      :\n" 'face 'font-lock-type-face
+		    'help-echo stash-help-echo)
 	(mapconcat
 	 (lambda (x)
 	   (propertize x
 		       'face 'font-lock-variable-name-face
 		       'mouse-face 'highlight
+		       'help-echo "mouse-3: Show stash menu\nRET: Show stash\nA: Apply stash\nP: Apply and remove stash (pop)\nC-k: Delete stash"
 		       'keymap vc-git-stash-map))
 	 stash "\n"))
        (concat
-	(propertize "Stash      : " 'face 'font-lock-type-face)
+	(propertize "Stash      : " 'face 'font-lock-type-face
+		    'help-echo stash-help-echo)
 	(propertize "Nothing stashed"
+		    'help-echo stash-help-echo
 		    'face 'font-lock-variable-name-face))))))
 
 ;;; STATE-CHANGING FUNCTIONS
@@ -816,6 +843,18 @@
   (setq buffer-read-only t)
   (pop-to-buffer (current-buffer)))
 
+(defun vc-git-stash-apply (name)
+  "Apply stash NAME."
+  (interactive "sApply stash: ")
+  (vc-git-command "*vc-git-stash*" 0 nil "stash" "apply" "-q" name)
+  (vc-resynch-buffer (vc-git-root default-directory) t t))
+
+(defun vc-git-stash-pop (name)
+  "Pop stash NAME."
+  (interactive "sPop stash: ")
+  (vc-git-command "*vc-git-stash*" 0 nil "stash" "pop" "-q" name)
+  (vc-resynch-buffer (vc-git-root default-directory) t t))
+
 (defun vc-git-stash-list ()
   (delete
    ""
@@ -843,6 +882,18 @@
   (interactive)
   (vc-git-stash-show (format "stash@%s" (vc-git-stash-get-at-point (point)))))
 
+(defun vc-git-stash-apply-at-point ()
+  (interactive)
+  (vc-git-stash-apply (format "stash@%s" (vc-git-stash-get-at-point (point)))))
+
+(defun vc-git-stash-pop-at-point ()
+  (interactive)
+  (vc-git-stash-pop (format "stash@%s" (vc-git-stash-get-at-point (point)))))
+
+(defun vc-git-stash-menu (e)
+  (interactive "e")
+  (vc-dir-at-event e (popup-menu vc-git-stash-menu-map e)))
+
 
 ;;; Internal commands