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

[PATCH 2/6] Refactor git_set_argv0_path() to git_extract_argv0_path()

From
Steffen Prohaska <prohaska@zib.de>
Date
Jan 10, 2009, 13:50 UTC
Message-ID
<1231595452-27698-2-git-send-email-prohaska@zib.de>
In-Reply-To
<1231595452-27698-1-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 669b82e..576c9ae 100644
--- a/exec_cmd.c
+++ b/exec_cmd.c
@@ -63,9 +63,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.85.g32c5d
Previous: Steffen ProhaskaNext: Steffen Prohaska
Message 2 of 16 in “Move computation of absolute paths from Makefile to runtime and compute prefix on the fly if RUNTIME_PREFIX set”
  1. 1/6 Move computation of absolute paths from Makefile to runtime and compute prefix on the fly if RUNTIME_PREFIX setSteffen Prohaska, Jan 10, 2009
  2. 2/6 Refactor git_set_argv0_path() to git_extract_argv0_path()Steffen Prohaska, Jan 10, 2009
  3. 3/6 Glean libexec path from argv[0] for git-upload-pack and git-receive-pack.Steffen Prohaska, Jan 10, 2009
  4. 4/6 Add calls to git_extract_argv0_path() in programs that call git_config_*Steffen Prohaska, Jan 10, 2009
  5. 5/6 Modify setup_path() to only add git_exec_path() to PATHSteffen Prohaska, Jan 10, 2009
  6. 6/6 Windows: Revert to default paths and convert them by RUNTIME_PREFIXSteffen Prohaska, Jan 10, 2009
  7. Johannes SchindelinJan 10, 2009
  8. Steffen ProhaskaJan 10, 2009
  9. Steffen ProhaskaJan 10, 2009
  10. Junio C HamanoJan 10, 2009
  11. Steffen ProhaskaJan 11, 2009
  12. Junio C HamanoJan 11, 2009
  13. Steffen ProhaskaJan 11, 2009
  14. Johannes SixtJan 13, 2009
  15. Johannes SixtJan 13, 2009
  16. Johannes SixtJan 13, 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.