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

[PATCH 2/7 v2] Refactor git_set_argv0_path() to git_extract_argv0_path()

From
Steffen Prohaska <prohaska@zib.de>
Date
Jan 18, 2009, 12:00 UTC
Message-ID
<1232280015-8144-3-git-send-email-prohaska@zib.de>
In-Reply-To
<1232280015-8144-2-git-send-email-prohaska@zib.de>
From: Steve Haslam <shaslam@lastminute.com>

This commit moves the code that computes the dirname of argv[0] from git.c's main() to git_set_argv0_path() and renames the function to git_extract_argv0_path(). This makes the code in git.c's main less cluttered, and we can use the dirname computation from other main() functions too.

[ spr:
 - split Steve's original commit and wrote new commit message.
 - Integrated Johannes Schindelin's
   cca1704897e7fdb182f68d4c48a437c5d7bc5203 while rebasing onto master.
]
Signed-off-by: Steve Haslam <shaslam@lastminute.com>
Signed-off-by: Steffen Prohaska <prohaska@zib.de>
---
 exec_cmd.c |   14 ++++++++++++--
 exec_cmd.h |    2 +-
 git.c      |   19 +++++--------------
 3 files changed, 18 insertions(+), 17 deletions(-)
diff --git a/exec_cmd.c b/exec_cmd.c
index b7e7b60..23a52cf 100644
--- a/exec_cmd.c
+++ b/exec_cmd.c
@@ -21,9 +21,19 @@ const char *system_path(const char *path)
 	return path;
 }
 
-void git_set_argv0_path(const char *path)
+const char *git_extract_argv0_path(const char *argv0)
 {
-	argv0_path = path;
+	const char *slash = argv0 + strlen(argv0);
+
+	while (argv0 <= slash && !is_dir_sep(*slash))
+		slash--;
+
+	if (slash >= argv0) {
+		argv0_path = xstrndup(argv0, slash - argv0);
+		return slash + 1;
+	}
+
+	return argv0;
 }
 
 void git_set_argv_exec_path(const char *exec_path)
diff --git a/exec_cmd.h b/exec_cmd.h
index 594f961..392e903 100644
--- a/exec_cmd.h
+++ b/exec_cmd.h
@@ -2,7 +2,7 @@
 #define GIT_EXEC_CMD_H
 
 extern void git_set_argv_exec_path(const char *exec_path);
-extern void git_set_argv0_path(const char *path);
+extern const char* git_extract_argv0_path(const char *path);
 extern const char* git_exec_path(void);
 extern void setup_path(void);
 extern const char **prepare_git_cmd(const char **argv);
diff --git a/git.c b/git.c
index a53e24f..b99b1b2 100644
--- a/git.c
+++ b/git.c
@@ -419,22 +419,13 @@ static void execv_dashed_external(const char **argv)
 
 int main(int argc, const char **argv)
 {
-	const char *cmd = argv[0] && *argv[0] ? argv[0] : "git-help";
-	char *slash = (char *)cmd + strlen(cmd);
+	const char *cmd;
 	int done_alias = 0;
 
-	/*
-	 * Take the basename of argv[0] as the command
-	 * name, and the dirname as the default exec_path
-	 * if we don't have anything better.
-	 */
-	while (cmd <= slash && !is_dir_sep(*slash))
-		slash--;
-	if (cmd <= slash) {
-		*slash++ = 0;
-		git_set_argv0_path(cmd);
-		cmd = slash;
-	}
+	if (argv[0] && *argv[0])
+		cmd = git_extract_argv0_path(argv[0]);
+	else
+		cmd = "git-help";
 
 	/*
 	 * "git-xxxx" is the same as "git xxxx", but we obviously:
-- 
1.6.1.87.g15624
Previous: Steffen ProhaskaNext: Steffen Prohaska
Message 3 of 12 in “RUNTIME_PREFIX”
  1. 0/7 RUNTIME_PREFIXSteffen Prohaska, Jan 18, 2009
  2. 1/7 Move computation of absolute paths from Makefile to runtime (in preparation for RUNTIME_PREFIX)Steffen Prohaska, Jan 18, 2009
  3. 2/7 Refactor git_set_argv0_path() to git_extract_argv0_path()Steffen Prohaska, Jan 18, 2009
  4. 3/7 git_extract_argv0_path(): Move check for valid argv0 from caller to calleeSteffen Prohaska, Jan 18, 2009
  5. 4/7 Add calls to git_extract_argv0_path() in programs that call git_config_*Steffen Prohaska, Jan 18, 2009
  6. 5/7 Modify setup_path() to only add git_exec_path() to PATHSteffen Prohaska, Jan 18, 2009
  7. 6/7 Compute prefix at runtime if RUNTIME_PREFIX is setSteffen Prohaska, Jan 18, 2009
  8. 7/7 Windows: Revert to default paths and convert them by RUNTIME_PREFIXSteffen Prohaska, Jan 18, 2009
  9. Johannes SchindelinJan 19, 2009
  10. Johannes SixtJan 18, 2009
  11. Johannes SixtJan 18, 2009
  12. Junio C HamanoJan 18, 2009

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.