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

[PATCH 3/7] Refactor git_set_argv0_path() to git_extract_argv0_path()

From
Steffen Prohaska <prohaska@zib.de>
Date
Sep 21, 2008, 16:24 UTC
Message-ID
<1222014278-11071-4-git-send-email-prohaska@zib.de>
In-Reply-To
<1222014278-11071-3-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 direname computation from other main() functions too.

[spr: split Steve's original commit and wrote new commit message. ]
Signed-off-by: Steve Haslam <shaslam@lastminute.com>
Signed-off-by: Steffen Prohaska <prohaska@zib.de>
---
 exec_cmd.c |   15 +++++++++++++--
 exec_cmd.h |    2 +-
 git.c      |   20 +++++---------------
 3 files changed, 19 insertions(+), 18 deletions(-)
diff --git a/exec_cmd.c b/exec_cmd.c
index 9fa89b8..46ebf7e 100644
--- a/exec_cmd.c
+++ b/exec_cmd.c
@@ -54,9 +54,20 @@ 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);
+
+	do
+		--slash;
+	while (slash >= argv0 && !is_dir_sep(*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 905acc2..b2b95e8 100644
--- a/git.c
+++ b/git.c
@@ -416,23 +416,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.
-	 */
-	do
-		--slash;
-	while (cmd <= slash && !is_dir_sep(*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.0.2.GIT
Previous: Steffen ProhaskaNext: Steffen Prohaska
Message 4 of 11 in “prefix discovery at runtime (on Windows)”
  1. 0/7 prefix discovery at runtime (on Windows)Steffen Prohaska, Sep 21, 2008
  2. 1/7 Windows: Add workaround for MSYS' path conversionSteffen Prohaska, Sep 21, 2008
  3. 2/7 system_path(): Add prefix computation at runtime if RUNTIME_PREFIX setSteffen Prohaska, Sep 21, 2008
  4. 3/7 Refactor git_set_argv0_path() to git_extract_argv0_path()Steffen Prohaska, Sep 21, 2008
  5. 4/7 Glean libexec path from argv[0] for git-upload-pack and git-receive-pack.Steffen Prohaska, Sep 21, 2008
  6. 5/7 Add calls to git_extract_argv0_path() in programs that call git_config_*Steffen Prohaska, Sep 21, 2008
  7. 6/7 Modify setup_path() to only add git_exec_path() to PATHSteffen Prohaska, Sep 21, 2008
  8. 7/7 Windows: Revert to default paths and convert them by RUNTIME_PREFIXSteffen Prohaska, Sep 21, 2008
  9. Johannes SixtSep 21, 2008
  10. Steffen ProhaskaSep 22, 2008
  11. Johannes SixtSep 21, 2008

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.