summaryrefslogtreecommitdiff
path: root/lisp/vc-bzr.el
diff options
context:
space:
mode:
authorDan Nicolaescu <dann@ics.uci.edu>2009-12-03 07:46:13 +0000
committerDan Nicolaescu <dann@ics.uci.edu>2009-12-03 07:46:13 +0000
commit4dfb3b9cd5fac23e5ffcde421102d5b4b1ba96ab (patch)
tree54fe2c972424f2b9f12558c3ac629848046ff358 /lisp/vc-bzr.el
parent3f6bd7904e8a9a8c312089abcbf2f71ec11b5353 (diff)
downloademacs-4dfb3b9cd5fac23e5ffcde421102d5b4b1ba96ab.tar.gz
emacs-4dfb3b9cd5fac23e5ffcde421102d5b4b1ba96ab.tar.bz2
emacs-4dfb3b9cd5fac23e5ffcde421102d5b4b1ba96ab.zip
Add support for bzr shelve/unshelve.
* vc-bzr.el (vc-bzr-shelve-map, vc-bzr-shelve-menu-map) (vc-bzr-extra-menu-map): New variables. (vc-bzr-extra-menu, vc-bzr-extra-status-menu, vc-bzr-shelve) (vc-bzr-shelve-apply, vc-bzr-shelve-list) (vc-bzr-shelve-get-at-point, vc-bzr-shelve-delete-at-point) (vc-bzr-shelve-apply-at-point, vc-bzr-shelve-menu): New functions. (vc-bzr-dir-extra-headers): Display shelves.
Diffstat (limited to 'lisp/vc-bzr.el')
-rw-r--r--lisp/vc-bzr.el117
1 files changed, 117 insertions, 0 deletions
diff --git a/lisp/vc-bzr.el b/lisp/vc-bzr.el
index 9f554b5bd92..1173d86842e 100644
--- a/lisp/vc-bzr.el
+++ b/lisp/vc-bzr.el
@@ -704,11 +704,49 @@ stream. Standard error output is discarded."
(vc-exec-after
`(vc-bzr-after-dir-status (quote ,update-function))))
+(defvar vc-bzr-shelve-map
+ (let ((map (make-sparse-keymap)))
+ ;; Turn off vc-dir marking
+ (define-key map [mouse-2] 'ignore)
+
+ (define-key map [down-mouse-3] 'vc-bzr-shelve-menu)
+ (define-key map "\C-k" 'vc-bzr-shelve-delete-at-point)
+ ;; (define-key map "=" 'vc-bzr-shelve-show-at-point)
+ ;; (define-key map "\C-m" 'vc-bzr-shelve-show-at-point)
+ (define-key map "A" 'vc-bzr-shelve-apply-at-point)
+ map))
+
+(defvar vc-bzr-shelve-menu-map
+ (let ((map (make-sparse-keymap "Bzr Shelve")))
+ (define-key map [de]
+ '(menu-item "Delete shelf" vc-bzr-shelve-delete-at-point
+ :help "Delete the current shelf"))
+ (define-key map [ap]
+ '(menu-item "Apply shelf" vc-bzr-shelve-apply-at-point
+ :help "Apply the current shelf"))
+ ;; (define-key map [sh]
+ ;; '(menu-item "Show shelve" vc-bzr-shelve-show-at-point
+ ;; :help "Show the contents of the current shelve"))
+ map))
+
+(defvar vc-bzr-extra-menu-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map [bzr-sh]
+ '(menu-item "Shelve..." vc-bzr-shelve
+ :help "Shelve changes"))
+ map))
+
+(defun vc-bzr-extra-menu () vc-bzr-extra-menu-map)
+
+(defun vc-bzr-extra-status-menu () vc-bzr-extra-menu-map)
+
(defun vc-bzr-dir-extra-headers (dir)
(let*
((str (with-temp-buffer
(vc-bzr-command "info" t 0 dir)
(buffer-string)))
+ (shelve (vc-bzr-shelve-list))
+ (shelve-help-echo "Use M-x vc-bzr-shelve to create shelves")
(light-checkout
(when (string-match ".+light checkout root: \\(.+\\)$" str)
(match-string 1 str)))
@@ -734,6 +772,85 @@ stream. Standard error output is discarded."
(propertize "Checkout of branch : " 'face 'font-lock-type-face)
(propertize light-checkout-branch 'face 'font-lock-variable-name-face)
"\n")))))
+ (if shelve
+ (concat
+ (propertize "Shelves :\n" 'face 'font-lock-type-face
+ 'help-echo shelve-help-echo)
+ (mapconcat
+ (lambda (x)
+ (propertize x
+ 'face 'font-lock-variable-name-face
+ 'mouse-face 'highlight
+ 'help-echo "mouse-3: Show shelve menu\nA: Apply shelf\nC-k: Delete shelf"
+ 'keymap vc-bzr-shelve-map))
+ shelve "\n"))
+ (concat
+ (propertize "Shelves : " 'face 'font-lock-type-face
+ 'help-echo shelve-help-echo)
+ (propertize "No shelved changes"
+ 'help-echo shelve-help-echo
+ 'face 'font-lock-variable-name-face))))))
+
+(defun vc-bzr-shelve (name)
+ "Create a shelve."
+ (interactive "sShelf name: ")
+ (let ((root (vc-bzr-root default-directory)))
+ (when root
+ (vc-bzr-command "shelve" nil 0 nil "--all" "-m" name)
+ (vc-resynch-buffer root t t))))
+
+;; (defun vc-bzr-shelve-show (name)
+;; "Show the contents of shelve NAME."
+;; (interactive "sShelve name: ")
+;; (vc-setup-buffer "*vc-bzr-shelve*")
+;; ;; FIXME: how can you show the contents of a shelf?
+;; (vc-bzr-command "shelve" "*vc-bzr-shelve*" 'async nil name)
+;; (set-buffer "*vc-bzr-shelve*")
+;; (diff-mode)
+;; (setq buffer-read-only t)
+;; (pop-to-buffer (current-buffer)))
+
+(defun vc-bzr-shelve-apply (name)
+ "Apply shelve NAME."
+ (interactive "sApply shelf: ")
+ (vc-bzr-command "unshelve" "*vc-bzr-shelve*" 0 nil "--apply" name)
+ (vc-resynch-buffer (vc-bzr-root default-directory) t t))
+
+(defun vc-bzr-shelve-list ()
+ (with-temp-buffer
+ (vc-bzr-command "shelve" (current-buffer) 1 nil "--list" "-q")
+ (delete
+ ""
+ (split-string
+ (buffer-substring (point-min) (point-max))
+ "\n"))))
+
+(defun vc-bzr-shelve-get-at-point (point)
+ (save-excursion
+ (goto-char point)
+ (beginning-of-line)
+ (if (looking-at "^ +\\([0-9]+\\):")
+ (match-string 1)
+ (error "Cannot find shelf at point"))))
+
+(defun vc-bzr-shelve-delete-at-point ()
+ (interactive)
+ (let ((shelve (vc-bzr-shelve-get-at-point (point))))
+ (when (y-or-n-p (format "Remove shelf %s ?" shelve))
+ (vc-bzr-command "unshelve" nil 0 nil "--delete-only" shelve)
+ (vc-dir-refresh))))
+
+;; (defun vc-bzr-shelve-show-at-point ()
+;; (interactive)
+;; (vc-bzr-shelve-show (vc-bzr-shelve-get-at-point (point))))
+
+(defun vc-bzr-shelve-apply-at-point ()
+ (interactive)
+ (vc-bzr-shelve-apply (vc-bzr-shelve-get-at-point (point))))
+
+(defun vc-bzr-shelve-menu (e)
+ (interactive "e")
+ (vc-dir-at-event e (popup-menu vc-bzr-shelve-menu-map e)))
;;; Revision completion