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-ASN: 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 092081F4D0 for ; Mon, 28 Oct 2019 10:45:31 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 10/14] inboxwritable: add assert_usable_dir sub Date: Mon, 28 Oct 2019 10:45:24 +0000 Message-Id: <20191028104528.10140-11-e@80x24.org> In-Reply-To: <20191028104528.10140-1-e@80x24.org> References: <20191028104528.10140-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: And use it for mda, since "0" could be a usable directory if somebody insists on using relative paths... --- lib/PublicInbox/InboxWritable.pm | 9 ++++++++- lib/PublicInbox/V2Writable.pm | 5 ++--- script/public-inbox-mda | 4 +++- t/import.t | 8 ++++++++ t/v2writable.t | 12 ++++++++++++ 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/lib/PublicInbox/InboxWritable.pm b/lib/PublicInbox/InboxWritable.pm index ab7b0ed5..9eab394d 100644 --- a/lib/PublicInbox/InboxWritable.pm +++ b/lib/PublicInbox/InboxWritable.pm @@ -30,12 +30,19 @@ sub new { $self; } +sub assert_usable_dir { + my ($self) = @_; + my $dir = $self->{inboxdir}; + return $dir if defined($dir) && $dir ne ''; + die "no inboxdir defined for $self->{name}\n"; +} + sub init_inbox { my ($self, $shards, $skip_epoch, $skip_artnum) = @_; # TODO: honor skip_artnum my $v = $self->{version} || 1; if ($v == 1) { - my $dir = $self->{inboxdir} or die "no inboxdir in inbox\n"; + my $dir = assert_usable_dir($self); PublicInbox::Import::init_bare($dir); } else { my $v2w = importer($self); diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm index ad2e8e62..1825da2c 100644 --- a/lib/PublicInbox/V2Writable.pm +++ b/lib/PublicInbox/V2Writable.pm @@ -77,7 +77,8 @@ sub new { # $creat may be any true value, or 0/undef. A hashref is true, # and $creat->{nproc} may be set to an integer my ($class, $v2ibx, $creat) = @_; - my $dir = $v2ibx->{inboxdir} or die "no inboxdir in inbox\n"; + $v2ibx = PublicInbox::InboxWritable->new($v2ibx); + my $dir = $v2ibx->assert_usable_dir; unless (-d $dir) { if ($creat) { require File::Path; @@ -86,8 +87,6 @@ sub new { die "$dir does not exist\n"; } } - - $v2ibx = PublicInbox::InboxWritable->new($v2ibx); $v2ibx->umask_prepare; my $xpfx = "$dir/xap" . PublicInbox::Search::SCHEMA_VERSION; diff --git a/script/public-inbox-mda b/script/public-inbox-mda index 69354616..c122984f 100755 --- a/script/public-inbox-mda +++ b/script/public-inbox-mda @@ -49,8 +49,10 @@ if (!defined $dst) { } defined $dst or do_exit(67); # EX_NOUSER 5.1.1 user unknown } -$dst->{inboxdir} or do_exit(67); + $dst = PublicInbox::InboxWritable->new($dst); +eval { $dst->assert_usable_dir }; +do_exit(67) if $@; # pre-check, MDA has stricter rules than an importer might; if ($precheck && !PublicInbox::MDA->precheck($simple, $dst->{address})) { diff --git a/t/import.t b/t/import.t index 4ec3c4f3..d309eec5 100644 --- a/t/import.t +++ b/t/import.t @@ -96,4 +96,12 @@ is(undef, $im->checkpoint, 'checkpoint works before ->done'); $im->done; is(undef, $im->checkpoint, 'checkpoint works after ->done'); $im->checkpoint; + +my $nogit = PublicInbox::Git->new("$dir/non-existent/dir"); +eval { + my $nope = PublicInbox::Import->new($nogit, 'nope', 'no@example.com'); + $nope->add($mime); +}; +ok($@, 'Import->add fails on non-existent dir'); + done_testing(); diff --git a/t/v2writable.t b/t/v2writable.t index c2daac2f..06dafe98 100644 --- a/t/v2writable.t +++ b/t/v2writable.t @@ -260,4 +260,16 @@ EOF $im->done; } +my $tmp = { + inboxdir => "$inboxdir/non-existent/subdir", + name => 'nope', + version => 2, + -primary_address => 'test@example.com', +}; +eval { + my $nope = PublicInbox::V2Writable->new($tmp); + $nope->add($mime); +}; +ok($@, 'V2Writable fails on non-existent dir'); + done_testing();