use Socket qw(AF_UNIX SOCK_STREAM);
use PublicInbox::Syscall qw(EPOLLIN);
use PublicInbox::ProcessPipe;
+use autodie qw(socketpair);
# fields:
# sock => socket to Gcf2::loop
my $self = bless {}, __PACKAGE__;
# ensure the child process has the same @INC we do:
my $env = { PERL5LIB => join(':', @INC) };
- my ($s1, $s2);
- socketpair($s1, $s2, AF_UNIX, SOCK_STREAM, 0) or die "socketpair $!";
+ socketpair(my $s1, my $s2, AF_UNIX, SOCK_STREAM, 0);
$s1->blocking(0);
$opt->{0} = $opt->{1} = $s2;
my $cmd = [$^X, qw[-MPublicInbox::Gcf2 -e PublicInbox::Gcf2::loop]];
sub gcf2_async ($$$;$) {
my ($self, $req, $cb, $arg) = @_;
my $inflight = $self->{inflight} or return $self->close;
- PublicInbox::Git::write_all($self, $$req, \&cat_async_step, $inflight);
- push @$inflight, $req, $cb, $arg;
+ PublicInbox::Git::write_all($self, $req, \&cat_async_step, $inflight);
+ push @$inflight, \$req, $cb, $arg; # ref prevents Git.pm retries
}
# ensure PublicInbox::Git::cat_async_step never calls cat_async_retry
require PublicInbox::Gcf2Client;
PublicInbox::Gcf2Client::new();
} // 0)) { # 0: do not retry if libgit2 or Inline::C are missing
- $GCF2C->gcf2_async(\"$oid $git->{git_dir}\n", $cb, $arg);
+ $GCF2C->gcf2_async("$oid $git->{git_dir}\n", $cb, $arg);
\undef;
} else { # read-only end of git-cat-file pipe
$git->cat_async($oid, $cb, $arg);
if (!defined($ibx->{topdir}) && $GCF2C) {
if (!@{$GCF2C->{inflight} // []}) {
$oid .= " $git->{git_dir}\n";
- return $GCF2C->gcf2_async(\$oid, $cb, $arg); # true
+ return $GCF2C->gcf2_async($oid, $cb, $arg); # true
}
} elsif ($git->{epwatch}) {
return $git->async_prefetch($oid, $cb, $arg);
#!perl -w
-# Copyright (C) 2020-2021 all contributors <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
-use strict;
+use v5.12;
use PublicInbox::TestCommon;
-use Test::More;
use Cwd qw(getcwd);
+use autodie qw(open close);
use PublicInbox::Import;
use PublicInbox::DS;
PublicInbox::Import::init_bare($git_b);
my $fi_data = './t/git.fast-import-data';
my $rdr = {};
-open $rdr->{0}, '<', $fi_data or BAIL_OUT $!;
+open $rdr->{0}, '<', $fi_data;
xsys([qw(git fast-import --quiet)], { GIT_DIR => $git_a }, $rdr);
is($?, 0, 'fast-import succeeded');
my $err_f = "$tmpdir/err";
{
PublicInbox::DS->Reset;
- open my $err, '>>', $err_f or BAIL_OUT $!;
+ open my $err, '>>', $err_f;
my $gcf2c = PublicInbox::Gcf2Client::new({ 2 => $err });
- $gcf2c->gcf2_async(\"$tree $git_a\n", sub {
+ $gcf2c->gcf2_async("$tree $git_a\n", sub {
my ($bref, $oid, $type, $size, $arg) = @_;
is($oid, $tree, 'got expected OID');
is($size, 30, 'got expected length');
}, 'hi');
$gcf2c->cat_async_step($gcf2c->{inflight});
- open $err, '<', $err_f or BAIL_OUT $!;
+ open $err, '<', $err_f;
my $estr = do { local $/; <$err> };
is($estr, '', 'nothing in stderr');
my $trunc = substr($tree, 0, 39);
- $gcf2c->gcf2_async(\"$trunc $git_a\n", sub {
+ $gcf2c->gcf2_async("$trunc $git_a\n", sub {
my ($bref, $oid, $type, $size, $arg) = @_;
is(undef, $bref, 'missing bref is undef');
is($oid, $trunc, 'truncated OID printed');
}, 'bye');
$gcf2c->cat_async_step($gcf2c->{inflight});
- open $err, '<', $err_f or BAIL_OUT $!;
+ open $err, '<', $err_f;
$estr = do { local $/; <$err> };
like($estr, qr/retrying/, 'warned about retry');
# try failed alternates lookup
PublicInbox::DS->Reset;
- open $err, '>', $err_f or BAIL_OUT $!;
+ open $err, '>', $err_f;
$gcf2c = PublicInbox::Gcf2Client::new({ 2 => $err });
- $gcf2c->gcf2_async(\"$tree $git_b\n", sub {
+ $gcf2c->gcf2_async("$tree $git_b\n", sub {
my ($bref, $oid, $type, $size, $arg) = @_;
is(undef, $bref, 'missing bref from alt is undef');
$called++;
});
$gcf2c->cat_async_step($gcf2c->{inflight});
- open $err, '<', $err_f or BAIL_OUT $!;
+ open $err, '<', $err_f;
$estr = do { local $/; <$err> };
like($estr, qr/retrying/, 'warned about retry before alt update');
# now try successful alternates lookup
- open my $alt, '>>', "$git_b/objects/info/alternates" or BAIL_OUT $!;
- print $alt "$git_a/objects\n" or BAIL_OUT $!;
- close $alt or BAIL_OUT;
+ open my $alt, '>>', "$git_b/objects/info/alternates";
+ print $alt "$git_a/objects\n";
+ close $alt;
my $expect = xqx(['git', "--git-dir=$git_a", qw(cat-file tree), $tree]);
- $gcf2c->gcf2_async(\"$tree $git_a\n", sub {
+ $gcf2c->gcf2_async("$tree $git_a\n", sub {
my ($bref, $oid, $type, $size, $arg) = @_;
is($oid, $tree, 'oid match on alternates retry');
is($$bref, $expect, 'tree content matched');