From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id DD4281FB05 for ; Tue, 19 Jan 2021 09:34:35 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 8/9] lei: test some likely errors due to misuse Date: Tue, 19 Jan 2021 09:34:34 +0000 Message-Id: <20210119093435.17955-9-e@80x24.org> In-Reply-To: <20210119093435.17955-1-e@80x24.org> References: <20210119093435.17955-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Because user errors happen... --- lib/PublicInbox/LeiOverview.pm | 3 ++- lib/PublicInbox/LeiToMail.pm | 6 +++++- lib/PublicInbox/LeiXSearch.pm | 9 ++++++++- t/lei.t | 14 ++++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/PublicInbox/LeiOverview.pm b/lib/PublicInbox/LeiOverview.pm index 8781259a..a7021b03 100644 --- a/lib/PublicInbox/LeiOverview.pm +++ b/lib/PublicInbox/LeiOverview.pm @@ -82,7 +82,8 @@ sub new { if (!$json) { # default to the cheapest sort since MUA usually resorts $lei->{opt}->{'sort'} //= 'docid' if $dst ne '/dev/stdout'; - $lei->{l2m} = PublicInbox::LeiToMail->new($lei); + $lei->{l2m} = eval { PublicInbox::LeiToMail->new($lei) }; + return $lei->fail($@) if $@; } $lei->{dedupe} //= PublicInbox::LeiDedupe->new($lei); $self; diff --git a/lib/PublicInbox/LeiToMail.pm b/lib/PublicInbox/LeiToMail.pm index a6e517ea..49b5c8ab 100644 --- a/lib/PublicInbox/LeiToMail.pm +++ b/lib/PublicInbox/LeiToMail.pm @@ -339,8 +339,12 @@ sub new { my $self = bless {}, $cls; if ($fmt eq 'maildir') { $self->{base_type} = 'maildir'; + -e $dst && !-d _ and die + "$dst exists and is not a directory\n"; $lei->{ovv}->{dst} = $dst .= '/' if substr($dst, -1) ne '/'; } elsif (substr($fmt, 0, 4) eq 'mbox') { + -e $dst && !-f _ && !-p _ and die + "$dst exists and is not a regular file\n"; $self->can("eml2$fmt") or die "bad mbox --format=$fmt\n"; $self->{base_type} = 'mbox'; } else { @@ -374,7 +378,7 @@ sub _post_augment_maildir { my $d = $dst.$x; next if -d $d; require File::Path; - File::Path::mkpath($d) or die "mkpath($d): $!"; + File::Path::mkpath($d); -d $d or die "$d is not a directory"; } } diff --git a/lib/PublicInbox/LeiXSearch.pm b/lib/PublicInbox/LeiXSearch.pm index 002791c2..fa37543f 100644 --- a/lib/PublicInbox/LeiXSearch.pm +++ b/lib/PublicInbox/LeiXSearch.pm @@ -201,7 +201,14 @@ sub query_done { # EOF callback sub do_post_augment { my ($lei, $zpipe, $au_done) = @_; my $l2m = $lei->{l2m} or die 'BUG: no {l2m}'; - $l2m->post_augment($lei, $zpipe); + eval { $l2m->post_augment($lei, $zpipe) }; + if (my $err = $@) { + if (my $lxs = delete $lei->{lxs}) { + $lxs->wq_kill; + $lxs->wq_close; + } + $lei->fail("$err"); + } close $au_done; # triggers wait_startq } diff --git a/t/lei.t b/t/lei.t index c804ff59..8bb4e439 100644 --- a/t/lei.t +++ b/t/lei.t @@ -181,6 +181,20 @@ my $test_external = sub { $lei->('ls-external'); like($out, qr/boost=0\n/s, 'ls-external has output'); + ok(!$lei->(qw(q s:prefix -o /dev/null -f maildir)), 'bad maildir'); + like($err, qr!/dev/null exists and is not a directory!, + 'error shown'); + is($? >> 8, 1, 'errored out with exit 1'); + + ok(!$lei->(qw(q s:prefix -f mboxcl2 -o), $home), 'bad mbox'); + like($err, qr!\Q$home\E exists and is not a regular file!, + 'error shown'); + is($? >> 8, 1, 'errored out with exit 1'); + + ok(!$lei->(qw(q s:prefix -o /dev/stdout -f Mbox2)), 'bad format'); + like($err, qr/bad mbox --format=mbox2/, 'error shown'); + is($? >> 8, 1, 'errored out with exit 1'); + # note, on a Bourne shell users should be able to use either: # s:"use boolean prefix" # "s:use boolean prefix"