mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
![Jeff King](/assets/img/avatar_default.png)
When we are parsing a config value, if we see a carriage return, we fgetc the next character to see if it is a line feed (in which case we silently drop the CR). If it isn't, we then ungetc the character, and take the literal CR. But we never check whether we in fact got a character at all. If the config file ends in CR, we will get EOF here, and try to ungetc EOF. This works OK for a real stdio stream. The ungetc returns an error, and the next fgetc will then return EOF again. However, our custom buffer-based stream is not so fortunate. It happily rewinds the position of the stream by one character, ignoring the fact that we fed it EOF. The next fgetc call returns the final CR again, over and over, and we end up in an infinite loop. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
80 lines
1.9 KiB
Bash
Executable file
80 lines
1.9 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='support for reading config from a blob'
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'create config blob' '
|
|
cat >config <<-\EOF &&
|
|
[some]
|
|
value = 1
|
|
EOF
|
|
git add config &&
|
|
git commit -m foo
|
|
'
|
|
|
|
test_expect_success 'list config blob contents' '
|
|
echo some.value=1 >expect &&
|
|
git config --blob=HEAD:config --list >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'fetch value from blob' '
|
|
echo true >expect &&
|
|
git config --blob=HEAD:config --bool some.value >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'reading non-existing value from blob is an error' '
|
|
test_must_fail git config --blob=HEAD:config non.existing
|
|
'
|
|
|
|
test_expect_success 'reading from blob and file is an error' '
|
|
test_must_fail git config --blob=HEAD:config --system --list
|
|
'
|
|
|
|
test_expect_success 'reading from missing ref is an error' '
|
|
test_must_fail git config --blob=HEAD:doesnotexist --list
|
|
'
|
|
|
|
test_expect_success 'reading from non-blob is an error' '
|
|
test_must_fail git config --blob=HEAD --list
|
|
'
|
|
|
|
test_expect_success 'setting a value in a blob is an error' '
|
|
test_must_fail git config --blob=HEAD:config some.value foo
|
|
'
|
|
|
|
test_expect_success 'deleting a value in a blob is an error' '
|
|
test_must_fail git config --blob=HEAD:config --unset some.value
|
|
'
|
|
|
|
test_expect_success 'editing a blob is an error' '
|
|
test_must_fail git config --blob=HEAD:config --edit
|
|
'
|
|
|
|
test_expect_success 'parse errors in blobs are properly attributed' '
|
|
cat >config <<-\EOF &&
|
|
[some]
|
|
value = "
|
|
EOF
|
|
git add config &&
|
|
git commit -m broken &&
|
|
|
|
test_must_fail git config --blob=HEAD:config some.value 2>err &&
|
|
|
|
# just grep for our token as the exact error message is likely to
|
|
# change or be internationalized
|
|
grep "HEAD:config" err
|
|
'
|
|
|
|
test_expect_success 'can parse blob ending with CR' '
|
|
printf "[some]key = value\\r" >config &&
|
|
git add config &&
|
|
git commit -m CR &&
|
|
echo value >expect &&
|
|
git config --blob=HEAD:config some.key >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_done
|