"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."
(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)
(when (memq patchsym stgit-marked-patches)
(replace-match "*" nil nil nil 2)
(setq marked (cons patchsym marked)))))
- ((looking-at "stg series: Branch \".*\" not initialised")
+ ((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))
(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)
(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.
(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))
(interactive)
(stgit-capture-output nil
(stgit-run "init"))
- (stgit-refresh))
+ (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 ()
(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"
(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 ()
(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 (npatches)
"Push the first unapplied patch.
(interactive "p")
(stgit-capture-output nil (stgit-run "push" "-n"
(number-to-string npatches)))
- (stgit-refresh))
+ (stgit-reload))
(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-refresh))
+ (stgit-reload))
(defun stgit-applied-at-point ()
"Is the patch on the current line applied?"
(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"
(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"
(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"
(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"
(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"
(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)