git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: git-send-email: Send with mutt(1)

From
ACAlejandro Colomar <alx@kernel.org>
Date
Nov 8, 2023, 21:02 UTC
Message-ID
<ZUv3gjjmuqvCaJEd@debian>
In-Reply-To
<20231107201655.GA507701@coredump.intra.peff.net>
Hi Jeff!
On Tue, Nov 07, 2023 at 03:16:55PM -0500, Jeff King wrote:
Show 7 quoted lines
> > 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?
> 
> That seems like a reasonable feature. Probably it should be
> --cc-from-trailer=signed-off-by, and then you could do the same with
> other trailers.

That would work for me. I only suggested the other one because it's aleady in send-email in that form. But yeah, it might be useful to have finer control. In my case, something that CCs every mail in the trailer would work (Reviewed-by, Suggested-by, ... I want them all, always).

Show 10 quoted lines
> 
> It feels like you could _almost_ do it with the existing
> --format='%(trailers)' functionality, but there's no way to say "do the
> regular --format=email output, but also stick this extra format in the
> headers section". Plus there are probably some niceties you'd get from
> Git knowing that you're adding headers (like de-duping addresses).
> 
> That feature might end up somewhat hairy, though, as then you get into
> questions of parsing address lists, etc. We do all that now in perl with
> send-email, where we can lean on some parsing libraries. So I dunno.
Hmmm.
Show 28 quoted lines
> 
> > > 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?
> 
> Yeah, if they existed in format-patch I might be able to reuse them. I
> am hesitant, though, just because handling all the corner cases on
> parsing is going to be a bit of new C code.
> 
> > Although then, maybe it's simpler to teach send-email to learn to use
> > mutt(1) under the hood for the actual send.
> 
> I think you will find some corner cases in trying to make mutt act just
> like an mta accepting delivery. Two I can think of:
> 
>   1. It will take a body on stdin, but not a whole message. We can hack
>      around that with some postponed-folder magic, though.
> 
>   2. Bcc headers are stripped before sendmail sees the message (but
>      those addresses appear on the command-line). Converting that back
>      to bcc so that mutt can then re-strip them would be annoying but
>      possible. If you don't use bcc, it probably makes sense to just
>      punt on this.
Meh, I can live with no Bcc feature; I never used it before.  :)
Show 19 quoted lines
> 
> So maybe a script like this:
> 
> -- >8 --
> #!/bin/sh
> 
> # ignore arguments; mutt will parse them itself
> # from to/cc headers. Note that we'll miss bcc this
> # way, but handling that would probably be kind of
> # tricky; we'd need to re-add those recipients as actual
> # bcc headers so that mutt knows how to handle them.
> 
> # spool the message to a fake mbox; we need to add
> # a "From" line to make it look legit
> trap 'rm -f to-send' 0 &&
> {
>   echo "From whatever Mon Sep 17 00:00:00 2001" &&
>   cat
> } >to-send &&
Would a named pipe work?  Or maybe we could use $(mktemp)?
Show 9 quoted lines
> 
> # and then have mutt "resume" it. We have to redirect
> # stdin back from the terminal, since ours is a pipe
> # with the message contents.
> mutt -p \
>   -e 'set postponed=to-send' \
>   -e 'set edit_headers=yes' \
>   </dev/tty
> -- 8< --

Huh, this is magic sauce! Works perfect for what I need. This would need to be packaged to the masses. :-)

I found a minor problem: If I ctrl+C within mutt(1), I expect it to cancel the last action, but this script intercepts the signal and exits. We would probably need to ignore SIGINT from mutt-as-mta.

Other than that, this fulfills all of my needs.

Would you mind adding this as part of git? Or should we suggest the mutt project adding this script?

Thanks a lot!

Cheers, Alex

Show 13 quoted lines
> 
> and then in your git config:
> 
>   [sendemail]
>   sendmailcmd = /path/to/mutt-as-mta.sh
> 
> There are mutt-specific bits there that I don't think send-email should
> have to know about. Perhaps there are generic options that send-email
> could learn, but it really feels like you'd do better teaching mutt to
> be more ready to handle this (like taking a whole message on stdin,
> headers and all, rather than just a body).
> 
> -Peff
-- 
<https://www.alejandro-colomar.es/>
Previous: Jeff KingNext: Jeff King
Message 5 of 17 in “git-send-email: Send with mutt(1)”
  1. Alejandro ColomarNov 7, 2023
  2. Jeff KingNov 7, 2023
  3. Alejandro ColomarNov 7, 2023
  4. Jeff KingNov 7, 2023
  5. Alejandro ColomarNov 8, 2023
  6. Jeff KingNov 8, 2023
  7. Alejandro ColomarNov 9, 2023
  8. Konstantin RyabitsevNov 9, 2023
  9. Alejandro ColomarNov 9, 2023
  10. Konstantin RyabitsevNov 9, 2023
  11. Alejandro ColomarNov 10, 2023
  12. Jeff KingNov 9, 2023
  13. Alejandro ColomarNov 9, 2023
  14. Alejandro ColomarNov 10, 2023
  15. Alejandro ColomarNov 10, 2023
  16. Jeff KingNov 10, 2023
  17. Junio C HamanoNov 10, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.