Do check_repository_format() early (re-fix)
This pushes check_repository_format() (actually _gently() version) to setup_git_directory_gently() in order to prevent from using unsupported repositories. New setup_git_directory_gently()'s behaviour is stop searching for a valid gitdir and return as if there is no gitdir if a unsupported repository is found. Warning will be thrown in these cases. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
138dd1e990
commit
9459aa77a0
38
setup.c
38
setup.c
@ -206,6 +206,22 @@ static const char *set_work_tree(const char *dir)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int check_repository_format_gently(int *nongit_ok)
|
||||
{
|
||||
git_config(check_repository_format_version);
|
||||
if (GIT_REPO_VERSION < repository_format_version) {
|
||||
if (!nongit_ok)
|
||||
die ("Expected git repo version <= %d, found %d",
|
||||
GIT_REPO_VERSION, repository_format_version);
|
||||
warning("Expected git repo version <= %d, found %d",
|
||||
GIT_REPO_VERSION, repository_format_version);
|
||||
warning("Please upgrade Git");
|
||||
*nongit_ok = -1;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* We cannot decide in this function whether we are in the work tree or
|
||||
* not, since the config can only be read _after_ this function was called.
|
||||
@ -232,12 +248,13 @@ const char *setup_git_directory_gently(int *nongit_ok)
|
||||
|
||||
if (!work_tree_env) {
|
||||
retval = set_work_tree(gitdirenv);
|
||||
/* config may override worktree
|
||||
* see set_work_tree comment */
|
||||
check_repository_format();
|
||||
/* config may override worktree */
|
||||
if (check_repository_format_gently(nongit_ok))
|
||||
return NULL;
|
||||
return retval;
|
||||
}
|
||||
check_repository_format();
|
||||
if (check_repository_format_gently(nongit_ok))
|
||||
return NULL;
|
||||
retval = get_relative_cwd(buffer, sizeof(buffer) - 1,
|
||||
get_git_work_tree());
|
||||
if (!retval || !*retval)
|
||||
@ -246,7 +263,6 @@ const char *setup_git_directory_gently(int *nongit_ok)
|
||||
if (chdir(work_tree_env) < 0)
|
||||
die ("Could not chdir to %s", work_tree_env);
|
||||
strcat(buffer, "/");
|
||||
inside_work_tree = 1;
|
||||
return retval;
|
||||
}
|
||||
if (nongit_ok) {
|
||||
@ -277,7 +293,7 @@ const char *setup_git_directory_gently(int *nongit_ok)
|
||||
if (!work_tree_env)
|
||||
inside_work_tree = 0;
|
||||
setenv(GIT_DIR_ENVIRONMENT, ".", 1);
|
||||
check_repository_format();
|
||||
check_repository_format_gently(nongit_ok);
|
||||
return NULL;
|
||||
}
|
||||
chdir("..");
|
||||
@ -298,7 +314,8 @@ const char *setup_git_directory_gently(int *nongit_ok)
|
||||
if (!work_tree_env)
|
||||
inside_work_tree = 1;
|
||||
git_work_tree_cfg = xstrndup(cwd, offset);
|
||||
check_repository_format();
|
||||
if (check_repository_format_gently(nongit_ok))
|
||||
return NULL;
|
||||
if (offset == len)
|
||||
return NULL;
|
||||
|
||||
@ -349,16 +366,13 @@ int check_repository_format_version(const char *var, const char *value)
|
||||
|
||||
int check_repository_format(void)
|
||||
{
|
||||
git_config(check_repository_format_version);
|
||||
if (GIT_REPO_VERSION < repository_format_version)
|
||||
die ("Expected git repo version <= %d, found %d",
|
||||
GIT_REPO_VERSION, repository_format_version);
|
||||
return 0;
|
||||
return check_repository_format_gently(NULL);
|
||||
}
|
||||
|
||||
const char *setup_git_directory(void)
|
||||
{
|
||||
const char *retval = setup_git_directory_gently(NULL);
|
||||
check_repository_format();
|
||||
|
||||
/* If the work tree is not the default one, recompute prefix */
|
||||
if (inside_work_tree < 0) {
|
||||
|
46
t/t1302-repo-version.sh
Executable file
46
t/t1302-repo-version.sh
Executable file
@ -0,0 +1,46 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2007 Nguyễn Thái Ngọc Duy
|
||||
#
|
||||
|
||||
test_description='Test repository version check'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
cat >test.patch <<EOF
|
||||
diff --git a/test.txt b/test.txt
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/test.txt
|
||||
@@ -0,0 +1 @@
|
||||
+123
|
||||
EOF
|
||||
|
||||
test_create_repo "test"
|
||||
test_create_repo "test2"
|
||||
|
||||
GIT_CONFIG=test2/.git/config git config core.repositoryformatversion 99 || exit 1
|
||||
|
||||
test_expect_success 'gitdir selection on normal repos' '
|
||||
(test "$(git config core.repositoryformatversion)" = 0 &&
|
||||
cd test &&
|
||||
test "$(git config core.repositoryformatversion)" = 0)'
|
||||
|
||||
# Make sure it would stop at test2, not trash
|
||||
test_expect_success 'gitdir selection on unsupported repo' '
|
||||
(cd test2 &&
|
||||
test "$(git config core.repositoryformatversion)" = 99)'
|
||||
|
||||
test_expect_success 'gitdir not required mode' '
|
||||
(git apply --stat test.patch &&
|
||||
cd test && git apply --stat ../test.patch &&
|
||||
cd ../test2 && git apply --stat ../test.patch)'
|
||||
|
||||
test_expect_success 'gitdir required mode on normal repos' '
|
||||
(git apply --check --index test.patch &&
|
||||
cd test && git apply --check --index ../test.patch)'
|
||||
|
||||
test_expect_failure 'gitdir required mode on unsupported repo' '
|
||||
(cd test2 && git apply --check --index ../test.patch)'
|
||||
|
||||
test_done
|
Loading…
Reference in New Issue
Block a user