X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FImport.pm;h=c7a96e1eabcc1214e6cdc61572ba6ed70db64750;hb=69329215485cf2ab9d8cd1fa7faf65d8ec42dc0b;hp=73290eed5a04d37a8328eb39bd217cf2258fd6a7;hpb=b4d127cb83230fe5cee0dcecb573107ad96a7c4c;p=public-inbox.git diff --git a/lib/PublicInbox/Import.pm b/lib/PublicInbox/Import.pm index 73290eed..c7a96e1e 100644 --- a/lib/PublicInbox/Import.pm +++ b/lib/PublicInbox/Import.pm @@ -14,6 +14,7 @@ use PublicInbox::Address; use PublicInbox::MsgTime qw(msg_timestamp msg_datestamp); use PublicInbox::ContentId qw(content_digest); use PublicInbox::MDA; +use POSIX qw(strftime); sub new { my ($class, $git, $name, $email, $ibx) = @_; @@ -95,19 +96,13 @@ sub _check_path ($$$$) { $info =~ /\Amissing / ? undef : $info; } -sub check_remove_v1 { - my ($r, $w, $tip, $path, $mime) = @_; - - 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 "cat-blob $blob\n" or wfail; +sub _cat_blob ($$$) { + my ($r, $w, $oid) = @_; + print $w "cat-blob $oid\n" or wfail; local $/ = "\n"; - $info = <$r>; + my $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"; + $info =~ /\A[a-f0-9]{40} blob (\d+)\n\z/ or return; my $left = $1; my $offset = 0; my $buf = ''; @@ -122,7 +117,23 @@ sub check_remove_v1 { $n = read($r, my $lf, 1); defined($n) or die "read final byte of cat-blob failed: $!"; die "bad read on final byte: <$lf>" if $lf ne "\n"; - my $cur = PublicInbox::MIME->new(\$buf); + \$buf; +} + +sub cat_blob { + my ($self, $oid) = @_; + my ($r, $w) = $self->gfi_start; + _cat_blob($r, $w, $oid); +} + +sub check_remove_v1 { + my ($r, $w, $tip, $path, $mime) = @_; + + 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 $oid = $1; + my $msg = _cat_blob($r, $w, $oid) or die "BUG: cat-blob $1 failed"; + my $cur = PublicInbox::MIME->new($msg); my $cur_s = $cur->header('Subject'); $cur_s = '' unless defined $cur_s; my $cur_m = $mime->header('Subject'); @@ -192,6 +203,7 @@ sub get_mark { my ($r, $w) = $self->gfi_start; print $w "get-mark $mark\n" or wfail; defined(my $oid = <$r>) or die "get-mark failed, need git 2.6.0+\n"; + chomp($oid); $oid; } @@ -319,7 +331,7 @@ sub v1_mid0 ($) { my $mids = mids($hdr); if (!scalar(@$mids)) { # spam often has no Message-Id - my $mid0 = digest2mid(content_digest($mime)); + my $mid0 = digest2mid(content_digest($mime), $hdr); append_mid($hdr, $mid0); return $mid0; } @@ -379,7 +391,7 @@ sub add { # v2: we need this for Xapian if ($self->{want_object_info}) { - chomp(my $oid = $self->get_mark(":$blob")); + my $oid = $self->get_mark(":$blob"); $self->{last_object} = [ $oid, $n, \$str ]; } my $ref = $self->{ref}; @@ -434,18 +446,19 @@ sub atfork_child { } } -sub digest2mid ($) { - my ($dig) = @_; +sub digest2mid ($$) { + my ($dig, $hdr) = @_; my $b64 = $dig->clone->b64digest; # Make our own URLs nicer: # See "Base 64 Encoding with URL and Filename Safe Alphabet" in RFC4648 $b64 =~ tr!+/=!-_!d; - # We can make this more meaningful with a date prefix or other things, - # but this is only needed for crap that fails to generate a Message-ID - # or reuses one. In other words, it's usually spammers who hit this - # so they don't deserve nice Message-IDs :P - $b64 . '@localhost'; + # Add a date prefix to prevent a leading '-' in case that trips + # up some tools (e.g. if a Message-ID were a expected as a + # command-line arg) + my $dt = msg_datestamp($hdr); + $dt = POSIX::strftime('%Y%m%d%H%M%S', gmtime($dt)); + "$dt.$b64" . '@z'; } sub clean_purge_buffer {