lib/PublicInbox/Import.pm | 37 ++++++++++++++++++------------------- diff --git a/lib/PublicInbox/Import.pm b/lib/PublicInbox/Import.pm index c2beb19c42e8fcfec42283df04f0d02ddbdef44c..09dd38d02d3f9f9c31e937fc7c0893773edb6719 100644 --- a/lib/PublicInbox/Import.pm +++ b/lib/PublicInbox/Import.pm @@ -75,6 +75,15 @@ $b =~ s/(\r?\n)+\z//s; $b } +sub _check_path ($$$$) { + my ($r, $w, $tip, $path) = @_; + return if $tip eq ''; + print $w "ls $tip $path\n" or wfail; + local $/ = "\n"; + defined(my $info = <$r>) or die "EOF from fast-import: $!"; + $info =~ /\Amissing / ? undef : $info; +} + # returns undef on non-existent # ('MISMATCH', msg) on mismatch # (:MARK, msg) on success @@ -86,20 +95,16 @@ my $path = mid2path($mid); my ($r, $w) = $self->gfi_start; my $tip = $self->{tip}; - return ('MISSING', undef) if $tip eq ''; + my $info = _check_path($r, $w, $tip, $path) or return ('MISSING',undef); + $info =~ m!\A100644 blob ([a-f0-9]{40})\t!s or die "not blob: $info"; + my $blob = $1; - print $w "ls $tip $path\n" or wfail; + print $w "cat-blob $blob\n" or wfail; local $/ = "\n"; - my $check = <$r>; - defined $check or die "EOF from fast-import / ls: $!"; - return ('MISSING', undef) if $check =~ /\Amissing /; - $check =~ m!\A100644 blob ([a-f0-9]{40})\t!s or die "not blob: $check"; - my $blob = $1; - print $w "cat-blob $blob\n" or wfail; - $check = <$r>; - defined $check or die "EOF from fast-import / cat-blob: $!"; - $check =~ /\A[a-f0-9]{40} blob (\d+)\n\z/ or - die "unexpected cat-blob response: $check"; + $info = <$r>; + defined $info or die "EOF from fast-import / cat-blob: $!"; + $info =~ /\A[a-f0-9]{40} blob (\d+)\n\z/ or + die "unexpected cat-blob response: $info"; my $left = $1; my $offset = 0; my $buf = ''; @@ -162,13 +167,7 @@ my $path = mid2path($mid); my ($r, $w) = $self->gfi_start; my $tip = $self->{tip}; - if ($tip ne '') { - print $w "ls $tip $path\n" or wfail; - local $/ = "\n"; - my $check = <$r>; - defined $check or die "EOF from fast-import: $!"; - return unless $check =~ /\Amissing /; - } + _check_path($r, $w, $tip, $path) and return; # kill potentially confusing/misleading headers $mime->header_set($_) for qw(bytes lines content-length status);