]> git.ipfire.org Git - thirdparty/git.git/commitdiff
send-email: clear the $message_id after validation
authorJunio C Hamano <gitster@pobox.com>
Wed, 17 May 2023 21:10:39 +0000 (14:10 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 17 May 2023 21:11:38 +0000 (14:11 -0700)
Recently git-send-email started parsing the same message twice, once
to validate _all_ the message before sending even the first one, and
then after the validation hook is happy and each message gets sent,
to read the contents to find out where to send to etc.

Unfortunately, the effect of reading the messages for validation
lingered even after the validation is done.  Namely $message_id gets
assigned if exists in the input files but the variable is global,
and it is not cleared before pre_process_file runs.  This causes
reading a message without a message-id followed by reading a message
with a message-id to misbehave---the sub reports as if the message
had the same id as the previously written one.

Clear the variable before starting to read the headers in
pre_process_file.

Tested-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-send-email.perl
t/t9001-send-email.sh

index 10c450ef68902c7dfcc2289acf72319f38f37346..37dfd4b8c57c47624cf1210c84d8e96ebe80a385 100755 (executable)
@@ -1768,6 +1768,8 @@ sub pre_process_file {
        $subject = $initial_subject;
        $message = "";
        $message_num++;
+       undef $message_id;
+
        # First unfold multiline header fields
        while(<$fh>) {
                last if /^\s*$/;
index 36bb85d6b4aaf098fbe979eea7d117a7791fbf5d..8d49eff91a384e0df883e242ffdfd0edac6c3c60 100755 (executable)
@@ -47,7 +47,7 @@ clean_fake_sendmail () {
 
 test_expect_success $PREREQ 'Extract patches' '
        patches=$(git format-patch -s --cc="One <one@example.com>" --cc=two@example.com -n HEAD^1) &&
-       threaded_patches=$(git format-patch -o threaded -s --in-reply-to="format" HEAD^1)
+       threaded_patches=$(git format-patch -o threaded --thread=shallow -s --in-reply-to="format" HEAD^1)
 '
 
 # Test no confirm early to ensure remaining tests will not hang
@@ -588,6 +588,21 @@ test_expect_success $PREREQ "--validate hook supports header argument" '
                outdir/000?-*.patch
 '
 
+test_expect_success $PREREQ 'clear message-id before parsing a new message' '
+       clean_fake_sendmail &&
+       echo true | write_script my-hooks/sendemail-validate &&
+       test_config core.hooksPath my-hooks &&
+       GIT_SEND_EMAIL_NOTTY=1 \
+       git send-email --validate --to=recipient@example.com \
+               --smtp-server="$(pwd)/fake.sendmail" \
+               $patches $threaded_patches &&
+       id0=$(grep "^Message-ID: " $threaded_patches) &&
+       id1=$(grep "^Message-ID: " msgtxt1) &&
+       id2=$(grep "^Message-ID: " msgtxt2) &&
+       test "z$id0" = "z$id2" &&
+       test "z$id1" != "z$id2"
+'
+
 for enc in 7bit 8bit quoted-printable base64
 do
        test_expect_success $PREREQ "--transfer-encoding=$enc produces correct header" '