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

[PATCH jl/maint-submodule-gitfile-awareness] Windows: start_command: Support non-NULL dir in struct child_process

From
Johannes Sixt <j6t@kdbg.org>
Date
Apr 11, 2010, 20:40 UTC
Message-ID
<4BC233AC.3090603@kdbg.org>
In-Reply-To
<loom.20100411T174751-103@post.gmane.org>

A caller of start_command can set the member 'dir' to a directory to request that the child process starts with that directory as CWD. The first user of this feature was added recently in eee49b6 (Teach diff --submodule and status to handle .git files in submodules).

On Windows, we have been lazy and had not implemented support for this feature, yet. This fixes the shortcoming.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
Am 11.04.2010 17:57, schrieb ZoltánFüzesi:
Show 7 quoted lines
> Junio C Hamano<gitster<at>  pobox.com>  writes:
>> Jens Lehmann (2):
>>        Let check_preimage() use memset() to initialize "struct checkout"
>>        Teach diff --submodule and status to handle .git files in submodules
> 
> This breaks git-status on Windows, if repository has submodule(s).
> "fatal: chdir in start_command() not implemented"
This fixes it. Hope this gets through without whitespace damage.
-- Hannes
 compat/mingw.c |   10 ++++++----
 compat/mingw.h |    1 +
 run-command.c  |    4 +---
 3 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/compat/mingw.c b/compat/mingw.c
index ab65f77..754b534 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -618,6 +618,7 @@ static int env_compare(const void *a, const void *b)
 }
 
 static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
+			      const char *dir,
 			      int prepend_cmd, int fhin, int fhout, int fherr)
 {
 	STARTUPINFO si;
@@ -697,7 +698,7 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
 
 	memset(&pi, 0, sizeof(pi));
 	ret = CreateProcess(cmd, args.buf, NULL, NULL, TRUE, flags,
-		env ? envblk.buf : NULL, NULL, &si, &pi);
+		env ? envblk.buf : NULL, dir, &si, &pi);
 
 	if (env)
 		strbuf_release(&envblk);
@@ -714,10 +715,11 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
 static pid_t mingw_spawnve(const char *cmd, const char **argv, char **env,
 			   int prepend_cmd)
 {
-	return mingw_spawnve_fd(cmd, argv, env, prepend_cmd, 0, 1, 2);
+	return mingw_spawnve_fd(cmd, argv, env, NULL, prepend_cmd, 0, 1, 2);
 }
 
 pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env,
+		     const char *dir,
 		     int fhin, int fhout, int fherr)
 {
 	pid_t pid;
@@ -740,14 +742,14 @@ pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env,
 				pid = -1;
 			}
 			else {
-				pid = mingw_spawnve_fd(iprog, argv, env, 1,
+				pid = mingw_spawnve_fd(iprog, argv, env, dir, 1,
 						       fhin, fhout, fherr);
 				free(iprog);
 			}
 			argv[0] = argv0;
 		}
 		else
-			pid = mingw_spawnve_fd(prog, argv, env, 0,
+			pid = mingw_spawnve_fd(prog, argv, env, dir, 0,
 					       fhin, fhout, fherr);
 		free(prog);
 	}
diff --git a/compat/mingw.h b/compat/mingw.h
index e254fb4..e0a6aba 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -223,6 +223,7 @@ int mingw_utime(const char *file_name, const struct utimbuf *times);
 #define utime mingw_utime
 
 pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env,
+		     const char *dir,
 		     int fhin, int fhout, int fherr);
 void mingw_execvp(const char *cmd, char *const *argv);
 #define execvp mingw_execvp
diff --git a/run-command.c b/run-command.c
index 2feb493..db30cd5 100644
--- a/run-command.c
+++ b/run-command.c
@@ -335,8 +335,6 @@ fail_pipe:
 	else if (cmd->out > 1)
 		fhout = dup(cmd->out);
 
-	if (cmd->dir)
-		die("chdir in start_command() not implemented");
 	if (cmd->env)
 		env = make_augmented_environ(cmd->env);
 
@@ -346,7 +344,7 @@ fail_pipe:
 		cmd->argv = prepare_shell_cmd(cmd->argv);
 	}
 
-	cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, env,
+	cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, env, cmd->dir,
 				  fhin, fhout, fherr);
 	failed_errno = errno;
 	if (cmd->pid < 0 && (!cmd->silent_exec_failure || errno != ENOENT))
-- 
1.7.0.12.ga3b9
Previous: ZoltánFüzesiNext: Jens Lehmann
Message 3 of 8 in “[ANNOUNCE] Git 1.7.1.rc1”
  1. Junio C HamanoApr 11, 2010
  2. ZoltánFüzesiApr 11, 2010
  3. Windows: start_command: Support non-NULL dir in struct child_processJohannes Sixt, Apr 11, 2010
  4. Jens LehmannApr 11, 2010
  5. Ævar Arnfjörð BjarmasonApr 11, 2010
  6. Andreas SchwabApr 11, 2010
  7. Ævar Arnfjörð BjarmasonApr 11, 2010
  8. Andreas SchwabApr 11, 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.