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 2A3D61FA17 for ; Thu, 29 Apr 2021 09:46:21 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 3/4] lei import: support UIDVALIDITY in IMAP URL Date: Thu, 29 Apr 2021 09:46:19 +0000 Message-Id: <20210429094620.15195-4-e@80x24.org> In-Reply-To: <20210429094620.15195-1-e@80x24.org> References: <20210429094620.15195-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Specifying a UIDVALIDITY value allows the user to enforce a strict match and force failure. This necessitated changes to NetReader to allow die() and make error reporting more suitable for CLI usage rather than daemonized usage of -watch. --- lib/PublicInbox/LeiInput.pm | 10 +++++++++- lib/PublicInbox/NetReader.pm | 7 +++++++ t/lei-import-imap.t | 4 ++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/PublicInbox/LeiInput.pm b/lib/PublicInbox/LeiInput.pm index ce675f40..277ad88d 100644 --- a/lib/PublicInbox/LeiInput.pm +++ b/lib/PublicInbox/LeiInput.pm @@ -293,6 +293,7 @@ $input is `eml', not --in-format=$in_fmt $lei->err("# --sync is not supported for: @{$sync->{no}}"); } if ($net) { + $net->{-can_die} = 1; if (my $err = $net->errors) { return $lei->fail($err); } @@ -306,10 +307,17 @@ $input is `eml', not --in-format=$in_fmt sub process_inputs { my ($self) = @_; + my $err; for my $input (@{$self->{inputs}}) { - $self->input_path_url($input); + eval { $self->input_path_url($input) }; + next unless $@; + $err = "$input: $@"; + last; } + # always commit first, even on error partial work is acceptable for + # lei my $wait = $self->{lei}->{sto}->ipc_do('done') if $self->{lei}->{sto}; + $self->{lei}->fail($err) if $err; } sub input_only_atfork_child { diff --git a/lib/PublicInbox/NetReader.pm b/lib/PublicInbox/NetReader.pm index 81d25ead..3fc37b10 100644 --- a/lib/PublicInbox/NetReader.pm +++ b/lib/PublicInbox/NetReader.pm @@ -407,6 +407,11 @@ sub _imap_fetch_all ($$$) { return "E: $orig_uri cannot get UIDVALIDITY"; $r_uidnext //= $mic->uidnext($mbx) // return "E: $orig_uri cannot get UIDNEXT"; + my $expect = $orig_uri->uidvalidity // $r_uidval; + return <clone; my ($itrk, $l_uid, $l_uidval) = _itrk_last($self, $uri, $r_uidval); return <{-can_die}; warn $err if $err; $mic; } @@ -620,6 +626,7 @@ sub nntp_each { } else { $err = "E: <$uri> not connected: $!"; } + die $err if $err && $self->{-can_die}; warn $err if $err; $nn; } diff --git a/t/lei-import-imap.t b/t/lei-import-imap.t index 611328b4..c977c68e 100644 --- a/t/lei-import-imap.t +++ b/t/lei-import-imap.t @@ -24,6 +24,10 @@ test_lei({ tmpdir => $tmpdir }, sub { lei_ok('import', $url); lei_ok 'ls-sync'; like($lei_out, qr!\A\Q$url\E;UIDVALIDITY=\d+\n\z!, 'ls-sync'); + chomp(my $u = $lei_out); + lei_ok('import', $u, \'UIDVALIDITY match in URL'); + $u =~ s/;UIDVALIDITY=(\d+)\s*/;UIDVALIDITY=9$1/s; + ok(!lei('import', $u), 'UIDVALIDITY mismatch in URL rejected'); lei_ok('inspect', $url); my $inspect = json_utf8->decode($lei_out);