stgit.el: Rename stgit-refresh to stgit-reload
[stgit] / contrib / stgit.el
index 5aaf311..45e6e39 100644 (file)
@@ -13,7 +13,7 @@
   "Manage stgit patches"
   (interactive "DDirectory: \n")
   (switch-to-stgit-buffer (git-get-top-dir dir))
-  (stgit-refresh))
+  (stgit-reload))
 
 (defun git-get-top-dir (dir)
   "Retrieve the top-level directory of a git tree."
@@ -71,7 +71,7 @@ Argument DIR is the repository path."
 (defun stgit-run (&rest args)
   (apply 'call-process "stg" nil standard-output nil args))
 
-(defun stgit-refresh ()
+(defun stgit-reload ()
   "Update the contents of the stgit buffer"
   (interactive)
   (let ((inhibit-read-only t)
@@ -130,7 +130,11 @@ Argument DIR is the repository path."
                                     'face 'stgit-description-face)
                  (when (memq patchsym stgit-marked-patches)
                    (replace-match "*" nil nil nil 2)
-                   (setq marked (cons patchsym marked))))))
+                   (setq marked (cons patchsym marked)))))
+              ((or (looking-at "stg series: Branch \".*\" not initialised")
+                   (looking-at "stg series: .*: branch not initialized"))
+               (forward-line 1)
+               (insert "Run M-x stgit-init to initialise")))
         (forward-line 1))
       (setq stgit-marked-patches (nreverse marked)))))
 
