We need to detect "git apply" failures reliably when patches
fail. This is necessary for solving for blob
81c1164ae5 in
https://public-inbox.org/git/ when at least two messages can
solve for it (and one of them fails):
1. https://public-inbox.org/git/
b9fb52b8-8168-6bf0-9a72-
1e6c44a281a5@oracle.com/
2. https://public-inbox.org/git/
56664222-6c29-09dc-ef78-
7b380b113c4a@oracle.com/
- return unless $err;
- $self->{err} = $err;
- if ($env && !$env->{'qspawn.quiet'}) {
- log_err($env, join(' ', @{$self->{args}}) . ": $err");
+ if ($err) {
+ $self->{err} = $err;
+ if ($env && !$env->{'qspawn.quiet'}) {
+ log_err($env, join(' ', @{$self->{args}}) . ": $err");
+ }
+ }
+ if (my $fin_cb = delete $self->{fin_cb}) {
+ eval { $fin_cb->() }
-sub do_waitpid ($;$) {
- my ($self, $env) = @_;
+sub do_waitpid ($;$$) {
+ my ($self, $env, $fin_cb) = @_;
my $pid = $self->{pid};
$self->{env} = $env;
my $pid = $self->{pid};
$self->{env} = $env;
+ $self->{fin_cb} = $fin_cb;
# PublicInbox::DS may not be loaded
eval { PublicInbox::DS::dwaitpid($pid, \&waitpid_err, $self) };
# done if we're running in PublicInbox::DS::EventLoop
# PublicInbox::DS may not be loaded
eval { PublicInbox::DS::dwaitpid($pid, \&waitpid_err, $self) };
# done if we're running in PublicInbox::DS::EventLoop
-sub finish ($;$) {
- my ($self, $env) = @_;
+sub finish ($;$$) {
+ my ($self, $env, $fin_cb) = @_;
if (delete $self->{rpipe}) {
if (delete $self->{rpipe}) {
- do_waitpid($self, $env);
+ do_waitpid($self, $env, $fin_cb);
+ } elsif ($fin_cb) {
+ eval { $fin_cb->() };
my $end = sub {
my $err = $_[0]; # $!
log_err($env, "psgi_qx: $err") if defined($err);
my $end = sub {
my $err = $_[0]; # $!
log_err($env, "psgi_qx: $err") if defined($err);
- finish($self, $env);
- eval { $qx_cb->(\$scalar) };
- $qx = $scalar = undef;
+ finish($self, $env, sub { $qx_cb->(\$scalar) });
+ $qx = undef;
};
my $rpipe; # comes from popen_rd
my $async = $env->{'pi-httpd.async'};
};
my $rpipe; # comes from popen_rd
my $async = $env->{'pi-httpd.async'};