Subject: [PATCH 02/18] builtin: Support RUN_SETUP_GENTLY to set up repository early if found

From: Nguyễn Thái Ngọc Duy <[email-masked]>
Date: Sun, 7 Mar 2010 11:55:51 +0700

Attempts to access gitdir are everywhere, even before cmd_*() is
called. Because repository has not been found, repository-specific
information (i.e. $GIT_DIR/config) may not be read. This leads to
obscure bugs.

So the sooner we setup gitdir, the less trouble we may have to deal with.

Signed-off-by: Nguyễn Thái Ngọc Duy <[email-masked]>
---
 cache.h |    1 +
 git.c   |   11 ++++++++---
 setup.c |    4 +++-
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/cache.h b/cache.h
index 30fddf1..68412c0 100644
--- a/cache.h
+++ b/cache.h
@@ -1057,6 +1057,7 @@ int split_cmdline(char *cmdline, const char ***argv);
 /* git.c */
 struct startup_info {
 	const char *prefix;
+	int have_repository;
 };
 extern struct startup_info *startup_info;
 
diff --git a/git.c b/git.c
index 4be34e4..9e0e2d0 100644
--- a/git.c
+++ b/git.c
@@ -220,13 +220,14 @@ static int handle_alias(int *argcp, const char ***argv)
 
 const char git_version_string[] = GIT_VERSION;
 
-#define RUN_SETUP	(1<<0)
-#define USE_PAGER	(1<<1)
+#define RUN_SETUP		(1<<0)
+#define USE_PAGER		(1<<1)
 /*
  * require working tree to be present -- anything uses this needs
  * RUN_SETUP for reading from the configuration file.
  */
-#define NEED_WORK_TREE	(1<<2)
+#define NEED_WORK_TREE		(1<<2)
+#define RUN_SETUP_GENTLY	(1<<3)
 
 struct cmd_struct {
 	const char *cmd;
@@ -245,6 +246,10 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
 	if (!help) {
 		if (p->option & RUN_SETUP)
 			setup_git_directory();
+		if (p->option & RUN_SETUP_GENTLY) {
+			int nongit_ok;
+			setup_git_directory_gently(&nongit_ok);
+		}
 
 		if (use_pager == -1 && p->option & RUN_SETUP)
 			use_pager = check_pager_config(p->cmd);
diff --git a/setup.c b/setup.c
index cf1b37d..bb3648c 100644
--- a/setup.c
+++ b/setup.c
@@ -448,8 +448,10 @@ const char *setup_git_directory_gently(int *nongit_ok)
 	const char *prefix;
 
 	prefix = setup_git_directory_gently_1(nongit_ok);
-	if (startup_info)
+	if (startup_info) {
 		startup_info->prefix = prefix;
+		startup_info->have_repository = !nongit_ok || !*nongit_ok;
+	}
 	return prefix;
 }
 
-- 
1.7.0.195.g637a2