]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LeiLcat.pm
lei lcat: allow IMAP folder URLs w/o UIDVALIDITY
[public-inbox.git] / lib / PublicInbox / LeiLcat.pm
index 0f585ff5a6293f51009483fdf722d0100573aa1f..5bd20c1fb09bdbdfca05f475150c0aeadc1fe9fe 100644 (file)
@@ -11,14 +11,31 @@ use PublicInbox::LeiViewText;
 use URI::Escape qw(uri_unescape);
 use PublicInbox::MID qw($MID_EXTRACT);
 
-sub lcat_imap_uid_uri ($$) {
-       my ($lei, $uid_uri) = @_;
+sub lcat_imap_uri ($$) {
+       my ($lei, $uri) = @_;
        my $lms = $lei->{lse}->lms or return;
-       my $oidhex = $lms->imap_oid($lei, $uid_uri);
-       if (ref(my $err = $oidhex)) { # art2folder error
-               $lei->qerr(@{$err->{qerr}}) if $err->{qerr};
+       # cf. LeiToMail->wq_atexit_child
+       if (defined $uri->uid) {
+               my $oidhex = $lms->imap_oid($lei, $uri);
+               if (ref(my $err = $oidhex)) { # art2folder error
+                       $lei->qerr(@{$err->{qerr}}) if $err->{qerr};
+               }
+               push @{$lei->{lcat_blob}}, $oidhex;
+       } elsif (defined(my $fid = $lms->fid_for($$uri))) {
+               push @{$lei->{lcat_fid}}, $fid;
+       } else {
+               my $folders = [ $$uri ];
+               my $err = $lms->arg2folder($lei, $folders);
+               $lei->qerr(@{$err->{qerr}}) if $err && $err->{qerr};
+               if ($err && $err->{fail}) {
+                       $lei->child_error(1 << 8, "# unknown folder: $uri");
+               } else {
+                       for my $f (@$folders) {
+                               my $fid = $lms->fid_for($f);
+                               push @{$lei->{lcat_fid}}, $fid;
+                       }
+               }
        }
-       push @{$lei->{lcat_blob}}, $oidhex; # cf. LeiToMail->wq_atexit_child
 }
 
 sub extract_1 ($$) {
@@ -26,10 +43,8 @@ sub extract_1 ($$) {
        if ($x =~ m!\b(imaps?://[^>]+)!i) {
                my $u = $1;
                require PublicInbox::URIimap;
-               $u = PublicInbox::URIimap->new($u);
-               defined($u->uid) ? lcat_imap_uid_uri($lei, $u) :
-                               $lei->child_error(1 << 8, "# no UID= in $u");
-               '""'; # blank query, using {lcat_blob}
+               lcat_imap_uri($lei, PublicInbox::URIimap->new($u));
+               '""'; # blank query, using {lcat_blob} or {lcat
        } elsif ($x =~ m!\b([a-z]+?://\S+)!i) {
                my $u = $1;
                $u =~ s/[\>\]\)\,\.\;]+\z//;
@@ -89,9 +104,7 @@ sub _stdin { # PublicInbox::InputPipe::consume callback for --stdin
        my ($lei) = @_; # $_[1] = $rbuf
        if (defined($_[1])) {
                $_[1] eq '' and return eval {
-                       if (my $dfd = $lei->{3}) {
-                               chdir($dfd) or return $lei->fail("fchdir: $!");
-                       }
+                       $lei->fchdir or return;
                        my @argv = split(/\s+/, $lei->{mset_opt}->{qstr});
                        $lei->{mset_opt}->{qstr} = extract_all($lei, @argv)
                                or return;
@@ -129,4 +142,12 @@ no args allowed on command-line with --stdin
        $lei->_start_query;
 }
 
+sub _complete_lcat {
+       my ($lei, @argv) = @_;
+       my $sto = $lei->_lei_store or return;
+       my $lms = $sto->search->lms or return;
+       my $match_cb = $lei->complete_url_prepare(\@argv);
+       grep(m!\A[a-z]+://!, map { $match_cb->($_) } $lms->folders);
+}
+
 1;