Skip to content

Commit

Permalink
Do check_repository_format() early (re-fix)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Nguyễn Thái Ngọc Duy authored and Junio C Hamano committed Dec 5, 2007
1 parent 138dd1e commit 9459aa7
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 12 deletions.
38 changes: 26 additions & 12 deletions setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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)
Expand All @@ -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) {
Expand Down Expand Up @@ -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("..");
Expand All @@ -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;

Expand Down Expand Up @@ -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) {
Expand Down
46 changes: 46 additions & 0 deletions t/t1302-repo-version.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 9459aa7

Please sign in to comment.