[PATCH] Do check_repository_format() early

Subsystems: the rest

STALE3736d

11 messages, 3 authors, 2016-06-15 · open the first message on its own page

[PATCH] Do check_repository_format() early

From: Nguyễn Thái Ngọc Duy <hidden>
Date: 2016-06-15 22:43:54

Repository version check is only performed when
setup_git_directory() is called. This makes sure
setup_git_directory_gently() does the check too.

Signed-off-by: Nguyễn Thái Ngọc Duy <redacted>
---
 My worktree work still not done yet, so push this first.

 setup.c |   12 +++++++++---
 1 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/setup.c b/setup.c
index faf4137..19a8a77 100644
--- a/setup.c
+++ b/setup.c
@@ -246,8 +246,13 @@ 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 */
+				check_repository_format();
+				return retval;
+			}
+			check_repository_format();
 			retval = get_relative_cwd(buffer, sizeof(buffer) - 1,
 					get_git_work_tree());
 			if (!retval || !*retval)
@@ -287,6 +292,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();
 			return NULL;
 		}
 		chdir("..");
@@ -307,6 +313,7 @@ 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 (offset == len)
 		return NULL;
 
@@ -367,7 +374,6 @@ int check_repository_format(void)
 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) {
-- 
1.5.3.6.2041.g106f-dirty

Re: [PATCH] Do check_repository_format() early

From: Johannes Schindelin <hidden>
Date: 2016-06-15 22:43:54

Hi,

On Wed, 28 Nov 2007, Nguyễn Thái Ngọc Duy wrote:
quoted hunk
@@ -246,8 +246,13 @@ 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 */
+				check_repository_format();
+				return retval;
+			}
+			check_repository_format();
Why not move this check before the if?  Other than that, ACK.

Ciao,
Dscho

Re: [PATCH] Do check_repository_format() early

From: Nguyen Thai Ngoc Duy <hidden>
Date: 2016-06-15 22:43:54

On Nov 29, 2007 12:05 AM, Johannes Schindelin
[off-list ref] wrote:
Hi,

On Wed, 28 Nov 2007, Nguyen Thai Ngoc Duy wrote:
quoted
@@ -246,8 +246,13 @@ 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 */
+                             check_repository_format();
+                             return retval;
+                     }
+                     check_repository_format();
Why not move this check before the if?  Other than that, ACK.
If so it would be called twice if work_tree_env is not set.
Ciao,
Dscho


-- 
Duy

Re: [PATCH] Do check_repository_format() early

From: Johannes Schindelin <hidden>
Date: 2016-06-15 22:43:54

Hi,

On Thu, 29 Nov 2007, Nguyen Thai Ngoc Duy wrote:
On Nov 29, 2007 12:05 AM, Johannes Schindelin
[off-list ref] wrote:
quoted
On Wed, 28 Nov 2007, Nguyen Thai Ngoc Duy wrote:
quoted
@@ -246,8 +246,13 @@ 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 */
+                             check_repository_format();
+                             return retval;
+                     }
+                     check_repository_format();
Why not move this check before the if?  Other than that, ACK.
If so it would be called twice if work_tree_env is not set.
Well, I would have left the original

			if (!work_tree_env)
				return set_work_tree(gitdirenv);

alone...

If that is not possible, it might be good to add a comment as to why.

Ciao,
Dscho

Re: [PATCH] Do check_repository_format() early

From: Nguyen Thai Ngoc Duy <hidden>
Date: 2016-06-15 22:43:54

On Nov 29, 2007 12:18 AM, Johannes Schindelin
[off-list ref] wrote:
Hi,

On Thu, 29 Nov 2007, Nguyen Thai Ngoc Duy wrote:
quoted
On Nov 29, 2007 12:05 AM, Johannes Schindelin
[off-list ref] wrote:
quoted
On Wed, 28 Nov 2007, Nguyen Thai Ngoc Duy wrote:
quoted
@@ -246,8 +246,13 @@ 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 */
+                             check_repository_format();
+                             return retval;
+                     }
+                     check_repository_format();
Why not move this check before the if?  Other than that, ACK.
If so it would be called twice if work_tree_env is not set.
Well, I would have left the original

                        if (!work_tree_env)
                                return set_work_tree(gitdirenv);

alone...

If that is not possible, it might be good to add a comment as to why.
I did, and the tests failed. I also added a comment "config may
override worktree". set_work_tree() will reset git_work_tree_cfg but
the correct behaviour is config takes precedence (from comment of
set_work_tree). The comment is clearly not clear enough. Maybe this?

