[PATCH] send-email: fix a "first config key wins" regression in v2.33.0

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Fix a regression in my c95e3a3f0b8 (send-email: move trivial config
handling to Perl, 2021-05-28) where we'd pick the first config key out
of multiple defined ones, instead of using the normal "last key wins"
semantics of "git config --get".

This broke e.g. cases where a .git/config would have a different
sendemail.smtpServer than ~/.gitconfig. We'd pick the ~/.gitconfig
over .git/config, instead of preferring the repository-local
version. The same would go for /etc/gitconfig etc.

The full list of impacted config keys (the %config_settings values
which are references to scalars, not arrays) is:

    sendemail.smtpencryption
    sendemail.smtpserver
    sendemail.smtpserverport
    sendemail.smtpuser
    sendemail.smtppass
    sendemail.smtpdomain
    sendemail.smtpauth
    sendemail.smtpbatchsize
    sendemail.smtprelogindelay
    sendemail.tocmd
    sendemail.cccmd
    sendemail.aliasfiletype
    sendemail.envelopesender
    sendemail.confirm
    sendemail.from
    sendemail.assume8bitencoding
    sendemail.composeencoding
    sendemail.transferencoding
    sendemail.sendmailcmd

I.e. having any of these set in say ~/.gitconfig and in-repo
.git/config regressed in v2.33.0 to prefer the --global one over the
--local.

To test this add a test of config priority to one of these config
variables, most don't have tests at all, but there was an existing one
for sendemail.8bitEncoding.

The "git config" (instead of "test_config") is somewhat of an
anti-pattern, but follows established conventions in
t9001-send-email.sh, likewise with any other pattern or idiom in this
test.

The populating of home/.gitconfig and setting of HOME= is copied from
a test in t0017-env-helper.sh added in 1ff750b128e (tests: make
GIT_TEST_GETTEXT_POISON a boolean, 2019-06-21). This test fails
without this bugfix, but not works.

Reported-by: Eli Schwartz <eschwartz@xxxxxxxxxxxxx>
Tested-by: Eli Schwartz <eschwartz@xxxxxxxxxxxxx>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx>
---

On Sun, Sep 05 2021, Eli Schwartz wrote:

> [[PGP Signed Part:Undecided]]
> On 9/5/21 8:04 PM, Ævar Arnfjörð Bjarmason wrote:
>> 
>> On Sun, Sep 05 2021, Eli Schwartz wrote:
>> 
>>> I recently noticed that git send-email was attempting to send emails
>>> using the wrong email address. I have a global email configuration in
>>> XDG_CONFIG_HOME, and a specific one set in the {repo}/.git/config of
>>> some repos... this was trying to use the global configuration.
>>>
>>> `git config -l | grep ^sendemail.smtpserver=` reports two emails

[...]

>>> `git config --get sendemail.smtpserver` reports only the second,
>>> repo-specific one
>>>
>>>
>>> I bisected the issue to commit c95e3a3f0b8107b5dc7eac9dfdb9e5238280c9fb
>>>
>>>     send-email: move trivial config handling to Perl
>>>
>>>
>>> Using this commit, git-send-email disagrees with git config --get on
>>> which email to use.
>>>
>>> Using commit f4dc9432fd287bde9100488943baf3c6a04d90d1 immediately
>>> preceding this commit, git send-email agrees with git config --get.
>> 
>> That's a pretty bad bug, sorry about that. I believe that the following
>> patch should fix it (needs tests obviously). I.e. when we had N config
>> keys we'd previously pick the normal "last key wins", which my
>> c95e3a3f0b8107b5dc7eac9dfdb9e5238280c9fb changed to "first wins":
>> 
>> diff --git a/git-send-email.perl b/git-send-email.perl
>> index e65d969d0bb..6c7ab3d2e91 100755
>> --- a/git-send-email.perl
>> +++ b/git-send-email.perl
>> @@ -376,7 +376,7 @@ sub read_config {
>>  			@$target = @values;
>>  		}
>>  		else {
>> -			my $v = $known_keys->{$key}->[0];
>> +			my $v = $known_keys->{$key}->[-1];
>>  			next unless defined $v;
>>  			next if $configured->{$setting}++;
>>  			$$target = $v;
>> 
>
>
>
> Thanks, this worked for me and fixed my problem! Feel free to add my
> tested-by.

Added, and here's a properly formatted patch with a regression test.

 git-send-email.perl   |  2 +-
 t/t9001-send-email.sh | 15 +++++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/git-send-email.perl b/git-send-email.perl
index e65d969d0bb..6c7ab3d2e91 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -376,7 +376,7 @@ sub read_config {
 			@$target = @values;
 		}
 		else {
-			my $v = $known_keys->{$key}->[0];
+			my $v = $known_keys->{$key}->[-1];
 			next unless defined $v;
 			next if $configured->{$setting}++;
 			$$target = $v;
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index 57fc10e7f82..eae172e0a05 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -1533,6 +1533,21 @@ test_expect_success $PREREQ 'sendemail.8bitEncoding works' '
 	test_cmp content-type-decl actual
 '
 
+test_expect_success $PREREQ 'sendemail.8bitEncoding in .git/config overrides --global .gitconfig' '
+	clean_fake_sendmail &&
+	git config sendemail.assume8bitEncoding UTF-8 &&
+	test_when_finished "rm -rf home" &&
+	mkdir home &&
+	git config -f home/.gitconfig sendemail.assume8bitEncoding "bogus too" &&
+	echo bogus |
+	env HOME="$(pwd)/home" DEBUG=1 \
+	git send-email --from=author@xxxxxxxxxxx --to=nobody@xxxxxxxxxxx \
+			--smtp-server="$(pwd)/fake.sendmail" \
+			email-using-8bit >stdout &&
+	egrep "Content|MIME" msgtxt1 >actual &&
+	test_cmp content-type-decl actual
+'
+
 test_expect_success $PREREQ '--8bit-encoding overrides sendemail.8bitEncoding' '
 	clean_fake_sendmail &&
 	git config sendemail.assume8bitEncoding "bogus too" &&
-- 
2.33.0.821.gfd4106eadbd




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux