e145a0bc9b
Config file reading order is important because each file can override values in the previous files and this is expected behavior. Normally we read in this order, all in do_git_config_sequence(): 1. $HOME/.gitconfig 2. $GIT_DIR/config 3. config from command line However in read_early_config() the order may be swapped a bit if setup_git_directory() has not been called: 1. $HOME/.gitconfig 2. $GIT_DIR/config is NOT read because .git dir is not found _yet_ 3. config from command line 4. $GIT_DIR/config is now READ (after discover_git_directory() call) The reading at step 4 could override config at step 3, which is not the expectation. Now that we could pass the .git dir around, we could feed discover_git_directory() back to step 2, so that it works again, and remove step 4. Noticed-by: Jeff King <peff@peff.net> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
93 lines
2.0 KiB
Bash
Executable File
93 lines
2.0 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='Test read_early_config()'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'read early config' '
|
|
test_config early.config correct &&
|
|
test-config read_early_config early.config >output &&
|
|
test correct = "$(cat output)"
|
|
'
|
|
|
|
test_expect_success 'in a sub-directory' '
|
|
test_config early.config sub &&
|
|
mkdir -p sub &&
|
|
(
|
|
cd sub &&
|
|
test-config read_early_config early.config
|
|
) >output &&
|
|
test sub = "$(cat output)"
|
|
'
|
|
|
|
test_expect_success 'ceiling' '
|
|
test_config early.config ceiling &&
|
|
mkdir -p sub &&
|
|
(
|
|
GIT_CEILING_DIRECTORIES="$PWD" &&
|
|
export GIT_CEILING_DIRECTORIES &&
|
|
cd sub &&
|
|
test-config read_early_config early.config
|
|
) >output &&
|
|
test -z "$(cat output)"
|
|
'
|
|
|
|
test_expect_success 'ceiling #2' '
|
|
mkdir -p xdg/git &&
|
|
git config -f xdg/git/config early.config xdg &&
|
|
test_config early.config ceiling &&
|
|
mkdir -p sub &&
|
|
(
|
|
XDG_CONFIG_HOME="$PWD"/xdg &&
|
|
GIT_CEILING_DIRECTORIES="$PWD" &&
|
|
export GIT_CEILING_DIRECTORIES XDG_CONFIG_HOME &&
|
|
cd sub &&
|
|
test-config read_early_config early.config
|
|
) >output &&
|
|
test xdg = "$(cat output)"
|
|
'
|
|
|
|
cmdline_config="'test.source=cmdline'"
|
|
test_expect_success 'read config file in right order' '
|
|
echo "[test]source = home" >>.gitconfig &&
|
|
git init foo &&
|
|
(
|
|
cd foo &&
|
|
echo "[test]source = repo" >>.git/config &&
|
|
GIT_CONFIG_PARAMETERS=$cmdline_config test-config \
|
|
read_early_config test.source >actual &&
|
|
cat >expected <<-\EOF &&
|
|
home
|
|
repo
|
|
cmdline
|
|
EOF
|
|
test_cmp expected actual
|
|
)
|
|
'
|
|
|
|
test_with_config () {
|
|
rm -rf throwaway &&
|
|
git init throwaway &&
|
|
(
|
|
cd throwaway &&
|
|
echo "$*" >.git/config &&
|
|
test-config read_early_config early.config
|
|
)
|
|
}
|
|
|
|
test_expect_success 'ignore .git/ with incompatible repository version' '
|
|
test_with_config "[core]repositoryformatversion = 999999" 2>err &&
|
|
grep "warning:.* Expected git repo version <= [1-9]" err
|
|
'
|
|
|
|
test_expect_failure 'ignore .git/ with invalid repository version' '
|
|
test_with_config "[core]repositoryformatversion = invalid"
|
|
'
|
|
|
|
|
|
test_expect_failure 'ignore .git/ with invalid config' '
|
|
test_with_config "["
|
|
'
|
|
|
|
test_done
|