From 7cc45294865ddc8ac6c3a1af15a71be6be9965a4 Mon Sep 17 00:00:00 2001 Message-Id: <7cc45294865ddc8ac6c3a1af15a71be6be9965a4.1717533301.git.mdw@distorted.org.uk> From: Mark Wooding Date: Fri, 13 Mar 2009 04:56:43 +0100 Subject: [PATCH] stgit.el: Add "M" for stgit-move-patches MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Organization: Straylight/Edgeware From: Gustav Hållberg Signed-off-by: Gustav Hållberg Signed-off-by: Karl Hasselström --- contrib/stgit.el | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/contrib/stgit.el b/contrib/stgit.el index c8d9368..b066b14 100644 --- a/contrib/stgit.el +++ b/contrib/stgit.el @@ -528,6 +528,7 @@ (unless stgit-mode-map ("r" . stgit-refresh) ("\C-c\C-r" . stgit-rename) ("e" . stgit-edit) + ("M" . stgit-move-patches) ("S" . stgit-squash) ("N" . stgit-new) ("R" . stgit-repair) @@ -877,6 +878,62 @@ (defun stgit-delete (patchsyms &optional spill-p) (apply 'stgit-run "delete" args)) (stgit-reload))))) +(defun stgit-move-patches-target () + "Return the patchsym indicating a target patch for +`stgit-move-patches'. + +This is either the patch at point, or one of :top and :bottom, if +the point is after or before the applied patches." + + (let ((patchsym (stgit-patch-at-point))) + (cond (patchsym patchsym) + ((save-excursion (re-search-backward "^>" nil t)) :top) + (t :bottom)))) + +(defun stgit-move-patches (patchsyms target-patch) + "Move the patches in PATCHSYMS to below TARGET-PATCH. +If TARGET-PATCH is :bottom or :top, move the patches to the +bottom or top of the stack, respectively. + +Interactively, move the marked patches to where the point is." + (interactive (list stgit-marked-patches + (stgit-move-patches-target))) + (unless patchsyms + (error "Need at least one patch to move")) + + (unless target-patch + (error "Point not at a patch")) + + (if (eq target-patch :top) + (stgit-capture-output nil + (apply 'stgit-run "float" patchsyms)) + + ;; need to have patchsyms sorted by position in the stack + (let (sorted-patchsyms + (series (with-output-to-string + (with-current-buffer standard-output + (stgit-run-silent "series" "--noprefix")))) + start) + (while (string-match "^\\(.+\\)" series start) + (let ((patchsym (intern (match-string 1 series)))) + (when (memq patchsym patchsyms) + (setq sorted-patchsyms (cons patchsym sorted-patchsyms)))) + (setq start (match-end 0))) + (setq sorted-patchsyms (nreverse sorted-patchsyms)) + + (unless (= (length patchsyms) (length sorted-patchsyms)) + (error "Internal error")) + + (while sorted-patchsyms + (setq sorted-patchsyms + (and (stgit-capture-output nil + (if (eq target-patch :bottom) + (stgit-run "sink" "--" (car sorted-patchsyms)) + (stgit-run "sink" "--to" target-patch "--" + (car sorted-patchsyms)))) + (cdr sorted-patchsyms)))))) + (stgit-reload)) + (defun stgit-squash (patchsyms) "Squash the patches in PATCHSYMS. Interactively, squash the marked patches." -- [mdw]