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

[Fundamental problem with relative system paths] [PATCH 2/2] run-command (Windows): Run dashless "git <cmd>"

From
Steffen Prohaska <prohaska@zib.de>
Date
Jul 28, 2008, 05:50 UTC
Message-ID
<1217224228-31303-2-git-send-email-prohaska@zib.de>
In-Reply-To
<1217224228-31303-1-git-send-email-prohaska@zib.de>

This might solve a fundamental problem we have with the computation of system directories based on relative paths in combination with the new gitexecpath 'libexec/git-core'. The problem is that the program 'git' is hardlinked to directories with different depth. It is either used as 'bin/git' (1 directory) or as 'libexec/git-core/git-*' (2 directories). Thus, using the same relative path in system_path() yields different results when starting from the two locations. I recognized the problem because /etc/gitconfig is no longer be read.

The patch below might fix the problem by always calling 'bin/git' for builtin commands. The computation in system_path() would always start from 'bin' and thus yields predictable results. I am not sure however if it fully solves the problem because other code paths might run the dashed forms directly.

I think the only way to verify correctness would be to stop installing the dashed forms for builtins. If they were not installed they could not be called. The only entry point for all builtins would be 'bin/git'. I don't think we want to stop installing the dashed forms right away.

So what shall we do?
	Steffen

-- 8< -- We prefer running the dashless form, so we should use it in MinGW's start_command(), too.

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
---
 run-command.c |   11 ++++-------
 1 files changed, 4 insertions(+), 7 deletions(-)
diff --git a/run-command.c b/run-command.c
index 6e29fdf..a3b28a6 100644
--- a/run-command.c
+++ b/run-command.c
@@ -119,9 +119,8 @@ int start_command(struct child_process *cmd)
 	}
 #else
 	int s0 = -1, s1 = -1, s2 = -1;	/* backups of stdin, stdout, stderr */
-	const char *sargv0 = cmd->argv[0];
+	const char **sargv = cmd->argv;
 	char **env = environ;
-	struct strbuf git_cmd;
 
 	if (cmd->no_stdin) {
 		s0 = dup(0);
@@ -165,9 +164,7 @@ int start_command(struct child_process *cmd)
 	}
 
 	if (cmd->git_cmd) {
-		strbuf_init(&git_cmd, 0);
-		strbuf_addf(&git_cmd, "git-%s", cmd->argv[0]);
-		cmd->argv[0] = git_cmd.buf;
+		cmd->argv = prepare_git_cmd(cmd->argv);
 	}
 
 	cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, env);
@@ -175,9 +172,9 @@ int start_command(struct child_process *cmd)
 	if (cmd->env)
 		free_environ(env);
 	if (cmd->git_cmd)
-		strbuf_release(&git_cmd);
+		free(cmd->argv);
 
-	cmd->argv[0] = sargv0;
+	cmd->argv = sargv;
 	if (s0 >= 0)
 		dup2(s0, 0), close(s0);
 	if (s1 >= 0)
-- 
1.6.0.rc0.79.gb0320
Previous: Steffen ProhaskaNext: Junio C Hamano
Message 2 of 11 in “Refactor, adding prepare_git_cmd(const char **argv)”
  1. 1/2 Refactor, adding prepare_git_cmd(const char **argv)Steffen Prohaska, Jul 28, 2008
  2. [Fundamental problem with relative system paths] [PATCH 2/2] run-command (Windows): Run dashless "git <cmd>"Steffen Prohaska, Jul 28, 2008
  3. Junio C HamanoJul 28, 2008
  4. Junio C HamanoJul 28, 2008
  5. Johannes SchindelinJul 28, 2008
  6. Johannes SixtJul 28, 2008
  7. Steffen ProhaskaJul 29, 2008
  8. 2/2 run-command (Windows): Run dashless "git <cmd>" (solves part of problem with system_path)Steffen Prohaska, Jul 29, 2008
  9. [FOR DEBUGGING] Stop installing BUILT_INSSteffen Prohaska, Jul 29, 2008
  10. Junio C HamanoJul 29, 2008
  11. Johannes SixtJul 29, 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.