From 454c8c6ebb69c3cd3f671f7700ded14826492ce1 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Sun, 13 Nov 2022 17:05:20 +0100 Subject: [PATCH] Have 'vc-prepare-patch' handle prefix arguments. * lisp/emacs-lisp/package-vc.el (package-vc-prepare-patch): Use 'vc-prepare-patch-prompt-revisions'. * lisp/vc/vc.el (vc-prepare-patch-prompt-revisions): Extract common function and handle prefix arguments. (vc-prepare-patch): Pull logic out to 'vc-prepare-patch-prompt-revisions'. --- lisp/emacs-lisp/package-vc.el | 14 +++++------ lisp/vc/vc.el | 47 ++++++++++++++++++++++++----------- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/lisp/emacs-lisp/package-vc.el b/lisp/emacs-lisp/package-vc.el index 664629d156..37ef35edad 100644 --- a/lisp/emacs-lisp/package-vc.el +++ b/lisp/emacs-lisp/package-vc.el @@ -733,17 +733,17 @@ package-vc-rebuild ;;;###autoload (defun package-vc-prepare-patch (pkg subject revisions) "Send patch for REVISIONS to maintainer of the package PKG using SUBJECT. -SUBJECT and REVISIONS are passed on to `vc-prepare-patch', which see. -PKG must be a package description. -Interactively, prompt for PKG, SUBJECT, and REVISIONS. However, -if the current buffer has marked commit log entries, REVISIONS -are the tags of the marked entries, see `log-view-get-marked'." +SUBJECT and REVISIONS are passed on to `vc-prepare-patch', which +see. PKG must be a package description. Interactively, prompt +for PKG, SUBJECT, and REVISIONS. When invoked with a numerical +prefix argument, the last N revisions will be used. When invoked +interactively in a Log View buffer with marked revisions, those +revisions will be used." (interactive (list (package-vc--read-package-desc "Package to prepare a patch for: " t) (and (not vc-prepare-patches-separately) (read-string "Subject: " "[PATCH] " nil nil t)) - (or (log-view-get-marked) - (vc-read-multiple-revisions "Revisions: ")))) + (vc-prepare-patch-prompt-revisions))) (vc-prepare-patch (package-maintainers pkg t) subject revisions)) diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index 513fbb23fe..f71783db97 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -3384,25 +3384,42 @@ vc-default-prepare-patch (vc-root-dir)))) :buffer (current-buffer))))) +(defun vc-prepare-patch-prompt-revisions () + "Prompt the user for a list revisions. +Prepare a default value, depending on the current context. With +a numerical prefix argument, use the last N revisions as the +default value. If the current buffer is a log-view buffer, use +the marked commits. Otherwise fall back to the working revision +of the current file." + (vc-read-multiple-revisions + "Revisions: " nil nil nil + (or (and-let* ((arg current-prefix-arg) + (fs (vc-deduce-fileset t))) + (cl-loop with file = (caadr fs) + repeat (prefix-numeric-value arg) + for rev = (vc-working-revision file) + then (vc-call-backend + (car fs) 'previous-revision + file rev) + when rev collect it into revs + finally return (mapconcat #'identity revs ","))) + (and-let* ((revs (log-view-get-marked))) + (mapconcat #'identity revs ",")) + (and-let* ((file (buffer-file-name))) + (vc-working-revision file))))) + ;;;###autoload (defun vc-prepare-patch (addressee subject revisions) "Compose an Email sending patches for REVISIONS to ADDRESSEE. -If `vc-prepare-patches-separately' is nil, SUBJECT will be used -as the default subject for the message (and it will be prompted -for when called interactively). Otherwise a separate message -will be composed for each revision, with SUBJECT derived from the -invidividual commits. - -When invoked interactively in a Log View buffer with marked -revisions, those revisions will be used." +If `vc-prepare-patches-separately' is nil, use SUBJECT as the +default subject for the message, or prompt a subject when invoked +interactively. Otherwise compose a separate message for each +revision, with SUBJECT derived from each revision subject. When +invoked with a numerical prefix argument, use the last N +revisions. When invoked interactively in a Log View buffer with +marked revisions, use those these." (interactive - (let ((revs (vc-read-multiple-revisions - "Revisions: " nil nil nil - (or (and-let* ((revs (log-view-get-marked))) - (mapconcat #'identity revs ",")) - (and-let* ((file (buffer-file-name))) - (vc-working-revision file))))) - to) + (let ((revs (vc-prepare-patch-prompt-revisions)) to) (require 'message) (while (null (setq to (completing-read-multiple (format-prompt -- 2.35.1