From: Harald Nordgren via GitGitGadget Date: Sun, 01 Nov 2026 08:21:35 GMT Subject: [PATCH v5 2/4] imap-send: accept messages with Subject before Date Message-ID: In-Reply-To: From: Harald Nordgren Patches sent with git send-email cannot be fed back into git imap-send after fetching them from the mailing list archive, for example with b4 mbox --single-message -o - | git imap-send which fails with "no messages found to send". imap-send only counts a message when its From, Date and Subject headers come in that order, and git send-email writes Subject before Date. Accept the three headers in any order within the header block of each message, which ends at the first empty line whether the mbox uses LF or CRLF line endings. Signed-off-by: Harald Nordgren --- imap-send.c | 25 +++++++++++++++++-------- t/t9001-send-email.sh | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 8 deletions(-) diff --git a/imap-send.c b/imap-send.c index 7e74c37a72..391bd8b96a 100644 --- a/imap-send.c +++ b/imap-send.c @@ -1457,6 +1457,22 @@ static void wrap_in_html(struct strbuf *msg) *msg = buf; } +static bool has_required_headers(const char *line) +{ + bool from = false, date = false, subject = false; + + while ((line = strchr(line, '\n')) && + *++line != '\n' && !starts_with(line, "\r\n")) { + if (starts_with(line, "From: ")) + from = true; + else if (starts_with(line, "Date: ")) + date = true; + else if (starts_with(line, "Subject: ")) + subject = true; + } + return from && date && subject; +} + static int count_messages(struct strbuf *all_msgs) { int count = 0; @@ -1472,14 +1488,7 @@ static int count_messages(struct strbuf *all_msgs) if (!p) break; p += 5; count++; - } else { - p = strstr(p+5, "\nFrom: "); - if (!p) break; - p = strstr(p+7, "\nDate: "); - if (!p) break; - p = strstr(p+7, "\nSubject: "); - if (!p) break; - p += 10; + } else if (has_required_headers(p)) { count++; } } diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index d1393ef197..4611e6d4a6 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -2863,4 +2863,42 @@ test_expect_success $PREREQ '--compose handles to headers' ' test_cmp expect msgtxt2.to ' +test_expect_success $PREREQ 'imap-send accepts a sent patch from the list archive' ' + write_script fake-imap-server <<-\EOF && + printf "* PREAUTH [CAPABILITY IMAP4rev1 LITERAL+] ready\r\n" + printf "1 OK\r\n2 OK\r\n3 OK\r\n" + cat >/dev/null + EOF + test_config imap.tunnel ./fake-imap-server && + clean_fake_sendmail && + git send-email \ + --from="Example " \ + --to=nobody@example.com \ + --smtp-server="$(pwd)/fake.sendmail" \ + HEAD^ && + { + echo "From mboxrd@z Thu Jan 1 00:00:00 1970" && + cat msgtxt1 + } >archive.mbox && + git imap-send --folder=INBOX err && + test_grep "^Sending 1 message to INBOX folder" err && + test_grep "(1/1) done" err +' + +test_expect_success $PREREQ 'imap-send ignores headers in the body of a CRLF mbox' ' + test_config imap.tunnel ./fake-imap-server && + q_to_cr >crlf.mbox <<-\EOF && + From mboxrd@z Thu Jan 1 00:00:00 1970Q + From: Example Q + Subject: Fwd: originalQ + Q + ---------- Forwarded message ---------Q + From: Someone Q + Date: Thu, 1 Jan 1970 00:00:00 +0000Q + Subject: originalQ + EOF + test_must_fail git imap-send --folder=INBOX err && + test_grep "no messages found to send" err +' + test_done -- gitgitgadget