+                     if (!work_tree_env) {
+                             retval = set_work_tree(gitdirenv);
+                             /* config may override worktree (see
set_work_tree comment) */
+                             check_repository_format();
+                             return retval;
+                     }
Ciao,
Dscho


-- 
Duy

Re: [PATCH] Do check_repository_format() early

From: Johannes Schindelin <hidden>
Date: 2016-06-15 22:43:54

Hi,

On Thu, 29 Nov 2007, Nguyen Thai Ngoc Duy wrote:
The comment is clearly not clear enough. Maybe this?

+                     if (!work_tree_env) {
+                             retval = set_work_tree(gitdirenv);
+                             /* config may override worktree (see
set_work_tree comment) */
+                             check_repository_format();
+                             return retval;
+                     }
Perfect.  Please make it so, and add my ACK.

Thanks,
Dscho

Re: [PATCH] Do check_repository_format() early

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:43:55

Johannes Schindelin [off-list ref] writes:
On Thu, 29 Nov 2007, Nguyen Thai Ngoc Duy wrote:
quoted
The comment is clearly not clear enough. Maybe this?

+                     if (!work_tree_env) {
+                             retval = set_work_tree(gitdirenv);
+                             /* config may override worktree (see
set_work_tree comment) */
+                             check_repository_format();
+                             return retval;
+                     }
Perfect.  Please make it so, and add my ACK.
Looks sensible, but can this be accompanied with a trivial test to
demonstrate the existing breakage?

Re: [PATCH] Do check_repository_format() early

From: Nguyen Thai Ngoc Duy <hidden>
Date: 2016-06-15 22:43:55

On Dec 1, 2007 9:36 AM, Junio C Hamano [off-list ref] wrote:
Johannes Schindelin [off-list ref] writes:
quoted
On Thu, 29 Nov 2007, Nguyen Thai Ngoc Duy wrote:
quoted
The comment is clearly not clear enough. Maybe this?

+                     if (!work_tree_env) {
+                             retval = set_work_tree(gitdirenv);
+                             /* config may override worktree (see
set_work_tree comment) */
+                             check_repository_format();
+                             return retval;
+                     }
Perfect.  Please make it so, and add my ACK.
Looks sensible, but can this be accompanied with a trivial test to
demonstrate the existing breakage?
How can I reliably check setup_git_directory_gently()? I can pick one
command that uses setup_git_directory_gently(). But commands change.
Once they turn to setup_git_directory(), the test will no longer be
valid.

-- 
Duy

[PATCH] Do check_repository_format() early

From: Nguyễn Thái Ngọc Duy <hidden>
Date: 2016-06-15 22:43:56

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 <redacted>
---
 Another round. Test added. Behaviour changed to make it tolerate
 unsupported repos as much as possible.

 setup.c                 |   37 ++++++++++++++++++++++++++++++-------
 t/t1302-repo-version.sh |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 76 insertions(+), 7 deletions(-)
 create mode 100755 t/t1302-repo-version.sh
diff --git a/setup.c b/setup.c
index faf4137..434a7a6 100644
--- a/setup.c
+++ b/setup.c
@@ -222,6 +222,22 @@ void setup_work_tree(void)
 	initialized = 1;
 }
 
+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.
@@ -246,8 +262,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)
@@ -287,6 +310,8 @@ const char *setup_git_directory_gently(int *nongit_ok)
 			if (!work_tree_env)
 				inside_work_tree = 0;
 			setenv(GIT_DIR_ENVIRONMENT, ".", 1);
+			if (check_repository_format_gently(nongit_ok))
+				return NULL;
 			return NULL;
 		}
 		chdir("..");
@@ -307,6 +332,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;
 
@@ -357,11 +384,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
-- 
1.5.3.6.2040.gcdff-dirty

Re: [PATCH] Do check_repository_format() early

From: Nguyen Thai Ngoc Duy <hidden>
Date: 2016-06-15 22:43:56

On Dec 5, 2007 8:33 PM, Nguyen Thai Ngoc Duy [off-list ref] wrote:
quoted hunk
@@ -287,6 +310,8 @@ const char *setup_git_directory_gently(int *nongit_ok)
                        if (!work_tree_env)
                                inside_work_tree = 0;
                        setenv(GIT_DIR_ENVIRONMENT, ".", 1);
+                       if (check_repository_format_gently(nongit_ok))
+                               return NULL;
                        return NULL;
                }
                chdir("..");
This part better be as follow (patch may be damaged as I'm editing it in gmail)

 @@ -287,6 +310,8 @@ 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("..");
-- 
Duy

Re: [PATCH] Do check_repository_format() early

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:43:56

Thanks, this looks very sensible to me.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help