Hi Jeff, On Tue, Nov 07, 2023 at 12:48:03PM -0500, Jeff King wrote: > 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? > > 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. > 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' > fi Thanks! 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/>
Attachment:
signature.asc
Description: PGP signature