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_imap_uri ($$) {
+ my ($lei, $uri) = @_;
+ my $lms = $lei->{lse}->lms or return;
+ # 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;
+ }
+ }
+ }
}
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
+ } 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;
$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;
}
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;
$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
$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;