- my %escapes = (
- '^' => sub { '^' },
- 'n' => sub { $self->name },
- 'g' => sub { _abs2rel($self->repo, $conf->root) },
- 'G' => sub { $self->repo },
- 'w' => sub { _abs2rel($self->work, $conf->root) },
- 'W' => sub { $self->work },
- 'b' => sub { _abs2rel($self->bare ? $self->repo : $self->work . '.git', $conf->root) },
- 'B' => sub { $self->bare ? $self->repo : $self->work . '.git' },
- 'R' => sub { $conf->root },
- );
- s/\^([\^ngGwWbBR])/$escapes{$1}->()/eg for @args;
+ s/@($e)/$escapes{$1}->($self, $conf)/eg for @args;
+ }
+ unshift @args, $conf->git;
+ $conf->info('Executing "', join(' ', @args), '" into ', $self->work, "\n");
+ {
+ 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 { $args[0] } @args;
+ }
+ if ($? == -1) {
+ $conf->crit("Failed to execute git: $!\n");
+ return;
+ }
+ my $ret;
+ $ret = WEXITSTATUS($?) if WIFEXITED($?);
+ my $sig;
+ if (WIFSIGNALED($?)) {
+ $sig = WTERMSIG($?);
+ $conf->warn("git died with signal $sig\n");
+ if ($sig == SIGINT || $sig == SIGQUIT) {
+ $conf->err("Aborting\n");
+ exit $sig;
+ }
+ } elsif ($ret) {
+ $conf->info("git returned $ret\n");