]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LeiLcat.pm
www_stream: sh-friendly .onion URLs wrapping
[public-inbox.git] / lib / PublicInbox / LeiLcat.pm
index f10452becedde37ed547f3d3821d4acd4b822650..9d95e899c2d4888c1b0166eec298d96a19a673b2 100644 (file)
@@ -9,27 +9,55 @@ use strict;
 use v5.10.1;
 use PublicInbox::LeiViewText;
 use URI::Escape qw(uri_unescape);
-use URI;
 use PublicInbox::MID qw($MID_EXTRACT);
 
-sub lcat_redispatch {
-       my ($lei, $out, $op_p) = @_;
-       my $l = bless { %$lei }, ref($lei);
-       delete $l->{sock};
-       $l->{''} = $op_p; # daemon only
-       eval {
-               $l->qerr("# updating $out");
-               up1($l, $out);
-               $l->qerr("# $out done");
-       };
-       $l->err($@) if $@;
+sub lcat_folder ($$$) {
+       my ($lei, $lms, $folder) = @_;
+       $lms //= $lei->lms or 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->lms or return;
+       # cf. LeiXsearch->lcat_dump
+       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 {
+               lcat_folder($lei, $lms, $$uri);
+       }
 }
 
 sub extract_1 ($$) {
        my ($lei, $x) = @_;
-       if ($x =~ m!\b([a-z]+?://\S+)!i) {
+       if ($x =~ m!\b(imaps?://[^>]+)!i) {
+               my $u = $1;
+               require PublicInbox::URIimap;
+               lcat_imap_uri($lei, PublicInbox::URIimap->new($u));
+               '""'; # 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//;
+               require URI;
                $u = URI->new($u);
                my $p = $u->path;
                my $term;
@@ -57,6 +85,9 @@ sub extract_1 ($$) {
                $1;
        } elsif ($x =~ /\bid:(\S+)/) { # notmuch convention
                "mid:$1";
+       } elsif ($x =~ /\bblob:([0-9a-f]{7,})\b/) {
+               push @{$lei->{lcat_blob}}, $1; # cf. LeiToMail->wq_atexit_child
+               '""'; # blank query
        } else {
                undef;
        }
@@ -82,9 +113,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;
@@ -99,9 +128,8 @@ sub _stdin { # PublicInbox::InputPipe::consume callback for --stdin
 sub lei_lcat {
        my ($lei, @argv) = @_;
        my $lxs = $lei->lxs_prepare or return;
-       $lei->ale->refresh_externals($lxs);
-       my $sto = $lei->_lei_store(1);
-       $lei->{lse} = $sto->search;
+       $lei->ale->refresh_externals($lxs, $lei);
+       $lei->_lei_store(1);
        my $opt = $lei->{opt};
        my %mset_opt = map { $_ => $opt->{$_} } qw(threads limit offset);
        $mset_opt{asc} = $opt->{'reverse'} ? 1 : 0;
@@ -109,7 +137,7 @@ sub lei_lcat {
        $opt->{sort} //= 'relevance';
        $mset_opt{relevance} = 1;
        $lei->{mset_opt} = \%mset_opt;
-       $opt->{'format'} //= 'mboxrd' unless defined($opt->{output});
+       $opt->{'format'} //= 'text' unless defined($opt->{output});
        if ($lei->{opt}->{stdin}) {
                return $lei->fail(<<'') if @argv;
 no args allowed on command-line with --stdin
@@ -122,4 +150,11 @@ no args allowed on command-line with --stdin
        $lei->_start_query;
 }
 
+sub _complete_lcat {
+       my ($lei, @argv) = @_;
+       my $lms = $lei->lms or return;
+       my $match_cb = $lei->complete_url_prepare(\@argv);
+       map { $match_cb->($_) } $lms->folders;
+}
+
 1;