X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FApp%2FRgit%2FRepository.pm;h=ec96328a57882cc5e8f076b2b4ee2444141df69e;hb=313864be3ae1c0d2120b434ff18150c53f8b352e;hp=82c9f5607e79af6bed3a25da58ae043f5fc3f33c;hpb=67e585ffae69ce0c350a920658738d7864b1d54a;p=perl%2Fmodules%2Frgit.git diff --git a/lib/App/Rgit/Repository.pm b/lib/App/Rgit/Repository.pm index 82c9f56..ec96328 100644 --- a/lib/App/Rgit/Repository.pm +++ b/lib/App/Rgit/Repository.pm @@ -5,6 +5,7 @@ use warnings; use Cwd qw/cwd abs_path/; use File::Spec::Functions qw/catdir splitdir abs2rel file_name_is_absolute/; +use POSIX qw/WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG SIGINT SIGQUIT/; use Object::Tiny qw/fake repo bare name work/; @@ -44,7 +45,7 @@ sub new { $dir = cwd unless defined $dir; my ($repo, $bare, $name, $work); if ($args{fake}) { - $work = $dir; + $repo = $work = $dir; } else { my @tries = ($dir); my @chunks = splitdir $dir; @@ -128,7 +129,29 @@ sub run { ); s/\^([\^ngGwWbBR])/$escapes{$1}->()/eg for @args; } - system { $conf->git } $conf->git, @args; + { + local $ENV{GIT_DIR} = $self->repo if exists $ENV{GIT_DIR}; + local $ENV{GIT_EXEC_PATH} = $conf->git if exists $ENV{GIT_EXEC_PATH}; + system { $conf->git } $conf->git, @args; + } + if ($? == -1) { + warn "Failed to execute git: $!\n"; + return; + } + my $ret; + $ret = WEXITSTATUS($?) if WIFEXITED($?); + my $sig; + if (WIFSIGNALED($?)) { + $sig = WTERMSIG($?); + warn "git died with signal $sig\n"; + if ($sig == SIGINT || $sig == SIGQUIT) { + warn "Aborting.\n"; + exit $sig; + } + } elsif ($ret) { + warn "git returned $ret\n"; + } + return wantarray ? ($ret, $sig) : $ret; } =head2 C