- my $cmd = [ qw(git apply --cached --ignore-whitespace
- --whitespace=warn --verbose) ];
- my $rdr = { 0 => fileno($tmp), 2 => 1 };
- my $qsp = PublicInbox::Qspawn->new($cmd, $self->{git_env}, $rdr);
+ my @cmd = (qw(git -C), $dn, qw(apply --cached --ignore-whitespace
+ --unidiff-zero --whitespace=warn --verbose));
+ my $len = length(join(' ', @cmd));
+ my $total = $self->{tot};
+ my $di; # keep track of the last one for "git ls-files"
+ my $prv_oid_b;
+
+ do {
+ my $i = ++$self->{nr};
+ $di = shift @$patches;
+ dbg($self, "\napplying [$i/$total] " . di_url($self, $di) .
+ "\n" . join('', @{$di->{hdr_lines}}));
+ my $path = $di->{n};
+ $len += length($path) + 1;
+ push @cmd, $path;
+ $prv_oid_b = $di->{oid_b};
+ } while (@$patches && $len < $ARG_SIZE_MAX &&
+ !oids_same_ish($patches->[0]->{oid_b}, $prv_oid_b));
+
+ my $rdr = { 2 => 1 };
+ my $qsp = PublicInbox::Qspawn->new(\@cmd, $self->{git_env}, $rdr);