X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/blobdiff_plain/baf8241d1b7835ba31125d2b75683601ee2b0403..adeef6bc6f43fbccb1a046e00f57c559ee363737:/contrib/stgit.el diff --git a/contrib/stgit.el b/contrib/stgit.el index 7c83a9e..7fd3786 100644 --- a/contrib/stgit.el +++ b/contrib/stgit.el @@ -350,6 +350,15 @@ find copied files." (insert " \n")) (put-text-property start (point) 'stgit-file-patchsym patchsym)))) +(defun stgit-collapse-patch (patchsym) + "Collapse the patch with name PATCHSYM after the line at point." + (save-excursion + (forward-line) + (let ((start (point))) + (while (eq (get-text-property (point) 'stgit-file-patchsym) patchsym) + (forward-line)) + (delete-region start (point))))) + (defun stgit-rescan () "Rescan the status buffer." (save-excursion @@ -398,23 +407,33 @@ find copied files." (propertize "no patches in series" 'face 'stgit-description-face)))))) +(defun stgit-select-file () + (let ((patched-file (stgit-patched-file-at-point))) + (unless patched-file + (error "No patch or file on the current line")) + (let ((filename (expand-file-name (cdr patched-file)))) + (unless (file-exists-p filename) + (error "File does not exist")) + (find-file filename)))) + +(defun stgit-toggle-patch-file-list (curpath) + (let ((inhibit-read-only t)) + (if (memq curpatch stgit-expanded-patches) + (save-excursion + (setq stgit-expanded-patches (delq curpatch stgit-expanded-patches)) + (stgit-collapse-patch curpatch)) + (progn + (setq stgit-expanded-patches (cons curpatch stgit-expanded-patches)) + (stgit-expand-patch curpatch))))) + (defun stgit-select () "Expand or collapse the current entry" (interactive) (let ((curpatch (stgit-patch-at-point))) - (if (not curpatch) - (let ((patched-file (stgit-patched-file-at-point))) - (unless patched-file - (error "No patch or file on the current line")) - (let ((filename (expand-file-name (cdr patched-file)))) - (unless (file-exists-p filename) - (error "File does not exist")) - (find-file filename))) - (setq stgit-expanded-patches - (if (memq curpatch stgit-expanded-patches) - (delq curpatch stgit-expanded-patches) - (cons curpatch stgit-expanded-patches))) - (stgit-reload)))) + (if curpatch + (stgit-toggle-patch-file-list curpatch) + (stgit-select-file)))) + (defun stgit-find-file-other-window () "Open file at point in other window" @@ -522,7 +541,8 @@ find copied files." ("D" . stgit-delete) ([(control ?/)] . stgit-undo) ("\C-_" . stgit-undo) - ("q" . stgit-quit)))) + ("B" . stgit-branch) + ("q" . stgit-quit)))) (defun stgit-mode () "Major mode for interacting with StGit. @@ -658,6 +678,24 @@ If that patch cannot be found, return nil." (stgit-run "repair")) (stgit-reload)) +(defun stgit-available-branches () + "Returns a list of the available stg branches" + (let ((output (with-output-to-string + (stgit-run "branch" "--list"))) + (start 0) + result) + (while (string-match "^>?\\s-+s\\s-+\\(\\S-+\\)" output start) + (setq result (cons (match-string 1 output) result)) + (setq start (match-end 0))) + result)) + +(defun stgit-branch (branch) + "Switch to branch BRANCH." + (interactive (list (completing-read "Switch to branch: " + (stgit-available-branches)))) + (stgit-capture-output nil (stgit-run "branch" "--" branch)) + (stgit-reload)) + (defun stgit-commit (count) "Run stg commit on COUNT commits. Interactively, the prefix argument is used as COUNT." @@ -804,19 +842,29 @@ end of the patch." (substring patch 0 20)) (t patch)))) -(defun stgit-delete (patchsyms) +(defun stgit-delete (patchsyms &optional spill-p) "Delete the patches in PATCHSYMS. -Interactively, delete the marked patches, or the patch at point." - (interactive (list (stgit-patches-marked-or-at-point))) +Interactively, delete the marked patches, or the patch at point. + +With a prefix argument, or SPILL-P, spill the patch contents to +the work tree and index." + (interactive (list (stgit-patches-marked-or-at-point) + current-prefix-arg)) (unless patchsyms (error "No patches to delete")) (let ((npatches (length patchsyms))) - (when (yes-or-no-p (format "Really delete %d patch%s? " + (when (yes-or-no-p (format "Really delete %d patch%s%s? " npatches - (if (= 1 npatches) "" "es"))) - (stgit-capture-output nil - (apply 'stgit-run "delete" patchsyms)) - (stgit-reload)))) + (if (= 1 npatches) "" "es") + (if spill-p + " (spilling contents to index)" + ""))) + (let ((args (if spill-p + (cons "--spill" patchsyms) + patchsyms))) + (stgit-capture-output nil + (apply 'stgit-run "delete" args)) + (stgit-reload))))) (defun stgit-coalesce (patchsyms) "Coalesce the patches in PATCHSYMS.