about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-04-19 23:19:37 +0000
committerEric Wong <e@yhbt.net>2020-04-20 20:18:21 +0000
commit6e07def560b211d9a1a3221862e72b7aeb4a31b3 (patch)
treeb6e3b54f928145b3f1c05bd5b0444f70f7eabd4f /lib
parent47acfe0e9d09e907393465e155e114e8fdc5f5a1 (diff)
downloadpublic-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.pm26
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;