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 D78C11F9E5 for ; Tue, 25 May 2021 11:01:36 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 2/3] lei_mail_sync: args2folder: common folder lookup sub Date: Tue, 25 May 2021 11:01:35 +0000 Message-Id: <20210525110136.6223-3-e@80x24.org> In-Reply-To: <20210525110136.6223-1-e@80x24.org> References: <20210525110136.6223-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: This lets us have a more consistent UX for mapping easily-typed command-line arguments to canonical folder locations. --- lib/PublicInbox/LeiExportKw.pm | 34 ++++----------------------- lib/PublicInbox/LeiInspect.pm | 21 +++++++---------- lib/PublicInbox/LeiMailSync.pm | 43 ++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 42 deletions(-) diff --git a/lib/PublicInbox/LeiExportKw.pm b/lib/PublicInbox/LeiExportKw.pm index fabc01f8..92c3aa43 100644 --- a/lib/PublicInbox/LeiExportKw.pm +++ b/lib/PublicInbox/LeiExportKw.pm @@ -95,7 +95,6 @@ lei mail_sync uninitialized, see lei-import(1) EOM my $opt = $lei->{opt}; my $all = $opt->{all}; - my @all = $lms->folders; if (defined $all) { # --all= my %x = map { $_ => $_ } split(/,/, $all); my @ok = grep(defined, delete(@x{qw(local remote), ''})); @@ -107,6 +106,7 @@ EOM EOM } my (%seen, @inc); + my @all = $lms->folders; for my $ok (@ok) { if ($ok eq 'local') { @inc = grep(!m!\A[a-z0-9\+]+://!i, @all); @@ -125,35 +125,9 @@ EOM no --mail-sync folders known to lei EOM } else { - my %all = map { $_ => 1 } @all; - my @no; - for (@folders) { - next if $all{$_}; # ok - if (-d "$_/new" && -d "$_/cur") { - my $d = 'maildir:'.$lei->abs_path($_); - push(@no, $_) unless $all{$d}; - $_ = $d; - } elsif (m!\Aimaps?://!i) { - my $orig = $_; - my $res = $lms->match_imap_url($orig, $all); - if (ref $res) { - $_ = $$res; - $lei->qerr(<err($res) if defined $res; - push @no, $orig; - } - } else { - push @no, $_; - } - } - my $no = join("\n\t", @no); - return $lei->fail(<arg2folder($lei, \@folders); + $lei->qerr(@{$err->{qerr}}) if $err->{qerr}; + return $lei->fail($err->{fail}) if $err->{fail}; } my $self = bless { lse => $lse }, __PACKAGE__; $lei->{opt}->{'mail-sync'} = 1; # for prepare_inputs diff --git a/lib/PublicInbox/LeiInspect.pm b/lib/PublicInbox/LeiInspect.pm index 7fd33289..46b9197f 100644 --- a/lib/PublicInbox/LeiInspect.pm +++ b/lib/PublicInbox/LeiInspect.pm @@ -29,19 +29,16 @@ sub inspect_sync_folder ($$) { my $ent = {}; my $lse = $lei->{lse} or return $ent; my $lms = $lse->lms or return $ent; - my @folders; - if ($folder =~ m!\Aimaps?://!i) { - @folders = map { $_->as_string } $lms->match_imap_url($folder); - } elsif ($folder =~ m!\A(maildir|mh):(.+)!i) { - my $type = lc $1; - $folders[0] = "$type:".$lei->abs_path($2); - } elsif (-d $folder) { - $folders[0] = 'maildir:'.$lei->abs_path($folder); - } else { - $lei->fail("$folder not understood"); + my $folders = [ $folder ]; + my $err = $lms->arg2folder($lei, $folders); + if ($err) { + if ($err->{fail}) { + $lei->qerr("# no folders match $folder (non-fatal)"); + @$folders = (); + } + $lei->qerr(@{$err->{qerr}}) if $err->{qerr}; } - $lei->qerr("# no folders match $folder (non-fatal)") if !@folders; - for my $f (@folders) { + for my $f (@$folders) { $ent->{$f} = $lms->location_stats($f); # may be undef } $ent diff --git a/lib/PublicInbox/LeiMailSync.pm b/lib/PublicInbox/LeiMailSync.pm index 63076fa1..094cf1fd 100644 --- a/lib/PublicInbox/LeiMailSync.pm +++ b/lib/PublicInbox/LeiMailSync.pm @@ -302,4 +302,47 @@ sub match_imap_url { "E: `$url' is ambiguous:\n\t".join("\n\t", @match)."\n"; } +# map CLI args to folder table entries, returns undef on failure +sub arg2folder { + my ($self, $lei, $folders) = @_; + my @all = $self->folders; + my %all = map { $_ => 1 } @all; + my ($err, @no); + for (@$folders) { + next if $all{$_}; # ok + if (m!\A(maildir|mh):(.+)!i) { + my $type = lc $1; + my $d = "$type:".$lei->abs_path($2); + push(@no, $_) unless $all{$d}; + $_ = $d; + } elsif (-d "$_/new" && -d "$_/cur") { + my $d = 'maildir:'.$lei->abs_path($_); + push(@no, $_) unless $all{$d}; + $_ = $d; + } elsif (m!\Aimaps?://!i) { + my $orig = $_; + my $res = match_imap_url($self, $orig, \@all); + if (ref $res) { + $_ = $$res; + push(@{$err->{qerr}}, <err($res) if defined $res; + push @no, $orig; + } + } else { + push @no, $_; + } + } + if (@no) { + my $no = join("\n\t", @no); + $err->{fail} = <