]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LeiToMail.pm
lei: flesh out `forwarded' kw support for Maildir and IMAP
[public-inbox.git] / lib / PublicInbox / LeiToMail.pm
index 7adbffe7ac3aba411d132131cb00a0c13a762820..0fa0bd9a6a2ef124724b085be5677b5395738ecb 100644 (file)
@@ -9,7 +9,6 @@ use parent qw(PublicInbox::IPC);
 use PublicInbox::Eml;
 use PublicInbox::ProcessPipe;
 use PublicInbox::Spawn qw(spawn);
-use PublicInbox::LeiDedupe;
 use PublicInbox::PktOp qw(pkt_do);
 use Symbol qw(gensym);
 use IO::Handle; # ->autoflush
@@ -39,7 +38,7 @@ sub _mbox_hdr_buf ($$$) {
                if (my $ent = $kw2status{$k}) {
                        push @{$hdr{$ent->[0]}}, $ent->[1];
                } else { # X-Label?
-                       warn "TODO: keyword `$k' not supported for mbox\n";
+                       warn "# keyword `$k' not supported for mbox\n";
                }
        }
        # Messages are always 'O' (non-\Recent in IMAP), it saves
@@ -336,21 +335,29 @@ sub new {
                $self->{base_type} = 'mbox';
        } elsif ($fmt =~ /\Aimaps?\z/) { # TODO .onion support
                require PublicInbox::NetWriter;
+               require PublicInbox::URIimap;
                my $net = PublicInbox::NetWriter->new;
-               $net->add_url($dst);
                $net->{quiet} = $lei->{opt}->{quiet};
-               my $err = $net->errors($dst);
+               my $uri = PublicInbox::URIimap->new($dst)->canonical;
+               $net->add_url($uri);
+               my $err = $net->errors;
                return $lei->fail($err) if $err;
-               require PublicInbox::URIimap; # TODO: URI cast early
-               $self->{uri} = PublicInbox::URIimap->new($dst);
-               $self->{uri}->mailbox or die "No mailbox: $dst";
+               $uri->mailbox or return $lei->fail("No mailbox: $dst");
+               $self->{uri} = $uri;
+               $dst = $lei->{ovv}->{dst} = $$uri; # canonicalized
                $lei->{net} = $net;
                $self->{base_type} = 'imap';
        } else {
                die "bad mail --format=$fmt\n";
        }
        $self->{dst} = $dst;
-       $lei->{dedupe} = PublicInbox::LeiDedupe->new($lei);
+       $lei->{dedupe} = $lei->{lss} // do {
+               my $dd_cls = 'PublicInbox::'.
+                       ($lei->{opt}->{save} ? 'LeiSavedSearch' : 'LeiDedupe');
+               eval "require $dd_cls";
+               die "$dd_cls: $@" if $@;
+               $dd_cls->new($lei);
+       };
        $self;
 }
 
@@ -368,6 +375,7 @@ sub _pre_augment_maildir {
 
 sub _do_augment_maildir {
        my ($self, $lei) = @_;
+       return if ($lei->{opt}->{save} // 0) < 0;
        my $dst = $lei->{ovv}->{dst};
        my $lse = $lei->{opt}->{'import-before'} ? $lei->{lse} : undef;
        my $mdr = PublicInbox::MdirReader->new;
@@ -398,6 +406,7 @@ sub _imap_augment_or_delete { # PublicInbox::NetReader::imap_each cb
 
 sub _do_augment_imap {
        my ($self, $lei) = @_;
+       return if ($lei->{opt}->{save} // 0) < 0;
        my $net = $lei->{net};
        my $lse = $lei->{opt}->{'import-before'} ? $lei->{lse} : undef;
        if ($lei->{opt}->{augment}) {
@@ -468,6 +477,7 @@ sub _do_augment_mbox {
        my ($self, $lei) = @_;
        return unless $self->{seekable};
        my $opt = $lei->{opt};
+       return if ($opt->{save} // 0) < 0;
        my $out = $lei->{1};
        my ($fmt, $dst) = @{$lei->{ovv}}{qw(fmt dst)};
        return unless -s $out;