From: Eric Wong Date: Fri, 22 Oct 2021 08:22:45 +0000 (+0000) Subject: lei export-kw: don't recreate deleted IMAP folders X-Git-Tag: v1.7.0~80 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=96a5e841a169166457d9cf485e27a0d6cbe7ed75;p=thirdparty%2Fpublic-inbox.git lei export-kw: don't recreate deleted IMAP folders In case an IMAP folder is deleted, just set an error and ignore it rather than creating an empty folder which we attempt to export keywords to for non-existent messages. --- diff --git a/lib/PublicInbox/LeiExportKw.pm b/lib/PublicInbox/LeiExportKw.pm index ceeef7f21..12c8f4067 100644 --- a/lib/PublicInbox/LeiExportKw.pm +++ b/lib/PublicInbox/LeiExportKw.pm @@ -67,9 +67,13 @@ 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); - my $mic = $self->{nwr}->mic_for_folder($uri); - $self->{lms}->each_src($$uri, \&export_kw_imap, $self, $mic); - $mic->expunge; + if (my $mic = $self->{nwr}->mic_for_folder($uri)) { + $self->{lms}->each_src($$uri, \&export_kw_imap, + $self, $mic); + $mic->expunge; + } else { + $self->{lei}->child_error(0, "$input unavailable: $@"); + } } else { die "BUG: $input not supported" } } @@ -108,6 +112,7 @@ EOM $self->{nwr} = bless $net, 'PublicInbox::NetWriter'; $self->{imap_mod_kw} = $net->can($self->{-merge_kw} ? 'imap_add_kw' : 'imap_set_kw'); + $self->{nwr}->{-skip_creat} = 1; } my $ops = {}; $lei->{auth}->op_merge($ops, $self) if $lei->{auth}; diff --git a/lib/PublicInbox/NetReader.pm b/lib/PublicInbox/NetReader.pm index 4da19ab96..032b4fda5 100644 --- a/lib/PublicInbox/NetReader.pm +++ b/lib/PublicInbox/NetReader.pm @@ -359,6 +359,7 @@ sub imap_common_init ($;$) { mic_for($self, $uri, $mic_common, $lei) // die "Unable to continue\n"; next unless $self->isa('PublicInbox::NetWriter'); + next if $self->{-skip_creat}; my $dst = $orig_uri->mailbox // next; next if $mic->exists($dst); # already exists $mic->create($dst) or die "CREATE $dst failed <$orig_uri>: $@"; diff --git a/xt/net_writer-imap.t b/xt/net_writer-imap.t index cb2ea61ff..afa4bcc3e 100644 --- a/xt/net_writer-imap.t +++ b/xt/net_writer-imap.t @@ -83,8 +83,11 @@ my $mics = do { }; my $mic = (values %$mics)[0]; my $cleanup = PublicInbox::OnDestroy->new($$, sub { - my $mic = $nwr->mic_get($uri); - $mic->delete($folder) or fail "delete $folder <$folder_uri>: $@"; + if (defined($folder)) { + my $mic = $nwr->mic_get($uri); + $mic->delete($folder) or + fail "delete $folder <$folder_uri>: $@"; + } if ($tmpdir && -f "$tmpdir/.gitconfig") { local $ENV{HOME} = $tmpdir; system(qw(git credential-cache exit)); @@ -250,6 +253,14 @@ EOM lei_ok qw(q m:testmessage --no-external -o), $folder_url; lei_ok qw(up), $folder_url; lei_ok qw(up --all=remote); + $mic = $nwr->mic_get($uri); + $mic->delete($folder) or fail "delete $folder <$folder_uri>: $@"; + $mic->expunge; + undef $mic; + undef $folder; + ok(!lei(qw(export-kw), $folder_url), + 'export-kw fails w/ non-existent folder'); + }); undef $cleanup; # remove temporary folder