Re: git-send-email: Send with mutt(1)
- From
- Alejandro Colomar <alx@kernel.org>
- Date
- Nov 7, 2023, 18:36 UTC
- Message-ID
- <ZUqDwnmu9d1dD1tb@devuan>
- In-Reply-To
- <20231107174803.GA507007@coredump.intra.peff.net>
Hi Jeff,
On Tue, Nov 07, 2023 at 12:48:03PM -0500, Jeff King wrote:
Show 7 quoted lines
> I think there's a lot of overlap between what git-send-email does and > what mutt does, to the point that you probably don't need to use > send-email at all. > > I assume what you want out of send-email here is the actual generation > of patch emails. But under the hood that is all done by git-format-patch > anyway. So for example if you do:
Yeah, most of it is done by format-patch. There are few things I actually need from send-email. One of them is generating the Cc from the sign-offs and other tags found in the patch.
I had been thinking these days that it would be useful to have format-patch generate those. How about adding a --signed-off-by-cc to format-patch?
Show 13 quoted lines
> > git format-patch --stdout origin..HEAD >patches > mutt -f patches > > And then you can use mutt's "resend-message" function to send each one. > I use config like this: > > macro index,pager b ":set edit_headers=yes<enter><resend-message>:set edit_headers=no<enter>" > > If you're sending a long series, it's helpful to pre-populate various > headers in the format-patch command with "--to", etc. I usually do so by > sending the cover letter directly via mutt, and then using some perl > hackery to convert those headers into format-patch args. The script I
Indeed, that hackery is what send-email already does, so how about moving those features a bit upstream so that format-patch can do them too?
Although then, maybe it's simpler to teach send-email to learn to use mutt(1) under the hood for the actual send.
Show 89 quoted lines
> use is below (it will also, when run without a terminal, generate the
> patch summary for the cover letter; I use it with "r!my-script" while
> writing the cover letter in vim).
>
> (This script is what I use every day, so it should be fairly robust. But
> it is also over 15 years old, so I don't promise there isn't a simpler
> way to do some of what it does ;) ).
>
> -- >8 --
> #!/bin/sh
> upstream_branch() {
> current=`git symbolic-ref HEAD`
> upstream=`git for-each-ref --format='%(upstream)' "$current"`
> if test -n "$upstream"; then
> echo $upstream
> else
> echo origin
> fi
> }
>
> get_reply_headers() {
> perl -ne '
> if (defined $opt) {
> if (/^\s+(.*)/) {
> $val .= " $1";
> next;
> }
> print "--$opt=", quotemeta($val), " ";
> $opt = $val = undef;
> }
> if (/^(cc|to):\s*(.*)/i) {
> $opt = lc($1);
> $val = $2;
> }
> elsif (/^message-id:\s*(.*)/i) {
> $opt = "in-reply-to";
> $val = $1;
> }
> elsif (/^subject:\s*\[PATCH v(\d+)/i) {
> print "-v$1 ";
> }
> elsif (/^$/) {
> last;
> }
> '
> }
>
> format_patch() {
> git format-patch -s --stdout --from "$@"
> }
>
> has_nonoption=
> for i in "$@"; do
> case "$i" in
> -[0-9]*) has_nonoption=yes ;;
> -*) ;;
> *) has_nonoption=yes
> esac
> done
>
> : ${REPLY:=$HOME/patch}
> test -e "$REPLY" && eval "set -- `get_reply_headers <\"$REPLY\"` \"\$@\""
> test "$has_nonoption" = "yes" || set -- "$@" `upstream_branch`
>
> if test -t 1; then
> format_patch "$@" >.mbox
> mutt -e 'set sort=mailbox-order' -f .mbox
> rm -f .mbox
> else
> format_patch "$@" |
> perl -lne '
> if (/^Subject: (.*)/) {
> $subject = $1;
> }
> elsif ($subject && /^\s+(.*)/) {
> $subject .= " $1";
> }
> elsif ($subject) {
> print $subject;
> $subject = undef;
> }
> ' |
> sed -e 's/\[PATCH /[/' \
> -e 's/]/]:/' \
> -e 's/^/ /'
> echo
> format_patch --cover-letter "$@" |
> sed -ne '/|/,/^$/p; /^-- /q'
> fiThanks! I'll try it. Although I don't know perl, so I hope I don't need to tweak it much. :)
Cheers, Alex
-- <https://www.alejandro-colomar.es/>