From f59ac79a64759396ce484616393cdad18d431a57 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 23 Oct 2021 18:20:40 -0600 Subject: [PATCH] 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. --- lib/PublicInbox/LeiExportKw.pm | 12 +++++++++++- lib/PublicInbox/NetWriter.pm | 9 +++++++++ t/lei-export-kw.t | 2 +- t/lei-import-imap.t | 3 +++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/PublicInbox/LeiExportKw.pm b/lib/PublicInbox/LeiExportKw.pm index 756d0e9c..0ecfb782 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 629a752a..4a1f34f6 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 55730e87..88b2a80b 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 315567b3..3b6cb299 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; -- 2.44.0