mirror of
https://github.com/git/git
synced 2024-10-02 14:45:21 +00:00
d14d42440d
When we see a relative config include like: [include] path = foo we make it relative to the containing directory of the file that contains the snippet. This makes no sense for config read from a blob, as it is not on the filesystem. Something like "HEAD:some/path" could have a relative path within the tree, but: 1. It would not be part of include.path, which explicitly refers to the filesystem. 2. It would need different parsing rules anyway to determine that it is a tree path. The current code just uses the "name" field, which is wrong. Let's split that into "name" and "path" fields, use the latter for relative includes, and fill in only the former for blobs. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name> Signed-off-by: Junio C Hamano <gitster@pobox.com>
159 lines
4.1 KiB
Bash
Executable file
159 lines
4.1 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='test config file include directives'
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'include file by absolute path' '
|
|
echo "[test]one = 1" >one &&
|
|
echo "[include]path = \"$(pwd)/one\"" >.gitconfig &&
|
|
echo 1 >expect &&
|
|
git config test.one >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'include file by relative path' '
|
|
echo "[test]one = 1" >one &&
|
|
echo "[include]path = one" >.gitconfig &&
|
|
echo 1 >expect &&
|
|
git config test.one >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'chained relative paths' '
|
|
mkdir subdir &&
|
|
echo "[test]three = 3" >subdir/three &&
|
|
echo "[include]path = three" >subdir/two &&
|
|
echo "[include]path = subdir/two" >.gitconfig &&
|
|
echo 3 >expect &&
|
|
git config test.three >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'include paths get tilde-expansion' '
|
|
echo "[test]one = 1" >one &&
|
|
echo "[include]path = ~/one" >.gitconfig &&
|
|
echo 1 >expect &&
|
|
git config test.one >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'include options can still be examined' '
|
|
echo "[test]one = 1" >one &&
|
|
echo "[include]path = one" >.gitconfig &&
|
|
echo one >expect &&
|
|
git config include.path >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'listing includes option and expansion' '
|
|
echo "[test]one = 1" >one &&
|
|
echo "[include]path = one" >.gitconfig &&
|
|
cat >expect <<-\EOF &&
|
|
include.path=one
|
|
test.one=1
|
|
EOF
|
|
git config --list >actual.full &&
|
|
grep -v ^core actual.full >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'single file lookup does not expand includes by default' '
|
|
echo "[test]one = 1" >one &&
|
|
echo "[include]path = one" >.gitconfig &&
|
|
test_must_fail git config -f .gitconfig test.one &&
|
|
test_must_fail git config --global test.one &&
|
|
echo 1 >expect &&
|
|
git config --includes -f .gitconfig test.one >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'single file list does not expand includes by default' '
|
|
echo "[test]one = 1" >one &&
|
|
echo "[include]path = one" >.gitconfig &&
|
|
echo "include.path=one" >expect &&
|
|
git config -f .gitconfig --list >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'writing config file does not expand includes' '
|
|
echo "[test]one = 1" >one &&
|
|
echo "[include]path = one" >.gitconfig &&
|
|
git config test.two 2 &&
|
|
echo 2 >expect &&
|
|
git config --no-includes test.two >actual &&
|
|
test_cmp expect actual &&
|
|
test_must_fail git config --no-includes test.one
|
|
'
|
|
|
|
test_expect_success 'config modification does not affect includes' '
|
|
echo "[test]one = 1" >one &&
|
|
echo "[include]path = one" >.gitconfig &&
|
|
git config test.one 2 &&
|
|
echo 1 >expect &&
|
|
git config -f one test.one >actual &&
|
|
test_cmp expect actual &&
|
|
cat >expect <<-\EOF &&
|
|
1
|
|
2
|
|
EOF
|
|
git config --get-all test.one >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'missing include files are ignored' '
|
|
cat >.gitconfig <<-\EOF &&
|
|
[include]path = foo
|
|
[test]value = yes
|
|
EOF
|
|
echo yes >expect &&
|
|
git config test.value >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'absolute includes from command line work' '
|
|
echo "[test]one = 1" >one &&
|
|
echo 1 >expect &&
|
|
git -c include.path="$PWD/one" config test.one >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'relative includes from command line fail' '
|
|
echo "[test]one = 1" >one &&
|
|
test_must_fail git -c include.path=one config test.one
|
|
'
|
|
|
|
test_expect_success 'absolute includes from blobs work' '
|
|
echo "[test]one = 1" >one &&
|
|
echo "[include]path=$(pwd)/one" >blob &&
|
|
blob=$(git hash-object -w blob) &&
|
|
echo 1 >expect &&
|
|
git config --blob=$blob test.one >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'relative includes from blobs fail' '
|
|
echo "[test]one = 1" >one &&
|
|
echo "[include]path=one" >blob &&
|
|
blob=$(git hash-object -w blob) &&
|
|
test_must_fail git config --blob=$blob test.one
|
|
'
|
|
|
|
test_expect_success 'include cycles are detected' '
|
|
cat >.gitconfig <<-\EOF &&
|
|
[test]value = gitconfig
|
|
[include]path = cycle
|
|
EOF
|
|
cat >cycle <<-\EOF &&
|
|
[test]value = cycle
|
|
[include]path = .gitconfig
|
|
EOF
|
|
cat >expect <<-\EOF &&
|
|
gitconfig
|
|
cycle
|
|
EOF
|
|
test_must_fail git config --get-all test.value 2>stderr &&
|
|
grep "exceeded maximum include depth" stderr
|
|
'
|
|
|
|
test_done
|