lib/PublicInbox/LeiInput.pm | 25 ++++++++++++++++++------- t/lei-import.t | 2 +- t/lei-mark.t | 4 ++-- diff --git a/lib/PublicInbox/LeiInput.pm b/lib/PublicInbox/LeiInput.pm index 93284e8b26756074194bfc6fb1fa87e261393faa..c04fc2f84d1566bc1a609fe5b771d27ca3fb8761 100644 --- a/lib/PublicInbox/LeiInput.pm +++ b/lib/PublicInbox/LeiInput.pm @@ -14,9 +14,9 @@ if (!$fmt) { my $err = $files ? "regular file(s):\n@$files" : '--stdin'; return $lei->fail("--$opt_key unset for $err"); } + return 1 if $fmt eq 'eml'; require PublicInbox::MboxLock if $files; require PublicInbox::MboxReader; - return 1 if $fmt eq 'eml'; # XXX: should this handle {gz,bz2,xz}? that's currently in LeiToMail PublicInbox::MboxReader->reads($fmt) or return $lei->fail("--$opt_key=$fmt unrecognized"); @@ -28,7 +28,6 @@ # Subclass must define ->input_eml_cb and ->input_mbox_cb sub input_fh { my ($self, $ifmt, $fh, $name, @args) = @_; if ($ifmt eq 'eml') { - require PublicInbox::Eml; my $buf = do { local $/; <$fh> } // return $self->{lei}->child_error(1 << 8, <<""); error reading $name: $! @@ -60,13 +59,21 @@ $lei->{net}->nntp_each($input, $self->can('input_net_cb'), $self, @args); return; } - $input =~ s!\A([a-z0-9]+):!!i and $ifmt = lc($1); + if ($input =~ s!\A([a-z0-9]+):!!i) { + $ifmt = lc($1); + } elsif ($input =~ /\.(?:patch|eml)\z/i) { + $ifmt = 'eml'; + } my $devfd = $lei->path_to_fd($input) // return; if ($devfd >= 0) { $self->input_fh($ifmt, $lei->{$devfd}, $input, @args); - } elsif (-f $input) { - my $m = $lei->{opt}->{'lock'} // ($ifmt eq 'eml' ? ['none'] : - PublicInbox::MboxLock->defaults); + } elsif (-f $input && $ifmt eq 'eml') { + open my $fh, '<', $input or + return $lei->fail("open($input): $!"); + $self->input_fh($ifmt, $fh, $input, @args); + } elsif (-f _) { + my $m = $lei->{opt}->{'lock'} // + PublicInbox::MboxLock->defaults; my $mbl = PublicInbox::MboxLock->acq($input, 0, $m); $self->input_fh($ifmt, $mbl->{fh}, $input, @args); } elsif (-d _ && (-d "$input/cur" || -d "$input/new")) { @@ -91,7 +98,6 @@ check_input_format($lei) or return; push @$inputs, '/dev/stdin'; } my $net = $lei->{net}; # NetWriter may be created by l2m - my $fmt = $lei->{opt}->{'in-format'}; my (@f, @d); # e.g. Maildir:/home/user/Mail/ or imaps://example.com/INBOX for my $input (@$inputs) { @@ -120,6 +126,11 @@ $lei->fail("$ifmt not supported"); } else { return $lei->fail("Unable to handle $input"); } + } elsif ($input =~ /\.(eml|patch)\z/i && -f $input) { + lc($in_fmt//'eml') eq 'eml' or return $lei->fail(<<""); +$input is `eml', not --in-format=$in_fmt + + require PublicInbox::Eml; } else { my $devfd = $lei->path_to_fd($input) // return; if ($devfd >= 0 || -f $input || -p _) { diff --git a/t/lei-import.t b/t/lei-import.t index 33ce490d59f1e976dfa8db29351d06253fd578b8..99289748d7ba295c6146c305819fd101c4d21a19 100644 --- a/t/lei-import.t +++ b/t/lei-import.t @@ -4,7 +4,7 @@ # License: AGPL-3.0+ use strict; use v5.10.1; use PublicInbox::TestCommon; test_lei(sub { ok(!lei(qw(import -F bogus), 't/plack-qp.eml'), 'fails with bogus format'); -like($lei_err, qr/\bbogus unrecognized/, 'gave error message'); +like($lei_err, qr/\bis `eml', not --in-format/, 'gave error message'); lei_ok(qw(q s:boolean), \'search miss before import'); unlike($lei_out, qr/boolean/i, 'no results, yet'); diff --git a/t/lei-mark.t b/t/lei-mark.t index 7855839e31a2c5e2730d8b3da3cfe765be3c3b02..98652c85134cdc6f61870c04c52b9b643433ae1c 100644 --- a/t/lei-mark.t +++ b/t/lei-mark.t @@ -26,8 +26,8 @@ }; test_lei(sub { lei_ok(qw(ls-label)); is($lei_out, '', 'no labels, yet'); - lei_ok(qw(import -F eml t/utf8.eml)); - lei_ok(qw(mark -F eml t/utf8.eml +kw:flagged +L:urgent)); + lei_ok(qw(import t/utf8.eml)); + lei_ok(qw(mark t/utf8.eml +kw:flagged +L:urgent)); $check_kw->(['flagged'], L => ['urgent']); lei_ok(qw(ls-label)); is($lei_out, "urgent\n", 'label found'); ok(!lei(qw(mark -F eml t/utf8.eml +kw:seeen)), 'bad kw rejected');