about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-05-30 06:33:57 +0000
committerEric Wong <e@80x24.org>2021-05-30 08:09:09 +0000
commitf91eec7587fb88e058b12896377f4d289087d0f7 (patch)
tree01440809a3a065f5e0f078bb1708f2bc717d2493
parent9b4d6cb8d09777ac3157afe0b08969a959e4968a (diff)
downloadpublic-inbox-f91eec7587fb88e058b12896377f4d289087d0f7.tar.gz
This could be helpful in case when a Maildir is on a slow
or unmounted filesystem and lei/store is on fast storage.
-rw-r--r--lib/PublicInbox/LeiLcat.pm37
1 files changed, 23 insertions, 14 deletions
diff --git a/lib/PublicInbox/LeiLcat.pm b/lib/PublicInbox/LeiLcat.pm
index 5bd20c1f..cb5eb5b4 100644
--- a/lib/PublicInbox/LeiLcat.pm
+++ b/lib/PublicInbox/LeiLcat.pm
@@ -11,10 +11,26 @@ use PublicInbox::LeiViewText;
 use URI::Escape qw(uri_unescape);
 use PublicInbox::MID qw($MID_EXTRACT);
 
+sub lcat_folder ($$$) {
+        my ($lei, $lms, $folder) = @_;
+        $lms //= $lei->{lse}->lms // return;
+        my $folders = [ $folder];
+        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: $folder");
+        } else {
+                for my $f (@$folders) {
+                        my $fid = $lms->fid_for($f);
+                        push @{$lei->{lcat_fid}}, $fid;
+                }
+        }
+}
+
 sub lcat_imap_uri ($$) {
         my ($lei, $uri) = @_;
         my $lms = $lei->{lse}->lms or return;
-        # cf. LeiToMail->wq_atexit_child
+        # cf. LeiXsearch->lcat_dump
         if (defined $uri->uid) {
                 my $oidhex = $lms->imap_oid($lei, $uri);
                 if (ref(my $err = $oidhex)) { # art2folder error
@@ -24,17 +40,7 @@ sub lcat_imap_uri ($$) {
         } 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;
-                        }
-                }
+                lcat_folder($lei, $lms, $$uri);
         }
 }
 
@@ -44,7 +50,10 @@ sub extract_1 ($$) {
                 my $u = $1;
                 require PublicInbox::URIimap;
                 lcat_imap_uri($lei, PublicInbox::URIimap->new($u));
-                '""'; # blank query, using {lcat_blob} or {lcat
+                '""'; # blank query, using {lcat_blob} or {lcat_fid}
+        } elsif ($x =~ m!\b(maildir:.+)!i) {
+                lcat_folder($lei, undef, $1);
+                '""'; # blank query, using {lcat_blob} or {lcat_fid}
         } elsif ($x =~ m!\b([a-z]+?://\S+)!i) {
                 my $u = $1;
                 $u =~ s/[\>\]\)\,\.\;]+\z//;
@@ -147,7 +156,7 @@ sub _complete_lcat {
         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);
+        map { $match_cb->($_) } $lms->folders;
 }
 
 1;