From: Eric Wong Date: Sun, 24 Oct 2021 00:20:40 +0000 (-0600) Subject: lei export-kw: skip read-only IMAP folders X-Git-Tag: v1.7.0~69 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f59ac79a64759396ce484616393cdad18d431a57;p=thirdparty%2Fpublic-inbox.git lei export-kw: skip read-only IMAP folders Since we want to store IMAP flags asynchronously and not wait for results, we can't check for IMAP errors this way and end up wasting bandwidth on public-inbox-imapd. Now, we just check PERMANENTFLAGS up front to ensure a folder can handle IMAP flag storage before proceeding. --- diff --git a/lib/PublicInbox/LeiExportKw.pm b/lib/PublicInbox/LeiExportKw.pm index 756d0e9c0..0ecfb7829 100644 --- a/lib/PublicInbox/LeiExportKw.pm +++ b/lib/PublicInbox/LeiExportKw.pm @@ -67,7 +67,17 @@ sub input_path_url { $self->{lms}->each_src($input, \&export_kw_md, $self, $mdir); } elsif ($input =~ m!\Aimaps?://!i) { my $uri = PublicInbox::URIimap->new($input); - if (my $mic = $self->{nwr}->mic_for_folder($uri)) { + my $mic = $self->{nwr}->mic_for_folder($uri); + if ($mic && !$self->{nwr}->can_store_flags($mic)) { + my $m = "$input does not support PERMANENTFLAGS"; + if (defined $self->{lei}->{opt}->{all}) { + $self->{lei}->qerr("# $m"); + } else { # set error code if user explicitly requested + $self->{lei}->child_error(0, "E: $m"); + } + return; + } + if ($mic) { $self->{lms}->each_src($$uri, \&export_kw_imap, $self, $mic); $mic->expunge; diff --git a/lib/PublicInbox/NetWriter.pm b/lib/PublicInbox/NetWriter.pm index 629a752ae..4a1f34f63 100644 --- a/lib/PublicInbox/NetWriter.pm +++ b/lib/PublicInbox/NetWriter.pm @@ -56,4 +56,13 @@ sub imap_set_kw { $mic; # caller must ->expunge } +sub can_store_flags { + my ($self, $mic) = @_; + for ($mic->Results) { + /^\* OK \[PERMANENTFLAGS \(([^\)]*)\)\].*/ and + return $self->can('perm_fl_ok')->($1); + } + undef; +} + 1; diff --git a/t/lei-export-kw.t b/t/lei-export-kw.t index 55730e87c..88b2a80b9 100644 --- a/t/lei-export-kw.t +++ b/t/lei-export-kw.t @@ -4,7 +4,7 @@ use strict; use v5.10.1; use PublicInbox::TestCommon; use File::Copy qw(cp); use File::Path qw(make_path); -require_mods(qw(lei -imapd Mail::IMAPClient)); +require_mods(qw(lei)); # see lei-import-imap.t for IMAP tests my ($tmpdir, $for_destroy) = tmpdir; my $expect = eml_load('t/data/0001.patch'); my $do_export_kw = 1; diff --git a/t/lei-import-imap.t b/t/lei-import-imap.t index 315567b3b..3b6cb2992 100644 --- a/t/lei-import-imap.t +++ b/t/lei-import-imap.t @@ -110,6 +110,9 @@ test_lei({ tmpdir => $tmpdir }, sub { is(scalar(@$out), 2, 'got JSON') or diag explain($out); lei_ok qw(lcat), $url_orig; is($lei_out, $orig, 'lcat w/o UID works'); + + ok(!lei(qw(export-kw), $url_orig), 'export-kw fails on read-only IMAP'); + like($lei_err, qr/does not support/, 'error noted in failure'); }); done_testing;