@@ -149,7 +153,7 @@ Argument DIR is the repository path."
   (define-key stgit-mode-map "h"   'stgit-help)
   (define-key stgit-mode-map "p"   'previous-line)
   (define-key stgit-mode-map "n"   'next-line)
-  (define-key stgit-mode-map "g"   'stgit-refresh)
+  (define-key stgit-mode-map "g"   'stgit-reload)
   (define-key stgit-mode-map "r"   'stgit-rename)
   (define-key stgit-mode-map "e"   'stgit-edit)
   (define-key stgit-mode-map "c"   'stgit-coalesce)
@@ -162,7 +166,9 @@ Argument DIR is the repository path."
   (define-key stgit-mode-map "P"   'stgit-push-or-pop)
   (define-key stgit-mode-map "G"   'stgit-goto)
   (define-key stgit-mode-map "="   'stgit-show)
-  (define-key stgit-mode-map "D"   'stgit-delete))
+  (define-key stgit-mode-map "D"   'stgit-delete)
+  (define-key stgit-mode-map [(control ?/)] 'stgit-undo)
+  (define-key stgit-mode-map "\C-_" 'stgit-undo))
 
 (defun stgit-mode ()
   "Major mode for interacting with StGit.
@@ -187,6 +193,9 @@ Commands:
   (let ((patchsym (intern patch)))
     (setq stgit-marked-patches (delq patchsym stgit-marked-patches))))
 
+(defun stgit-clear-marks ()
+  (setq stgit-marked-patches '()))
+
 (defun stgit-marked-patches ()
   "Return the names of the marked patches."
   (mapcar 'symbol-name stgit-marked-patches))
@@ -218,12 +227,19 @@ Commands:
       (goto-char p)
       nil)))
 
+(defun stgit-init ()
+  "Run stg init"
+  (interactive)
+  (stgit-capture-output nil
+   (stgit-run "init"))
+  (stgit-reload))
+
 (defun stgit-mark ()
   "Mark the patch under point"
   (interactive)
   (let ((patch (stgit-patch-at-point)))
     (stgit-add-mark patch)
-    (stgit-refresh))
+    (stgit-reload))
   (next-line))
 
 (defun stgit-unmark ()
@@ -232,7 +248,7 @@ Commands:
   (forward-line -1)
   (let ((patch (stgit-patch-at-point)))
     (stgit-remove-mark patch)
-    (stgit-refresh)))
+    (stgit-reload)))
 
 (defun stgit-rename (name)
   "Rename the patch under point"
@@ -242,7 +258,7 @@ Commands:
       (error "No patch on this line"))
     (stgit-capture-output nil
       (stgit-run "rename" old-name name))
-    (stgit-refresh)
+    (stgit-reload)
     (stgit-goto-patch name)))
 
 (defun stgit-repair ()
@@ -250,31 +266,34 @@ Commands:
   (interactive)
   (stgit-capture-output nil
    (stgit-run "repair"))
-  (stgit-refresh))
+  (stgit-reload))
 
 (defun stgit-commit ()
   "Run stg commit."
   (interactive)
   (stgit-capture-output nil (stgit-run "commit"))
-  (stgit-refresh))
+  (stgit-reload))
 
 (defun stgit-uncommit (arg)
   "Run stg uncommit. Numeric arg determines number of patches to uncommit."
   (interactive "p")
   (stgit-capture-output nil (stgit-run "uncommit" "-n" (number-to-string arg)))
-  (stgit-refresh))
+  (stgit-reload))
 
-(defun stgit-push-next ()
-  "Push the first unapplied patch"
-  (interactive)
-  (stgit-capture-output nil (stgit-run "push"))
-  (stgit-refresh))
+(defun stgit-push-next (npatches)
+  "Push the first unapplied patch.
+With numeric prefix argument, push that many patches."
+  (interactive "p")
+  (stgit-capture-output nil (stgit-run "push" "-n"
+                                       (number-to-string npatches)))
+  (stgit-reload))
 
-(defun stgit-pop-next ()
-  "Pop the topmost applied patch"
-  (interactive)
-  (stgit-capture-output nil (stgit-run "pop"))
-  (stgit-refresh))
+(defun stgit-pop-next (npatches)
+  "Pop the topmost applied patch.
+With numeric prefix argument, pop that many patches."
+  (interactive "p")
+  (stgit-capture-output nil (stgit-run "pop" "-n" (number-to-string npatches)))
+  (stgit-reload))
 
 (defun stgit-applied-at-point ()
   "Is the patch on the current line applied?"
@@ -289,7 +308,7 @@ Commands:
         (applied (stgit-applied-at-point)))
     (stgit-capture-output nil
        (stgit-run (if applied "pop" "push") patch))
-    (stgit-refresh)))
+    (stgit-reload)))
 
 (defun stgit-goto ()
   "Go to the patch on the current line"
@@ -297,7 +316,7 @@ Commands:
   (let ((patch (stgit-patch-at-point)))
     (stgit-capture-output nil
        (stgit-run "goto" patch))
-    (stgit-refresh)))
+    (stgit-reload)))
 
 (defun stgit-show ()
   "Show the patch on the current line"
@@ -327,7 +346,7 @@ Commands:
     (stgit-capture-output nil
       (stgit-run "edit" "-f" file stgit-edit-patch))
     (with-current-buffer log-edit-parent-buffer
-      (stgit-refresh))))
+      (stgit-reload))))
 
 (defun stgit-new ()
   "Create a new patch"
@@ -342,7 +361,7 @@ Commands:
     (stgit-capture-output nil
       (stgit-run "new" "-f" file))
     (with-current-buffer log-edit-parent-buffer
-      (stgit-refresh))))
+      (stgit-reload))))
 
 (defun stgit-create-patch-name (description)
   "Create a patch name from a long description"
@@ -371,7 +390,7 @@ Commands:
                                (length patch-names)))
       (stgit-capture-output nil
         (apply 'stgit-run "delete" patch-names))
-      (stgit-refresh))))
+      (stgit-reload))))
 
 (defun stgit-coalesce (patch-names)
   "Run stg coalesce on the named patches"
@@ -391,11 +410,28 @@ Commands:
     (stgit-capture-output nil
       (apply 'stgit-run "coalesce" "-f" file stgit-patches))
     (with-current-buffer log-edit-parent-buffer
-      (stgit-refresh))))
+      (stgit-clear-marks)
+      ;; Go to first marked patch and stay there
+      (goto-char (point-min))
+      (re-search-forward (concat "^[>+-]\\*") nil t)
+      (move-to-column goal-column)
+      (let ((pos (point)))
+        (stgit-reload)
+        (goto-char pos)))))
 
 (defun stgit-help ()
   "Display help for the StGit mode."
   (interactive)
   (describe-function 'stgit-mode))
 
+(defun stgit-undo (&optional arg)
+  "Run stg undo.
+With prefix argument, run it with the --hard flag."
+  (interactive "P")
+  (stgit-capture-output nil
+    (if arg
+        (stgit-run "undo" "--hard")
+      (stgit-run "undo")))
+  (stgit-reload))
+
 (provide 'stgit)