git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 1/3] run_builtin(): save "-h" detection result for later use

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Oct 19, 2010, 13:35 UTC
Message-ID
<1287495320-27278-1-git-send-email-pclouds@gmail.com>
When run_builtin() sees "-h" as the first argument, it assumes:
 - this is the call for help usage
 - the real git command will only print help usage then exit

So it skips all setup in this case. Unfortunately, some commands do other things before calling parse_options(), which is often where the help usage is printed. Some of those things may try to access the repository, which has yet to be set up.

Make real commands aware of this fast path so that they can handle it properly (i.e., print help usage then exit immediately) if they need to do more initialization than git_config().

git_config() is a bit of a special case: it is perfectly legitimate to
use it without access to a valid repository. In the future, we should
make git_config() aware of the repository search status so that it can
skip reading $GIT_DIR/config if no repository is found.
---
 cache.h |    1 +
 git.c   |    8 ++++----
 2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/cache.h b/cache.h
index 33decd9..43763c1 100644
--- a/cache.h
+++ b/cache.h
@@ -1117,6 +1117,7 @@ const char *split_cmdline_strerror(int cmdline_errno);
 /* git.c */
 struct startup_info {
 	int have_repository;
+	int help; /* print help and exit, except git_config(), repo must not be touched */
 };
 extern struct startup_info *startup_info;
 
diff --git a/git.c b/git.c
index 50a1401..5962cdd 100644
--- a/git.c
+++ b/git.c
@@ -246,13 +246,13 @@ struct cmd_struct {
 
 static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
 {
-	int status, help;
+	int status;
 	struct stat st;
 	const char *prefix;
 
 	prefix = NULL;
-	help = argc == 2 && !strcmp(argv[1], "-h");
-	if (!help) {
+	startup_info->help = argc == 2 && !strcmp(argv[1], "-h");
+	if (!startup_info->help) {
 		if (p->option & RUN_SETUP)
 			prefix = setup_git_directory();
 		if (p->option & RUN_SETUP_GENTLY) {
@@ -267,7 +267,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
 	}
 	commit_pager_choice();
 
-	if (!help && p->option & NEED_WORK_TREE)
+	if (!startup_info->help && p->option & NEED_WORK_TREE)
 		setup_work_tree();
 
 	trace_argv_printf(argv, "trace: built-in: git");
-- 
1.7.0.2.445.gcbdb3
Next: Nguyễn Thái Ngọc Duy
Message 1 of 12 in “run_builtin(): save "-h" detection result for later use”
  1. 1/3 run_builtin(): save "-h" detection result for later useNguyễn Thái Ngọc Duy, Oct 19, 2010
  2. 2/3 builtins: utilize startup_info->help where possibleNguyễn Thái Ngọc Duy, Oct 19, 2010
  3. Jonathan NiederOct 19, 2010
  4. Jonathan NiederOct 19, 2010
  5. Junio C HamanoOct 19, 2010
  6. Nguyen Thai Ngoc DuyOct 20, 2010
  7. Jonathan NiederOct 20, 2010
  8. 3/3 builtins: check for startup_info->help, print and exit earlyNguyễn Thái Ngọc Duy, Oct 19, 2010
  9. Junio C HamanoOct 19, 2010
  10. Nguyen Thai Ngoc DuyOct 20, 2010
  11. Jonathan NiederOct 19, 2010
  12. Jonathan NiederOct 19, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.