branch: externals/vc-hgcmd
commit 18e601063f4f8e18fdd909f16ee2a22f94909f82
Author: muffinmad <andreyk....@gmail.com>
Commit: muffinmad <andreyk....@gmail.com>

    Show shelve in vc-dir
---
 vc-hgcmd.el | 199 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 188 insertions(+), 11 deletions(-)

diff --git a/vc-hgcmd.el b/vc-hgcmd.el
index 2e18986..2dc50bd 100644
--- a/vc-hgcmd.el
+++ b/vc-hgcmd.el
@@ -5,7 +5,7 @@
 ;; Author: Andrii Kolomoiets <andreyk....@gmail.com>
 ;; Keywords: vc
 ;; URL: https://github.com/muffinmad/emacs-vc-hgcmd
-;; Package-Version: 1.4.1
+;; Package-Version: 1.5
 ;; Package-Requires: ((emacs "25.1"))
 
 ;; This file is NOT part of GNU Emacs.
@@ -88,7 +88,8 @@
 ;; - Interactive command `vc-hgcmd-runcommand' that allow to run custom hg 
commands
 ;;
 ;; - It is possible to answer to hg questions, e.g. pick action during merge
-
+;;
+;; - Option to display shelves in `vc-dir'
 
 ;;; Code:
 
@@ -141,6 +142,9 @@ same branch was merged."
           (function)
           (const :tag "Default commit message" nil)))
 
+(defcustom vc-hgcmd-dir-show-shelve nil
+  "Show current shelves in `vc-dir' buffer."
+  :type '(boolean))
 
 ;;;; Modes
 
@@ -606,20 +610,193 @@ Insert output to process buffer and check if amount of 
data is enought to parse
   (when (search-forward-regexp (format "^%s: \\(.*\\)" search) nil t)
     (vc-hgcmd--extra-header name (match-string-no-properties 1))))
 
