> On 20 Feb 2017, at 10:58, Junio C Hamano <gitster@xxxxxxxxx> wrote: > > Junio C Hamano <gitster@xxxxxxxxx> writes: > >> I still haven't queued any of the variants I posted (and I do not >> think other people sent their own versions, either). I need to pick >> one and queue, with a test or two. Perhaps after -rc2. >> >> Others are welcome to work on it while I cut -rc2 tomorrow, so that >> by the time I see their patch all that is left for me to do is to >> apply it ;-) > > Since nothing seems to have happened in the meantime, here is what > I'll queue so that we won't forget for now. Lars's tests based on > how the scripted "git submodule" uses "git config" may still be > valid, but it is somewhat a roundabout way to demonstrate the > breakage and not very effective way to protect the fix, so I added a > new test that directly tests "git -c <var>=<val> <command>". Agreed. Please ignore my tests. If you want to you could queue this tiny cleanup, though: http://public-inbox.org/git/20170215113325.14393-1-larsxschneider@xxxxxxxxx/ > ... > > +/* > + * downcase the <section> and <variable> in <section>.<variable> or > + * <section>.<subsection>.<variable> and do so in place. <subsection> > + * is left intact. > + */ > +static void canonicalize_config_variable_name(char *varname) > +{ > + char *cp, *last_dot; What does cp stand for? "char pointer"? > + > + /* downcase the first segment */ > + for (cp = varname; *cp; cp++) { > + if (*cp == '.') > + break; > + *cp = tolower(*cp); > + } > + if (!*cp) > + return; > + > + /* scan for the last dot */ > + for (last_dot = cp; *cp; cp++) > + if (*cp == '.') > + last_dot = cp; > + > + /* downcase the last segment */ > + for (cp = last_dot; *cp; cp++) > + *cp = tolower(*cp); > +} > + > int git_config_parse_parameter(const char *text, > config_fn_t fn, void *data) > { > @@ -221,7 +249,7 @@ int git_config_parse_parameter(const char *text, > strbuf_list_free(pair); > return error("bogus config parameter: %s", text); > } > - strbuf_tolower(pair[0]); > + canonicalize_config_variable_name(pair[0]->buf); > if (fn(pair[0]->buf, value, data) < 0) { > strbuf_list_free(pair); > return -1; > diff --git a/t/t1351-config-cmdline.sh b/t/t1351-config-cmdline.sh > new file mode 100755 > index 0000000000..acb8dc3b15 > --- /dev/null > +++ b/t/t1351-config-cmdline.sh > @@ -0,0 +1,48 @@ > +#!/bin/sh > + > +test_description='git -c var=val' > + > +. ./test-lib.sh > + > +test_expect_success 'last one wins: two level vars' ' > + echo VAL >expect && > + > + # sec.var and sec.VAR are the same variable, as the first > + # and the last level of a configuration variable name is > + # case insensitive. Test both setting and querying. > + > + git -c sec.var=val -c sec.VAR=VAL config --get sec.var >actual && > + test_cmp expect actual && > + git -c SEC.var=val -c sec.var=VAL config --get sec.var >actual && > + test_cmp expect actual && > + > + git -c sec.var=val -c sec.VAR=VAL config --get SEC.var >actual && > + test_cmp expect actual && > + git -c SEC.var=val -c sec.var=VAL config --get sec.VAR >actual && > + test_cmp expect actual > +' > + > +test_expect_success 'last one wins: three level vars' ' > + echo val >expect && > + > + # v.a.r and v.A.r are not the same variable, as the middle > + # level of a three-level configuration variable name is > + # case sensitive. Test both setting and querying. > + > + git -c v.a.r=val -c v.A.r=VAL config --get v.a.r >actual && > + test_cmp expect actual && > + git -c v.a.r=val -c v.A.r=VAL config --get V.a.R >actual && > + test_cmp expect actual && > + > + echo VAL >expect && > + git -c v.a.r=val -c v.a.R=VAL config --get v.a.r >actual && > + test_cmp expect actual && > + git -c v.a.r=val -c V.a.r=VAL config --get v.a.r >actual && > + test_cmp expect actual && > + git -c v.a.r=val -c v.a.R=VAL config --get V.a.R >actual && > + test_cmp expect actual && > + git -c v.a.r=val -c V.a.r=VAL config --get V.a.R >actual && > + test_cmp expect actual > +' > + > +test_done > -- > 2.12.0-rc2-221-g8fa194a99f > Looks good to me! Thank you, Lars