use Fcntl qw(FD_CLOEXEC F_SETFD F_GETFD :seek);
use POSIX qw(dup2);
use IO::Socket::INET;
-our @EXPORT = qw(tmpdir tcp_server tcp_connect require_git
+our @EXPORT = qw(tmpdir tcp_server tcp_connect require_git require_mods
run_script start_script key2sub);
sub tmpdir (;$) {
1;
}
+sub require_mods {
+ my @mods = @_;
+ my $maybe = pop @mods if $mods[-1] =~ /\A[0-9]+\z/;
+ my @need;
+ for my $mod (@mods) {
+ 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 $m = join(', ', @need)." missing for $0";
+ Test::More::skip($m, $maybe) if $maybe;
+ Test::More::plan(skip_all => $m)
+}
+
sub key2script ($) {
my ($key) = @_;
return $key if (index($key, '/') >= 0);
next unless ref($redir);
open my $fh, '+>', undef or die "open: $!";
$fhref->[$fd] = $fh;
- $spawn_opt->{$fd} = fileno($fh);
+ $spawn_opt->{$fd} = $fh;
next if $fd > 0;
$fh->autoflush(1);
print $fh $$redir or die "print: $!";