PublicInbox::LeiOverview->new($self) or return;
my $opt = $self->{opt};
my ($xj, $mj) = split(/,/, $opt->{jobs} // '');
- if (defined($xj) && $xj ne '' && $xj !~ /\A[1-9][0-9]*\z/) {
- return $self->fail("`$xj' search jobs must be >= 1");
- }
+ (defined($xj) && $xj ne '' && $xj !~ /\A[1-9][0-9]*\z/) and
+ die "`$xj' search jobs must be >= 1\n";
my $lxs = $self->{lxs};
$xj ||= $lxs->concurrency($opt); # allow: "--jobs ,$WRITER_ONLY"
my $nproc = $lxs->detect_nproc || 1; # don't memoize, schedtool(1) exists
$xj = $nproc if $xj > $nproc;
$lxs->{-wq_nr_workers} = $xj;
- if (defined($mj) && $mj !~ /\A[1-9][0-9]*\z/) {
- return $self->fail("`$mj' writer jobs must be >= 1");
- }
+ (defined($mj) && $mj !~ /\A[1-9][0-9]*\z/) and
+ die "`$mj' writer jobs must be >= 1\n";
my $l2m = $self->{l2m};
# we use \1 (a ref) to distinguish between default vs. user-supplied
if ($l2m && grep { $opt->{$_} //= \1 } (qw(mail-sync import-remote
# descending docid order is cheapest, MUA controls sorting order
$self->{mset_opt}->{relevance} //= -2 if $l2m || $opt->{threads};
+
+ my $tot = $self->{mset_opt}->{total} //= $self->{opt}->{limit} // 10000;
+ $self->{mset_opt}->{limit} = $tot > 10000 ? 10000 : $tot;
+ $self->{mset_opt}->{offset} //= 0;
+ $self->{mset_opt}->{threads} //= $opt->{threads};
+
if ($self->{net}) {
require PublicInbox::LeiAuth;
$self->{auth} = PublicInbox::LeiAuth->new
}
sub qstr_add { # PublicInbox::InputPipe::consume callback for --stdin
- my ($self) = @_; # $_[1] = $rbuf
- if (defined($_[1])) {
- $_[1] eq '' and return eval {
- $self->fchdir or return;
- $self->{mset_opt}->{q_raw} = $self->{mset_opt}->{qstr};
- $self->{lse}->query_approxidate($self->{lse}->git,
- $self->{mset_opt}->{qstr});
- _start_query($self);
- };
- $self->{mset_opt}->{qstr} .= $_[1];
- } else {
- $self->fail("error reading stdin: $!");
- }
+ my ($lei) = @_; # $_[1] = $rbuf
+ $_[1] // $lei->fail("error reading stdin: $!");
+ return $lei->{mset_opt}->{qstr} .= $_[1] if $_[1] ne '';
+ eval {
+ $lei->fchdir;
+ $lei->{mset_opt}->{q_raw} = $lei->{mset_opt}->{qstr};
+ $lei->{lse}->query_approxidate($lei->{lse}->git,
+ $lei->{mset_opt}->{qstr});
+ _start_query($lei);
+ };
+ $lei->fail($@) if $@;
}
sub lxs_prepare {
}
# --external is enabled by default, but allow --no-external
if ($opt->{external} //= 1) {
- my %x;
- for my $loc (@{$opt->{exclude} // []}) {
- my @l = $self->get_externals($loc, 1) or return;
- $x{$_} = 1 for @l;
- }
- my $ne = $self->externals_each(\&prep_ext, $lxs, \%x);
+ my $ex = $self->canonicalize_excludes($opt->{exclude});
+ $self->externals_each(\&prep_ext, $lxs, $ex);
$opt->{remote} //= !($lxs->locals - $opt->{'local'});
- if ($opt->{'local'}) {
- $lxs->{remotes} = \@iremotes if !$opt->{remote};
- } else {
- $lxs->{locals} = \@ilocals;
- }
+ $lxs->{locals} = \@ilocals if !$opt->{'local'};
+ $lxs->{remotes} = \@iremotes if !$opt->{remote};
}
}
($lxs->locals || $lxs->remotes) ? ($self->{lxs} = $lxs) :
- $self->fail('no local or remote inboxes to search');
+ die("no local or remote inboxes to search\n");
}
# the main "lei q SEARCH_TERMS" method
my $lxs = lxs_prepare($self) or return;
$self->ale->refresh_externals($lxs, $self);
my $opt = $self->{opt};
- my %mset_opt = map { $_ => $opt->{$_} } qw(threads limit offset);
+ my %mset_opt;
$mset_opt{asc} = $opt->{'reverse'} ? 1 : 0;
- $mset_opt{limit} //= 10000;
if (defined(my $sort = $opt->{'sort'})) {
if ($sort eq 'relevance') {
$mset_opt{relevance} = 1;
# shell completion helper called by lei__complete
sub _complete_q {
my ($self, @argv) = @_;
- my $ext = qr/\A(?:-I|(?:--(?:include|exclude|only)))\z/;
my @cur;
+ my $cb = $self->lazy_cb(qw(forget-external _complete_));
while (@argv) {
- if ($argv[-1] =~ $ext) {
- my @c = $self->_complete_forget_external(@cur);
+ if ($argv[-1] =~ /\A(?:-I|(?:--(?:include|exclude|only)))\z/) {
+ my @c = $cb->($self, @cur);
# try basename match:
if (scalar(@cur) == 1 && index($cur[0], '/') < 0) {
my $all = $self->externals_each;