+(defvar vc-hgcmd-extra-menu-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [hgcmd-sl]
+      '(menu-item "Create shelve..." vc-hgcmd-shelve
+                         :help "Shelve changes"))
+    (define-key map [hgcmd-uc]
+      '(menu-item "Continue unshelve" vc-hgcmd-shelve-unshelve-continue
+                         :help "Continue unshelve"))
+    (define-key map [hgcmd-ua]
+      '(menu-item "Abort unshelve" vc-hgcmd-shelve-unshelve-abort
+                         :help "Abort unshelve"))
+    (define-key map [hgcmd-ar]
+      '(menu-item "Addremove" vc-hgcmd-addremove
+                         :help "Add new and remove missing files"))
+    map))
+
+(defun vc-hgcmd-extra-menu ()
+  "Return a menu keymap with additional hg commands."
+  vc-hgcmd-extra-menu-map)
+
+(defun vc-hgcmd-extra-status-menu ()
+  "Return a menu keymap with additional hg commands."
+  vc-hgcmd-extra-menu-map)
+
+(defvar vc-hgcmd-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-hgcmd-shelve-menu)
+    (define-key map "\C-k" #'vc-hgcmd-shelve-delete-at-point)
+    (define-key map "=" #'vc-hgcmd-shelve-show-at-point)
+    (define-key map "\C-m" #'vc-hgcmd-shelve-show-at-point)
+    (define-key map "A" 'vc-hgcmd-shelve-apply-at-point)
+    (define-key map "P" 'vc-hgcmd-shelve-pop-at-point)
+    map))
+
+(defvar vc-hgcmd-shelve-menu-map
+  (let ((map (make-sparse-keymap "Hg shelve")))
+    (define-key map [de]
+      '(menu-item "Delete shelve" vc-hgcmd-shelve-delete-at-point
+                         :help "Delete the current shelve"))
+    (define-key map [ap]
+      '(menu-item "Unshelve and keep shelve" vc-hgcmd-shelve-apply-at-point
+                         :help "Apply the current shelve and keep it in the 
shelve list"))
+    (define-key map [po]
+      '(menu-item "Unshelve and remove shelve" vc-hgcmd-shelve-pop-at-point
+                         :help "Apply the current shelve and remove it"))
+    (define-key map [sh]
+      '(menu-item "Show shelve" vc-hgcmd-shelve-show-at-point
+                         :help "Show the contents of the current shelve"))
+    map))
+
 (defun vc-hgcmd-dir-extra-headers (_dir)
   "Return summary command for DIR output as dir extra headers."
   (let* ((parents (vc-hgcmd-command "log" "-r" "p1()+p2()" "--template" 
"{rev}:{node|short}\\0{branch}\\0{tags}\\0{desc|firstline}\\n"))
          (result (when parents
                    (apply #'concat (mapcar #'vc-hgcmd--parent-info 
(split-string parents "\n"))))))
-    (with-temp-buffer
-      (when (vc-hgcmd--run-command (make-vc-hgcmd--command :command (list 
"summary") :output-buffer (current-buffer) :wait t))
-        (concat result
-                (unless parents
-                  (vc-hgcmd--summary-info "parent" "Parent     : "))
-                (vc-hgcmd--summary-info "branch" "Branch     : ")
-                (vc-hgcmd--summary-info "commit" "Commit     : ")
-                (vc-hgcmd--summary-info "update" "Update     : ")
-                (vc-hgcmd--summary-info "phases" "Phases     : "))))))
+    (concat
+     result
+     (with-temp-buffer
+       (when (vc-hgcmd--run-command (make-vc-hgcmd--command :command (list 
"summary") :output-buffer (current-buffer) :wait t))
+         (concat
+          (unless parents
+            (vc-hgcmd--summary-info "parent" "Parent     : "))
+          (vc-hgcmd--summary-info "branch" "Branch     : ")
+          (vc-hgcmd--summary-info "commit" "Commit     : ")
+          (vc-hgcmd--summary-info "update" "Update     : ")
+          (vc-hgcmd--summary-info "phases" "Phases     : "))))
+     (when vc-hgcmd-dir-show-shelve
+       (let ((shelves (vc-hgcmd-shelve-list)))
+         (when shelves
+           (concat
+            (propertize "Shelve     :\n" 'face 'font-lock-type-face)
+            (with-temp-buffer
+              (when (vc-hgcmd--run-command (make-vc-hgcmd--command :command 
(list "shelve" "-l") :output-buffer (current-buffer) :wait t))
+                (goto-char (point-min))
+                (mapconcat
+                 (lambda (shelve)
+                   (prog1
+                       (propertize
+                        (concat
+                         "             "
+                         (propertize shelve 'face 
'font-lock-variable-name-face)
+                         (propertize
+                          (replace-regexp-in-string
+                           (concat "^" (regexp-quote shelve) "\s*")
+                           "   "
+                           (buffer-substring-no-properties 
(line-beginning-position) (line-end-position)))
+                          'face 'font-lock-comment-face))
+                        'mouse-face 'highlight
+                        'help-echo "mouse-3: Show shelve menu\nRET: Show 
shelve\nA: Unshelve and keep\nP: Unshelve and remove\nC-k: Delete shelve"
+                        'keymap vc-hgcmd-shelve-map
+                        'vc-hgcmd--shelve-name shelve)
+                     (forward-line)))
+                 shelves "\n"))))))))))
+
+(defun vc-hgcmd-shelve-list ()
+  "Return shelve list."
+  (let ((shelves (vc-hgcmd-command "shelve" "-l" "-q")))
+    (when shelves (split-string shelves "\n"))))
+
+(defun vc-hgcmd-shelve-name-at-point ()
+  "Return shelve name at point."
+  (or (get-text-property (point) 'vc-hgcmd--shelve-name)
+      (error "Cannot find shelve at point")))
+
+(defun vc-hgcmd-shelve-delete-at-point ()
+  "Delete shelve at point."
+  (interactive)
+  (let ((shelve (vc-hgcmd-shelve-name-at-point)))
+    (when (y-or-n-p (format "Delete shelve %s? " shelve))
+      (vc-hgcmd-command "shelve" "-d" shelve)
+      (vc-dir-refresh))))
+
+(defun vc-hgcmd-shelve-read (prompt)
+  "Read shelve name with PROMPT."
+  (let ((name (completing-read prompt (letrec ((table (lazy-completion-table 
table (lambda () (vc-hgcmd-shelve-list)))))) nil t)))
+    (when (not (string-equal "" name))
+      name)))
+
+(defun vc-hgcmd-shelve-apply (name)
+  "Unshelve and keep shelve with NAME."
+  (interactive (list (vc-hgcmd-shelve-read "Apply and keep shelve: ")))
+  (when name
+    (vc-hgcmd-command "unshelve" "-k" name)
+    (vc-dir-refresh)))
+
+(defun vc-hgcmd-shelve-apply-at-point ()
+  "Unshelve and keep shelve at point."
+  (interactive)
+  (vc-hgcmd-shelve-apply (vc-hgcmd-shelve-name-at-point)))
+
+(defun vc-hgcmd-shelve-pop (name)
+  "Unshelve and keep shelve with NAME."
+  (interactive (list (vc-hgcmd-shelve-read "Apply and remove shelve: ")))
+  (when name
+    (vc-hgcmd-command "unshelve" name)
+    (vc-dir-refresh)))
+
+(defun vc-hgcmd-shelve-pop-at-point ()
+  "Unshelve and keep shelve at point."
+  (interactive)
+  (vc-hgcmd-shelve-pop (vc-hgcmd-shelve-name-at-point)))
+
+(defun vc-hgcmd-shelve-show-at-point ()
+  "Show shelve at point."
+  (interactive)
+  (let ((shelve (vc-hgcmd-shelve-name-at-point))
+        (buffer (get-buffer-create "*vc-hgcmd-shelve*")))
+    (vc-setup-buffer buffer)
+    (with-current-buffer
+        (when (vc-hgcmd--run-command (make-vc-hgcmd--command :command (list 
"shelve" "-p" shelve) :output-buffer (current-buffer) :wait t))
+          (diff-mode)
+          (setq buffer-read-only t)
+          (pop-to-buffer (current-buffer))))))
+
+(defun vc-hgcmd-shelve (name)
+  "Create shelve named NAME."
+  (interactive "sShelve name: ")
+  (if (string-equal "" name)
+      (vc-hgcmd-command "shelve")
+    (vc-hgcmd-command "shelve" "-n" name))
+  (vc-dir-refresh))
+
+(defun vc-hgcmd-shelve-unshelve-continue ()
+  "Continue unshelve."
+  (interactive)
+  (vc-hgcmd-command "unshelve" "--continue")
+  (vc-dir-refresh))
+
+(defun vc-hgcmd-shelve-unshelve-abort ()
+  "Abort unshelve."
+  (interactive)
+  (vc-hgcmd-command "unshelve" "--abort")
+  (vc-dir-refresh))
+
+(defun vc-hgcmd-shelve-menu (event)
+  "Popup shelve menu on EVENT."
+  (interactive "e")
+  (vc-dir-at-event event (popup-menu vc-hgcmd-shelve-menu-map event)))
+
+(defun vc-hgcmd-addremove ()
+  "Add new and remove missing files."
+  (interactive)
+  (vc-hgcmd-command "addremove")
+  (vc-dir-refresh))
 
 (defun vc-hgcmd-working-revision (file)
   "Working revision. Return repository working revision if FILE is committed."

Reply via email to