summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2007-12-05 23:07:23 (GMT)
committerJunio C Hamano <gitster@pobox.com>2007-12-05 23:07:23 (GMT)
commit9d25acc49a98ca82988ad871753a45e41f3c90f5 (patch)
tree1ec1caad4bc04b7adf34336a2e6c4706a365a7a0
parent4e596e988abfd7ce0b4456cdbf27baa16fa7aab8 (diff)
parent9459aa77a032621a29d53605542844641cca843a (diff)
downloadgit-9d25acc49a98ca82988ad871753a45e41f3c90f5.zip
git-9d25acc49a98ca82988ad871753a45e41f3c90f5.tar.gz
git-9d25acc49a98ca82988ad871753a45e41f3c90f5.tar.bz2
Merge branch 'nd/maint-work-tree-fix' into maint
* nd/maint-work-tree-fix: Do check_repository_format() early (re-fix) Do check_repository_format() early Add missing inside_work_tree setting in setup_git_directory_gently
-rw-r--r--setup.c36
-rwxr-xr-xt/t1302-repo-version.sh46
2 files changed, 75 insertions, 7 deletions
diff --git a/setup.c b/setup.c
index 145eca5..067f1be 100644
--- a/setup.c
+++ b/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.
@@ -230,8 +246,15 @@ const char *setup_git_directory_gently(int *nongit_ok)
static char buffer[1024 + 1];
const char *retval;
- if (!work_tree_env)
- return set_work_tree(gitdirenv);
+ if (!work_tree_env) {
+ retval = set_work_tree(gitdirenv);
+ /* config may override worktree */
+ if (check_repository_format_gently(nongit_ok))
+ return NULL;
+ return retval;
+ }
+ if (check_repository_format_gently(nongit_ok))
+ return NULL;
retval = get_relative_cwd(buffer, sizeof(buffer) - 1,
get_git_work_tree());
if (!retval || !*retval)
@@ -270,6 +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_gently(nongit_ok);
return NULL;
}
chdir("..");
@@ -290,6 +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);
+ if (check_repository_format_gently(nongit_ok))
+ return NULL;
if (offset == len)
return NULL;
@@ -340,11 +366,7 @@ 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)
diff --git a/t/t1302-repo-version.sh b/t/t1302-repo-version.sh
new file mode 100755
index 0000000..37fc1c8
--- /dev/null
+++ b/t/t1302-repo-version.sh
@@ -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