X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FSolverGit.pm;h=62b5a3439b2be772b004f13a5a8c2380a171f200;hb=a34e62ec1d84eafb67cc63532a383d15a18dcc4d;hp=83f7a4eefc6a5cc6f78d0cc9af48aaab9656694f;hpb=d11feea98718f2abb109af4216a36bdbd21b7191;p=public-inbox.git diff --git a/lib/PublicInbox/SolverGit.pm b/lib/PublicInbox/SolverGit.pm index 83f7a4ee..62b5a343 100644 --- a/lib/PublicInbox/SolverGit.pm +++ b/lib/PublicInbox/SolverGit.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2019-2020 all contributors +# Copyright (C) 2019-2021 all contributors # License: AGPL-3.0+ # "Solve" blobs which don't exist in git code repositories by @@ -111,8 +111,6 @@ sub extract_diff ($$) { my ($self, $want, $smsg) = @$arg; my ($part) = @$p; # ignore $depth and @idx; my $ct = $part->content_type || 'text/plain'; - my ($s, undef) = msg_part_text($part, $ct); - defined $s or return; my $post = $want->{oid_b}; my $pre = $want->{oid_a}; if (!defined($pre) || $pre !~ /\A[a-f0-9]+\z/) { @@ -122,11 +120,12 @@ sub extract_diff ($$) { # Email::MIME::Encodings forces QP to be CRLF upon decoding, # change it back to LF: my $cte = $part->header('Content-Transfer-Encoding') || ''; + my ($s, undef) = msg_part_text($part, $ct); + defined $s or return; + delete $part->{bdy}; if ($cte =~ /\bquoted-printable\b/i && $part->crlf eq "\n") { $s =~ s/\r\n/\n/sg; } - - $s =~ m!( # $1 start header lines we save for debugging: # everything before ^index is optional, but we don't @@ -169,6 +168,7 @@ sub extract_diff ($$) { # because git-apply(1) handles that case, too (?:^(?:[\@\+\x20\-\\][^\n]*|)$LF)+ )!smx or return; + undef $s; # free memory my $di = { hdr_lines => $1, @@ -216,7 +216,7 @@ sub filename_query ($) { sub find_smsgs ($$$) { my ($self, $ibx, $want) = @_; - my $srch = $ibx->search or return; + my $srch = $ibx->isrch or return; my $post = $want->{oid_b} or die 'BUG: no {oid_b}'; $post =~ /\A[a-f0-9]+\z/ or die "BUG: oid_b not hex: $post"; @@ -293,14 +293,21 @@ sub do_git_init ($) { mkdir("$git_dir/$_") or die "mkdir $_: $!"; } open my $fh, '>', "$git_dir/config" or die "open git/config: $!"; - print $fh <<'EOF' or die "print git/config $!"; + my $first = $self->{gits}->[0]; + my $fmt = $first->object_format; + my $v = defined($$fmt) ? 1 : 0; + print $fh <', "$git_dir/HEAD" or die "open git/HEAD: $!"; @@ -593,8 +600,7 @@ sub resolve_patch ($$) { if (my $msgs = $want->{try_smsgs}) { my $smsg = shift @$msgs; if ($self->{psgi_env}->{'pi-httpd.async'}) { - return git_async_cat($want->{cur_ibx}->git, - $smsg->{blob}, + return ibx_async_cat($want->{cur_ibx}, $smsg->{blob}, \&extract_diff_async, [$self, $want, $smsg]); } else { @@ -681,7 +687,7 @@ sub solve ($$$$$) { $self->{todo} = [ { %$hints, oid_b => $oid_want } ]; $self->{patches} = []; # [ $di, $di, ... ] $self->{found} = {}; # { abbr => [ ::Git, oid, type, size, $di ] } - $self->{tmp} = File::Temp->newdir("solver.$oid_want-XXXXXXXX", TMPDIR => 1); + $self->{tmp} = File::Temp->newdir("solver.$oid_want-XXXX", TMPDIR => 1); dbg($self, "solving $oid_want ..."); if (my $async = $env->{'pi-httpd.async'}) {