my $maybe = pop @mods if $mods[-1] =~ /\A[0-9]+\z/;
my @need;
for my $mod (@mods) {
- eval "require $mod";
+ if ($mod eq 'Search::Xapian') {
+ if (eval { require PublicInbox::Search } &&
+ PublicInbox::Search::load_xapian()) {
+ next;
+ }
+ } elsif ($mod eq 'Search::Xapian::WritableDatabase') {
+ if (eval { require PublicInbox::SearchIdx } &&
+ PublicInbox::SearchIdx::load_xapian_writable()){
+ next;
+ }
+ } else {
+ eval "require $mod";
+ }
push @need, $mod if $@;
}
return unless @need;
my $spawn_opt = {};
for my $fd (0..2) {
my $redir = $opt->{$fd};
- next unless ref($redir);
- open my $fh, '+>', undef or die "open: $!";
- $fhref->[$fd] = $fh;
- $spawn_opt->{$fd} = fileno($fh);
- next if $fd > 0;
- $fh->autoflush(1);
- print $fh $$redir or die "print: $!";
- seek($fh, 0, SEEK_SET) or die "seek: $!";
+ my $ref = ref($redir);
+ if ($ref eq 'SCALAR') {
+ open my $fh, '+>', undef or die "open: $!";
+ $fhref->[$fd] = $fh;
+ $spawn_opt->{$fd} = $fh;
+ next if $fd > 0;
+ $fh->autoflush(1);
+ print $fh $$redir or die "print: $!";
+ seek($fh, 0, SEEK_SET) or die "seek: $!";
+ } elsif ($ref eq 'GLOB') {
+ $spawn_opt->{$fd} = $fhref->[$fd] = $redir;
+ } elsif ($ref) {
+ die "unable to deal with $ref $redir";
+ }
}
if ($run_mode == 0) {
# spawn an independent new process, like real-world use cases: