2017-03-13 20:11:17 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='Test read_early_config()'
|
|
|
|
|
2021-10-30 22:24:23 +00:00
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
2017-03-13 20:11:17 +00:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
test_expect_success 'read early config' '
|
|
|
|
test_config early.config correct &&
|
2018-03-24 07:44:34 +00:00
|
|
|
test-tool config read_early_config early.config >output &&
|
2017-03-13 20:11:17 +00:00
|
|
|
test correct = "$(cat output)"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'in a sub-directory' '
|
|
|
|
test_config early.config sub &&
|
|
|
|
mkdir -p sub &&
|
|
|
|
(
|
|
|
|
cd sub &&
|
2018-03-24 07:44:34 +00:00
|
|
|
test-tool config read_early_config early.config
|
2017-03-13 20:11:17 +00:00
|
|
|
) >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 &&
|
2018-03-24 07:44:34 +00:00
|
|
|
test-tool config read_early_config early.config
|
2017-03-13 20:11:17 +00:00
|
|
|
) >output &&
|
2019-11-26 19:46:07 +00:00
|
|
|
test_must_be_empty output
|
2017-03-13 20:11:17 +00:00
|
|
|
'
|
|
|
|
|
|
|
|
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 &&
|
2018-03-24 07:44:34 +00:00
|
|
|
test-tool config read_early_config early.config
|
2017-03-13 20:11:17 +00:00
|
|
|
) >output &&
|
|
|
|
test xdg = "$(cat output)"
|
|
|
|
'
|
|
|
|
|
2017-04-17 10:10:02 +00:00
|
|
|
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 &&
|
2018-03-24 07:44:34 +00:00
|
|
|
GIT_CONFIG_PARAMETERS=$cmdline_config test-tool config \
|
2017-04-17 10:10:02 +00:00
|
|
|
read_early_config test.source >actual &&
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
home
|
|
|
|
repo
|
|
|
|
cmdline
|
|
|
|
EOF
|
|
|
|
test_cmp expected actual
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2017-03-13 20:11:26 +00:00
|
|
|
test_with_config () {
|
|
|
|
rm -rf throwaway &&
|
|
|
|
git init throwaway &&
|
|
|
|
(
|
|
|
|
cd throwaway &&
|
|
|
|
echo "$*" >.git/config &&
|
2018-03-24 07:44:34 +00:00
|
|
|
test-tool config read_early_config early.config
|
2017-03-13 20:11:26 +00:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
test_expect_success 'ignore .git/ with incompatible repository version' '
|
|
|
|
test_with_config "[core]repositoryformatversion = 999999" 2>err &&
|
2017-05-05 18:19:32 +00:00
|
|
|
test_i18ngrep "warning:.* Expected git repo version <= [1-9]" err
|
2017-03-13 20:11:26 +00:00
|
|
|
'
|
|
|
|
|
|
|
|
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 "["
|
|
|
|
'
|
|
|
|
|
config: work around bug with includeif:onbranch and early config
Since 07b2c0eacac (config: learn the "onbranch:" includeIf condition,
2019-06-05), there is a potential catch-22 in the early config path: if
the `include.onbranch:` feature is used, Git assumes that the Git
directory has been initialized already. However, in the early config
code path that is not true.
One way to trigger this is to call the following commands in any
repository:
git config includeif.onbranch:refs/heads/master.path broken
git help -a
The symptom triggered by the `git help -a` invocation reads like this:
BUG: refs.c:1851: attempting to get main_ref_store outside of repository
Let's work around this, simply by ignoring the `includeif.onbranch:`
setting when parsing the config when the ref store has not been
initialized (yet).
Technically, there is a way to solve this properly: teach the refs
machinery to initialize the ref_store from a given gitdir/commondir pair
(which we _do_ have in the early config code path), and then use that in
`include_by_branch()`. This, however, is a pretty involved project, and
we're already in the feature freeze for Git v2.23.0.
Note: when calling above-mentioned two commands _outside_ of any Git
worktree (passing the `--global` flag to `git config`, as there is
obviously no repository config available), at the point when
`include_by_branch()` is called, `the_repository` is `NULL`, therefore
we have to be extra careful not to dereference it in that case.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-07-31 20:06:42 +00:00
|
|
|
test_expect_success 'early config and onbranch' '
|
|
|
|
echo "[broken" >broken &&
|
t1309: use a neutral branch name in the `onbranch` test cases
The `onbranch` test cases touched by this patch do not actually try to
include any other config. Their purpose is to avoid regressing on two
bugs in the `include.onbranch:<name>.path` code that we fixed in the
past, bugs that are actually unrelated to any concrete branch name.
The first bug was fixed in 85fe0e800ca (config: work around bug with
includeif:onbranch and early config, 2019-07-31). Essentially, when
reading early config, there would be a catch-22 trying to access the
refs, and therefore we simply cannot evaluate the condition at that
point. The test case ensures that we avoid emitting this bogus message:
BUG: refs.c:1851: attempting to get main_ref_store outside of repository
The second test case concerns the non-Git scenario, where we simply do
not have a current branch to begin with (because we don't have a
repository in the first place), and the test case was introduced in
22932d9169f (config: stop checking whether the_repository is NULL,
2019-08-06) to ensure that we don't cause a segmentation fault should
the code still incorrectly try to look at any ref.
In short, neither of these two test cases will ever look at a current
branch name, even in case of regressions. Therefore, the actual branch
name does not matter at all. We can therefore easily avoid
racially-charged branch names here, and that's what this patch does.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-11-19 11:41:34 +00:00
|
|
|
test_with_config "[includeif \"onbranch:topic\"]path=../broken"
|
config: work around bug with includeif:onbranch and early config
Since 07b2c0eacac (config: learn the "onbranch:" includeIf condition,
2019-06-05), there is a potential catch-22 in the early config path: if
the `include.onbranch:` feature is used, Git assumes that the Git
directory has been initialized already. However, in the early config
code path that is not true.
One way to trigger this is to call the following commands in any
repository:
git config includeif.onbranch:refs/heads/master.path broken
git help -a
The symptom triggered by the `git help -a` invocation reads like this:
BUG: refs.c:1851: attempting to get main_ref_store outside of repository
Let's work around this, simply by ignoring the `includeif.onbranch:`
setting when parsing the config when the ref store has not been
initialized (yet).
Technically, there is a way to solve this properly: teach the refs
machinery to initialize the ref_store from a given gitdir/commondir pair
(which we _do_ have in the early config code path), and then use that in
`include_by_branch()`. This, however, is a pretty involved project, and
we're already in the feature freeze for Git v2.23.0.
Note: when calling above-mentioned two commands _outside_ of any Git
worktree (passing the `--global` flag to `git config`, as there is
obviously no repository config available), at the point when
`include_by_branch()` is called, `the_repository` is `NULL`, therefore
we have to be extra careful not to dereference it in that case.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-07-31 20:06:42 +00:00
|
|
|
'
|
|
|
|
|
2019-08-06 12:27:58 +00:00
|
|
|
test_expect_success 'onbranch config outside of git repo' '
|
t1309: use a neutral branch name in the `onbranch` test cases
The `onbranch` test cases touched by this patch do not actually try to
include any other config. Their purpose is to avoid regressing on two
bugs in the `include.onbranch:<name>.path` code that we fixed in the
past, bugs that are actually unrelated to any concrete branch name.
The first bug was fixed in 85fe0e800ca (config: work around bug with
includeif:onbranch and early config, 2019-07-31). Essentially, when
reading early config, there would be a catch-22 trying to access the
refs, and therefore we simply cannot evaluate the condition at that
point. The test case ensures that we avoid emitting this bogus message:
BUG: refs.c:1851: attempting to get main_ref_store outside of repository
The second test case concerns the non-Git scenario, where we simply do
not have a current branch to begin with (because we don't have a
repository in the first place), and the test case was introduced in
22932d9169f (config: stop checking whether the_repository is NULL,
2019-08-06) to ensure that we don't cause a segmentation fault should
the code still incorrectly try to look at any ref.
In short, neither of these two test cases will ever look at a current
branch name, even in case of regressions. Therefore, the actual branch
name does not matter at all. We can therefore easily avoid
racially-charged branch names here, and that's what this patch does.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-11-19 11:41:34 +00:00
|
|
|
test_config_global includeIf.onbranch:topic.path non-existent &&
|
2019-08-06 12:27:58 +00:00
|
|
|
nongit git help
|
|
|
|
'
|
|
|
|
|
2017-03-13 20:11:17 +00:00
|
|
|
test_done
|