config: report errors at the EOL with correct line number

A section in a config file with a missing "]" reports the next line
as bad, same goes to a value with a missing end quote.

This happens because the error is not detected until the end of the
line, when line number is already increased. Fix this by decreasing
line number by one for these cases.

Signed-off-by: Martin Stenberg <martin@gnutiken.se>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Martin Stenberg 2012-03-09 22:57:54 +01:00 коммит произвёл Junio C Hamano
Родитель d909e0761c
Коммит 4b34059355
2 изменённых файлов: 40 добавлений и 4 удалений

Просмотреть файл

@ -135,8 +135,10 @@ static char *parse_value(void)
for (;;) { for (;;) {
int c = get_next_char(); int c = get_next_char();
if (c == '\n') { if (c == '\n') {
if (quote) if (quote) {
cf->linenr--;
return NULL; return NULL;
}
return cf->value.buf; return cf->value.buf;
} }
if (comment) if (comment)
@ -226,7 +228,7 @@ static int get_extended_base_var(char *name, int baselen, int c)
{ {
do { do {
if (c == '\n') if (c == '\n')
return -1; goto error_incomplete_line;
c = get_next_char(); c = get_next_char();
} while (isspace(c)); } while (isspace(c));
@ -238,13 +240,13 @@ static int get_extended_base_var(char *name, int baselen, int c)
for (;;) { for (;;) {
int c = get_next_char(); int c = get_next_char();
if (c == '\n') if (c == '\n')
return -1; goto error_incomplete_line;
if (c == '"') if (c == '"')
break; break;
if (c == '\\') { if (c == '\\') {
c = get_next_char(); c = get_next_char();
if (c == '\n') if (c == '\n')
return -1; goto error_incomplete_line;
} }
name[baselen++] = c; name[baselen++] = c;
if (baselen > MAXNAME / 2) if (baselen > MAXNAME / 2)
@ -255,6 +257,9 @@ static int get_extended_base_var(char *name, int baselen, int c)
if (get_next_char() != ']') if (get_next_char() != ']')
return -1; return -1;
return baselen; return baselen;
error_incomplete_line:
cf->linenr--;
return -1;
} }
static int get_base_var(char *name) static int get_base_var(char *name)

Просмотреть файл

@ -928,4 +928,35 @@ test_expect_success 'git -c complains about empty key and value' '
test_must_fail git -c "" rev-parse test_must_fail git -c "" rev-parse
' '
# malformed configuration files
test_expect_success 'barf on syntax error' '
cat >.git/config <<-\EOF &&
# broken section line
[section]
key garbage
EOF
test_must_fail git config --get section.key >actual 2>error &&
grep " line 3 " error
'
test_expect_success 'barf on incomplete section header' '
cat >.git/config <<-\EOF &&
# broken section line
[section
key = value
EOF
test_must_fail git config --get section.key >actual 2>error &&
grep " line 2 " error
'
test_expect_success 'barf on incomplete string' '
cat >.git/config <<-\EOF &&
# broken section line
[section]
key = "value string
EOF
test_must_fail git config --get section.key >actual 2>error &&
grep " line 3 " error
'
test_done test_done