From: "Gustavo L. de M. Chaves" <gnust...@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 <gnust...@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

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to