]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LeiImport.pm
www: improve visibility of coderepos
[public-inbox.git] / lib / PublicInbox / LeiImport.pm
index b85f4d6c457453aba2165f31d6b829dbd1889133..65e37371cdd275254e936f095a08d5c5543ac360 100644 (file)
@@ -7,19 +7,20 @@ use strict;
 use v5.10.1;
 use parent qw(PublicInbox::IPC);
 use PublicInbox::Eml;
-use PublicInbox::InboxWritable qw(eml_from_path);
 use PublicInbox::PktOp qw(pkt_do);
 
 sub _import_eml { # MboxReader callback
        my ($eml, $sto, $set_kw) = @_;
-       $sto->ipc_do('set_eml', $eml, $set_kw ? $sto->mbox_keywords($eml) : ());
+       $sto->ipc_do('set_eml', $eml, $set_kw ?
+               @{PublicInbox::MboxReader::mbox_keywords($eml)} : ());
 }
 
 sub import_done_wait { # dwaitpid callback
        my ($arg, $pid) = @_;
        my ($imp, $lei) = @$arg;
        $lei->child_error($?, 'non-fatal errors during import') if $?;
-       my $ign = $lei->{sto}->ipc_do('done'); # PublicInbox::LeiStore::done
+       my $sto = delete $lei->{sto};
+       my $wait = $sto->ipc_do('done') if $sto; # PublicInbox::LeiStore::done
        $lei->dclose;
 }
 
@@ -69,12 +70,11 @@ sub call { # the main "lei import" method
                $self->{0} = $lei->{0};
        }
 
-       # TODO: do we need --format for non-stdin?
-       my $fmt = $lei->{opt}->{'format'};
+       my $fmt = $lei->{opt}->{'in-format'};
        # e.g. Maildir:/home/user/Mail/ or imaps://example.com/INBOX
        for my $input (@inputs) {
                my $input_path = $input;
-               if ($input =~ m!\A(?:imap|nntp)s?://!i) {
+               if ($input =~ m!\A(?:imaps?|nntps?|s?news)://!i) {
                        require PublicInbox::NetReader;
                        $net //= PublicInbox::NetReader->new;
                        $net->add_url($input);
@@ -82,10 +82,11 @@ sub call { # the main "lei import" method
                        my $ifmt = lc $1;
                        if (($fmt // $ifmt) ne $ifmt) {
                                return $lei->fail(<<"");
---format=$fmt and `$ifmt:' conflict
+--in-format=$fmt and `$ifmt:' conflict
 
                        }
                        if (-f $input_path) {
+                               require PublicInbox::MboxLock;
                                require PublicInbox::MboxReader;
                                PublicInbox::MboxReader->can($ifmt) or return
                                        $lei->fail("$ifmt not supported");
@@ -144,42 +145,44 @@ error reading $input: $!
                        $cb->(undef, $fh, \&_import_eml, $lei->{sto}, $set_kw);
                }
        };
-       $lei->child_error(1 << 8, "<stdin>: $@") if $@;
+       $lei->child_error(1 << 8, "$input: $@") if $@;
 }
 
-sub _import_maildir { # maildir_each_file cb
-       my ($f, $sto, $set_kw) = @_;
-       $sto->ipc_do('set_eml_from_maildir', $f, $set_kw);
+sub _import_maildir { # maildir_each_eml cb
+       my ($f, $kw, $eml, $sto, $set_kw) = @_;
+       $sto->ipc_do('set_eml', $eml, $set_kw ? @$kw : ());
 }
 
-sub _import_imap { # imap_each cb
+sub _import_net { # imap_each, nntp_each cb
        my ($url, $uid, $kw, $eml, $sto, $set_kw) = @_;
-       warn "$url $uid";
        $sto->ipc_do('set_eml', $eml, $set_kw ? @$kw : ());
 }
 
 sub import_path_url {
        my ($self, $input) = @_;
        my $lei = $self->{lei};
-       my $ifmt = lc($lei->{opt}->{'format'} // '');
+       my $ifmt = lc($lei->{opt}->{'in-format'} // '');
        # TODO auto-detect?
-       if ($input =~ m!\A(imap|nntp)s?://!i) {
-               $lei->{net}->imap_each($input, \&_import_imap, $lei->{sto},
+       if ($input =~ m!\Aimaps?://!i) {
+               $lei->{net}->imap_each($input, \&_import_net, $lei->{sto},
                                        $lei->{opt}->{kw});
                return;
+       } elsif ($input =~ m!\A(?:nntps?|s?news)://!i) {
+               $lei->{net}->nntp_each($input, \&_import_net, $lei->{sto}, 0);
+               return;
        } elsif ($input =~ s!\A([a-z0-9]+):!!i) {
                $ifmt = lc $1;
        }
        if (-f $input) {
-               open my $fh, '<', $input or return $lei->child_error(1 << 8, <<"");
-unable to open $input: $!
-
-               _import_fh($lei, $fh, $input, $ifmt);
+               my $m = $lei->{opt}->{'lock'} // ($ifmt eq 'eml' ? ['none'] :
+                               PublicInbox::MboxLock->defaults);
+               my $mbl = PublicInbox::MboxLock->acq($input, 0, $m);
+               _import_fh($lei, $mbl->{fh}, $input, $ifmt);
        } elsif (-d _ && (-d "$input/cur" || -d "$input/new")) {
                return $lei->fail(<<EOM) if $ifmt && $ifmt ne 'maildir';
 $input appears to a be a maildir, not $ifmt
 EOM
-               PublicInbox::MdirReader::maildir_each_file($input,
+               PublicInbox::MdirReader::maildir_each_eml($input,
                                        \&_import_maildir,
                                        $lei->{sto}, $lei->{opt}->{kw});
        } else {
@@ -190,7 +193,7 @@ EOM
 sub import_stdin {
        my ($self) = @_;
        my $lei = $self->{lei};
-       _import_fh($lei, delete $self->{0}, '<stdin>', $lei->{opt}->{'format'});
+       _import_fh($lei, delete $self->{0}, '<stdin>', $lei->{opt}->{'in-format'});
 }
 
 no warnings 'once'; # the following works even when LeiAuth is lazy-loaded