diff options
author | Eric Wong <e@yhbt.net> | 2020-04-19 23:19:37 +0000 |
---|---|---|
committer | Eric Wong <e@yhbt.net> | 2020-04-20 20:18:21 +0000 |
commit | 6e07def560b211d9a1a3221862e72b7aeb4a31b3 (patch) | |
tree | b6e3b54f928145b3f1c05bd5b0444f70f7eabd4f /lib | |
parent | 47acfe0e9d09e907393465e155e114e8fdc5f5a1 (diff) | |
download | public-inbox-6e07def560b211d9a1a3221862e72b7aeb4a31b3.tar.gz |
Barely noticeable on Linux, but this gives a 1-2% speedup on a FreeBSD 11.3 VM and lets us use built-in redirects rather than relying on /bin/sh.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/PublicInbox/TestCommon.pm | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/lib/PublicInbox/TestCommon.pm b/lib/PublicInbox/TestCommon.pm index e9efbac7..b50871e8 100644 --- a/lib/PublicInbox/TestCommon.pm +++ b/lib/PublicInbox/TestCommon.pm @@ -9,7 +9,7 @@ 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 require_mods - run_script start_script key2sub); + run_script start_script key2sub xsys xqx); sub tmpdir (;$) { my ($base) = @_; @@ -87,7 +87,7 @@ sub require_mods { sub key2script ($) { my ($key) = @_; - return $key if (index($key, '/') >= 0); + return $key if ($key eq 'git' || index($key, '/') >= 0); # n.b. we may have scripts which don't start with "public-inbox" in # the future: $key =~ s/\A([-\.])/public-inbox$1/; @@ -244,6 +244,28 @@ sub run_script ($;$$) { sub wait_for_tail () { sleep(2) } +# like system() built-in, but uses spawn() for env/rdr + vfork +sub xsys { + my ($cmd, $env, $rdr) = @_; + if (ref($cmd)) { + $rdr ||= {}; + } else { + $cmd = [ @_ ]; + $env = undef; + $rdr = {}; + } + run_script($cmd, $env, { %$rdr, run_mode => 0 }); + $? >> 8 +} + +# like `backtick` or qx{} op, but uses spawn() for env/rdr + vfork +sub xqx { + my ($cmd, $env, $rdr) = @_; + $rdr //= {}; + run_script($cmd, $env, { %$rdr, run_mode => 0, 1 => \(my $out) }); + wantarray ? split(/^/m, $out) : $out; +} + sub start_script { my ($cmd, $env, $opt) = @_; my ($key, @argv) = @$cmd; |