]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/SearchIdx.pm
v2: avoid redundant/repeated configs for git partition repos
[public-inbox.git] / lib / PublicInbox / SearchIdx.pm
index f63e07200b08d9d970d5e43c10cc8f70da0508af..725bbd838075156f37b982384dd9bb5e077dab0f 100644 (file)
@@ -19,7 +19,6 @@ use POSIX qw(strftime);
 require PublicInbox::Git;
 
 use constant {
-       MAX_MID_SIZE => 244, # max term size (Xapian limitation) - length('Q')
        PERM_UMASK => 0,
        OLD_PERM_GROUP => 1,
        OLD_PERM_EVERYBODY => 2,
@@ -303,7 +302,8 @@ sub index_body ($$$) {
 }
 
 sub add_message {
-       my ($self, $mime, $bytes, $num, $blob) = @_; # mime = Email::MIME object
+       # mime = Email::MIME object
+       my ($self, $mime, $bytes, $num, $oid, $mid0) = @_;
        my $doc_id;
        my $mids = mids($mime->header_obj);
        my $skel = $self->{skeleton};
@@ -311,18 +311,11 @@ sub add_message {
        eval {
                my $smsg = PublicInbox::SearchMsg->new($mime);
                my $doc = $smsg->{doc};
-               foreach my $mid (@$mids) {
-                       # FIXME: may be abused to prevent archival
-                       length($mid) > MAX_MID_SIZE and
-                               die 'Message-ID too long';
-                       $doc->add_term('Q' . $mid);
-               }
                my $subj = $smsg->subject;
                my $xpath;
                if ($subj ne '') {
                        $xpath = $self->subject_path($subj);
                        $xpath = id_compress($xpath);
-                       $doc->add_boolean_term('XPATH' . $xpath);
                }
 
                my $lines = $mime->body_raw =~ tr!\n!\n!;
@@ -378,7 +371,8 @@ sub add_message {
 
                # populates smsg->references for smsg->to_doc_data
                my $refs = parse_references($smsg);
-               my $data = $smsg->to_doc_data($blob);
+               $mid0 = $mids->[0] unless defined $mid0;
+               my $data = $smsg->to_doc_data($oid, $mid0);
                foreach my $mid (@$mids) {
                        $tg->index_text($mid, 1, 'XM');
                }
@@ -393,12 +387,15 @@ sub add_message {
                                }
                        }
                }
+
                if ($skel) {
                        push @values, $mids, $xpath, $data;
                        $skel->index_skeleton(\@values);
+                       $doc->add_boolean_term('Q' . $_) foreach @$mids;
                        $doc_id = $self->{xdb}->add_document($doc);
                } else {
-                       $doc_id = link_and_save($self, $doc, $mids, $refs);
+                       $doc_id = link_and_save($self, $doc, $mids, $refs,
+                                               $num, $xpath);
                }
        };
 
@@ -469,9 +466,9 @@ sub parse_references ($) {
        my %mids = map { $_ => 1 } @{mids($hdr)};
        my @keep;
        foreach my $ref (@$refs) {
-               # FIXME: this is an archive-prevention vector like X-No-Archive
-               if (length($ref) > MAX_MID_SIZE) {
+               if (length($ref) > PublicInbox::MID::MAX_MID_SIZE) {
                        warn "References: <$ref> too long, ignoring\n";
+                       next;
                }
                next if $mids{$ref};
                push @keep, $ref;
@@ -504,10 +501,14 @@ sub link_doc {
 }
 
 sub link_and_save {
-       my ($self, $doc, $mids, $refs) = @_;
+       my ($self, $doc, $mids, $refs, $num, $xpath) = @_;
        my $db = $self->{xdb};
        my $old_tid;
        my $doc_id;
+       $doc->add_boolean_term('XNUM' . $num) if defined $num;
+       $doc->add_boolean_term('XPATH' . $xpath) if defined $xpath;
+       $doc->add_boolean_term('Q' . $_) foreach @$mids;
+
        my $vivified = 0;
        foreach my $mid (@$mids) {
                $self->each_smsg_by_mid($mid, sub {
@@ -816,7 +817,7 @@ sub _read_git_config_perm {
        my ($self) = @_;
        my @cmd = qw(config);
        if ($self->{version} == 2) {
-               push @cmd, "--file=$self->{mainrepo}/inbox-config";
+               push @cmd, "--file=$self->{mainrepo}/all.git/config";
        }
        my $fh = $self->{git}->popen(@cmd, 'core.sharedRepository');
        local $/ = "\n";