about summary refs log tree commit homepage
path: root/lib/PublicInbox/V2Writable.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/V2Writable.pm')
-rw-r--r--lib/PublicInbox/V2Writable.pm51
1 files changed, 40 insertions, 11 deletions
diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm
index e673c252..656f0693 100644
--- a/lib/PublicInbox/V2Writable.pm
+++ b/lib/PublicInbox/V2Writable.pm
@@ -199,18 +199,47 @@ sub idx_init {
 }
 
 sub remove {
-        my ($self, $mime, $msg) = @_;
-        my $existing = $self->lookup_content($mime) or return;
-
-        # don't touch ghosts or already junked messages
-        return unless $existing->type eq 'mail';
-
-        # always write removals to the current (latest) git repo since
-        # we process chronologically
+        my ($self, $mime, $cmt_msg) = @_;
+        $self->barrier;
+        $self->idx_init;
         my $im = $self->importer;
-        my ($cmt, undef) = $im->remove($mime, $msg);
-        $cmt = $im->get_mark($cmt);
-        $self->unindex_msg($existing, $cmt);
+        my $ibx = $self->{-inbox};
+        my $srch = $ibx->search;
+        my $cid = content_id($mime);
+        my $skel = $self->{skel};
+        my $parts = $self->{idx_parts};
+        my $mm = $skel->{mm};
+        my $removed;
+        my $mids = mids($mime->header_obj);
+        foreach my $mid (@$mids) {
+                $srch->reopen->each_smsg_by_mid($mid, sub {
+                        my ($smsg) = @_;
+                        $smsg->load_expand;
+                        my $msg = $ibx->msg_by_smsg($smsg);
+                        if (!defined($msg)) {
+                                warn "broken smsg for $mid\n";
+                                return 1; # continue
+                        }
+                        my $cur = PublicInbox::MIME->new($msg);
+                        if (content_id($cur) eq $cid) {
+                                $mm->num_delete($smsg->num);
+                                # $removed should only be set once assuming
+                                # no bugs in our deduplication code:
+                                $removed = $smsg;
+                                $removed->{mime} = $cur;
+                                $im->remove($cur, $cmt_msg);
+                                $removed->num; # memoize this for callers
+
+                                my $oid = $smsg->{blob};
+                                foreach my $idx (@$parts, $skel) {
+                                        $idx->remote_remove($oid, $mid);
+                                }
+                        }
+                        1; # continue
+                });
+                $self->barrier;
+        }
+        $removed;
 }
 
 sub done {