mirror of
https://github.com/git/git.git
synced 2024-06-06 23:06:14 +02:00
config: use git_config_parse_key() in git_config_parse_parameter()
The parsing of one-shot assignments of configuration variables that come from the command line historically was quite loose and allowed anything to pass. It also downcased everything in the variable name, even a three-level <section>.<subsection>.<variable> name in which the <subsection> part must be treated in a case sensitive manner. Existing git_config_parse_key() helper is used to parse the variable name that comes from the command line, i.e. "git config VAR VAL", and handles these details correctly. Replace the strbuf_tolower() call in git_config_parse_parameter() with a call to it to correct both issues. git_config_parse_key() does a bit more things that are not necessary for the purpose of this codepath (e.g. it allocates a separate buffer to return the canonicalized variable name because it takes a "const char *" input), but we are not in a performance-critical codepath here. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
ee98df3fa4
commit
1274a155af
14
config.c
14
config.c
|
@ -295,7 +295,9 @@ int git_config_parse_parameter(const char *text,
|
|||
config_fn_t fn, void *data)
|
||||
{
|
||||
const char *value;
|
||||
char *canonical_name;
|
||||
struct strbuf **pair;
|
||||
int ret;
|
||||
|
||||
pair = strbuf_split_str(text, '=', 2);
|
||||
if (!pair[0])
|
||||
|
@ -313,13 +315,15 @@ int git_config_parse_parameter(const char *text,
|
|||
strbuf_list_free(pair);
|
||||
return error("bogus config parameter: %s", text);
|
||||
}
|
||||
strbuf_tolower(pair[0]);
|
||||
if (fn(pair[0]->buf, value, data) < 0) {
|
||||
strbuf_list_free(pair);
|
||||
return -1;
|
||||
|
||||
if (git_config_parse_key(pair[0]->buf, &canonical_name, NULL)) {
|
||||
ret = -1;
|
||||
} else {
|
||||
ret = (fn(canonical_name, value, data) < 0) ? -1 : 0;
|
||||
free(canonical_name);
|
||||
}
|
||||
strbuf_list_free(pair);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int git_config_from_parameters(config_fn_t fn, void *data)
|
||||
|
|
|
@ -1097,6 +1097,68 @@ test_expect_success 'multiple git -c appends config' '
|
|||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'last one wins: two level vars' '
|
||||
|
||||
# sec.var and sec.VAR are the same variable, as the first
|
||||
# and the last level of a configuration variable name is
|
||||
# case insensitive.
|
||||
|
||||
echo VAL >expect &&
|
||||
|
||||
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' '
|
||||
|
||||
# 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.
|
||||
|
||||
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 &&
|
||||
|
||||
# v.a.r and V.a.R are the same variable, as the first
|
||||
# and the last level of a configuration variable name is
|
||||
# case insensitive.
|
||||
|
||||
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
|
||||
'
|
||||
|
||||
for VAR in a .a a. a.0b a."b c". a."b c".0d
|
||||
do
|
||||
test_expect_success "git -c $VAR=VAL rejects invalid '$VAR'" '
|
||||
test_must_fail git -c "$VAR=VAL" config -l
|
||||
'
|
||||
done
|
||||
|
||||
for VAR in a.b a."b c".d
|
||||
do
|
||||
test_expect_success "git -c $VAR=VAL works with valid '$VAR'" '
|
||||
echo VAL >expect &&
|
||||
git -c "$VAR=VAL" config --get "$VAR" >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
done
|
||||
|
||||
test_expect_success 'git -c is not confused by empty environment' '
|
||||
GIT_CONFIG_PARAMETERS="" git -c x.one=1 config --list
|
||||
'
|
||||
|
|
Loading…
Reference in New Issue