@@ -99,7 +99,7 @@ increase notwithstanding).
9999
100100use Carp qw( carp croak) ; # but croak is bad - throw instead
101101use Error qw( :try) ;
102- use Cwd qw( abs_path) ;
102+ use Cwd qw( abs_path cwd ) ;
103103use IPC::Open2 qw( open2) ;
104104use Fcntl qw( SEEK_SET SEEK_CUR) ;
105105}
@@ -396,7 +396,16 @@ See C<command_close_bidi_pipe()> for details.
396396
397397sub command_bidi_pipe {
398398 my ($pid , $in , $out );
399+ my ($self ) = _maybe_self(@_ );
400+ local %ENV = %ENV ;
401+ my $cwd_save = undef ;
402+ if ($self ) {
403+ shift ;
404+ $cwd_save = cwd();
405+ _setup_git_cmd_env($self );
406+ }
399407 $pid = open2($in , $out , ' git' , @_ );
408+ chdir ($cwd_save ) if $cwd_save ;
400409 return ($pid , $in , $out , join (' ' , @_ ));
401410}
402411
@@ -843,7 +852,7 @@ sub _open_hash_and_insert_object_if_needed {
843852
844853 ($self -> {hash_object_pid }, $self -> {hash_object_in },
845854 $self -> {hash_object_out }, $self -> {hash_object_ctx }) =
846- command_bidi_pipe(qw( hash-object -w --stdin-paths --no-filters) );
855+ $self -> command_bidi_pipe(qw( hash-object -w --stdin-paths --no-filters) );
847856}
848857
849858sub _close_hash_and_insert_object {
@@ -932,7 +941,7 @@ sub _open_cat_blob_if_needed {
932941
933942 ($self -> {cat_blob_pid }, $self -> {cat_blob_in },
934943 $self -> {cat_blob_out }, $self -> {cat_blob_ctx }) =
935- command_bidi_pipe(qw( cat-file --batch) );
944+ $self -> command_bidi_pipe(qw( cat-file --batch) );
936945}
937946
938947sub _close_cat_blob {
@@ -1279,15 +1288,21 @@ sub _command_common_pipe {
12791288# for the given repository and execute the git command.
12801289sub _cmd_exec {
12811290 my ($self , @args ) = @_ ;
1291+ _setup_git_cmd_env($self );
1292+ _execv_git_cmd(@args );
1293+ die qq[ exec "@args " failed: $! ] ;
1294+ }
1295+
1296+ # set up the appropriate state for git command
1297+ sub _setup_git_cmd_env {
1298+ my $self = shift ;
12821299 if ($self ) {
12831300 $self -> repo_path() and $ENV {' GIT_DIR' } = $self -> repo_path();
12841301 $self -> repo_path() and $self -> wc_path()
12851302 and $ENV {' GIT_WORK_TREE' } = $self -> wc_path();
12861303 $self -> wc_path() and chdir ($self -> wc_path());
12871304 $self -> wc_subdir() and chdir ($self -> wc_subdir());
12881305 }
1289- _execv_git_cmd(@args );
1290- die qq[ exec "@args " failed: $! ] ;
12911306}
12921307
12931308# Execute the given Git command ($_[0]) with arguments ($_[1..])
0 commit comments