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

[PATCH 2/7] perl/Git.pm: set up command environment on Windows

From
Gustavo L. de M. Chaves <gnustavo@cpan.org>
Date
Jan 30, 2013, 17:22 UTC
Message-ID
<1359566583-19654-3-git-send-email-gnustavo@cpan.org>
In-Reply-To
<1359566583-19654-1-git-send-email-gnustavo@cpan.org>
From: "Gustavo L. de M. Chaves" <gnustavo@cpan.org>

Routine _cmd_exec invokes _setup_git_cmd_env inside the child process before invoking an external git command to set up the environment variables GIT_DIR and GIT_WORK_TREE and, also, to chdir to the repository. But _cmd_exec is only used on Unix. On Windows, it's not used and the main code path is in _command_common_pipe, which didn't prepare the environment like _cmd_exec.

Without this environment preparation some git commands, such as "git clone", don't work.

We can't use _setup_git_cmd_env in this case because we don't use a forking open like _cmd_exec does and don't get a chance to make such preparations on the child process.

So, the preparation is done on _command_common_pipe by setting up localized environment variables and by chdir temporarily just before invoking the external command.

Signed-off-by: Gustavo L. de M. Chaves <gnustavo@cpan.org>
---
 perl/Git.pm | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
diff --git a/perl/Git.pm b/perl/Git.pm
index 658b602..e14b41a 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -1302,6 +1302,19 @@ sub _command_common_pipe {
 		#	warn 'ignoring STDERR option - running w/ ActiveState';
 		$direction eq '-|' or
 			die 'input pipe for ActiveState not implemented';
+
+		# Set up repo environment
+		local $ENV{GIT_DIR}       = $self->repo_path() if defined $self && $self->repo_path();
+		local $ENV{GIT_WORK_TREE} = $self->wc_path()   if defined $self && $self->repo_path() && $self->wc_path();
+
+		my $cwd = cwd;
+
+		if (defined $self) {
+			chdir $self->repo_path() if $self->repo_path();
+			chdir $self->wc_path()	 if $self->wc_path();
+			chdir $self->wc_subdir() if $self->wc_subdir();
+		}
+
 		# the strange construction with *ACPIPE is just to
 		# explain the tie below that we want to bind to
 		# a handle class, not scalar. It is not known if
@@ -1310,6 +1323,7 @@ sub _command_common_pipe {
 		tie (*ACPIPE, 'Git::activestate_pipe', $cmd, @args);
 		$fh = *ACPIPE;
 
+		chdir $cwd;
 	} else {
 		my $pid = open($fh, $direction);
 		if (not defined $pid) {
-- 
1.7.12.464.g83379df.dirty
Previous: Gustavo L. de M. ChavesNext: Gustavo L. de M. Chaves
Message 3 of 9 in “perl/Git.pm: a bunch of fixes for Windows”
  1. 0/7 perl/Git.pm: a bunch of fixes for WindowsGustavo L. de M. Chaves, Jan 30, 2013
  2. 1/7 perl/Git.pm: test portably if a path is absoluteGustavo L. de M. Chaves, Jan 30, 2013
  3. 2/7 perl/Git.pm: set up command environment on WindowsGustavo L. de M. Chaves, Jan 30, 2013
  4. 3/7 perl/Git.pm: fix _cmd_close on WindowsGustavo L. de M. Chaves, Jan 30, 2013
  5. 4/7 perl/Git.pm: escape external command's arguments on WindowsGustavo L. de M. Chaves, Jan 30, 2013
  6. 5/7 perl/Git.pm: simplify Git::activestate_pipeGustavo L. de M. Chaves, Jan 30, 2013
  7. 6/7 perl/Git.pm: make command pipe work in slurp-mode on WindowsGustavo L. de M. Chaves, Jan 30, 2013
  8. 7/7 perl/Git.pm: rename 'ActiveState' to 'Windows'Gustavo L. de M. Chaves, Jan 30, 2013
  9. Junio C HamanoFeb 25, 2013

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.