use File::Temp qw/tempdir/;
my $dir = tempdir('pi-git-XXXXXX', TMPDIR => 1, CLEANUP => 1);
use Cwd qw/getcwd/;
+use PublicInbox::Spawn qw(popen_rd);
+eval { require IPC::Run } or plan skip_all => 'IPC::Run missing';
use_ok 'PublicInbox::Git';
+
{
is(system(qw(git init -q --bare), $dir), 0, 'created git directory');
- my @cmd = ('git', "--git-dir=$dir", 'fast-import', '--quiet');
+ my $cmd = [ 'git', "--git-dir=$dir", 'fast-import', '--quiet' ];
my $fi_data = getcwd().'/t/git.fast-import-data';
ok(-r $fi_data, "fast-import data readable (or run test at top level)");
- my $pid = fork;
- defined $pid or die "fork failed: $!\n";
- if ($pid == 0) {
- open STDIN, '<', $fi_data or die "open $fi_data: $!\n";
- exec @cmd;
- die "failed exec: ",join(' ', @cmd),": $!\n";
- }
- waitpid $pid, 0;
+ IPC::Run::run($cmd, '<', $fi_data);
is($?, 0, 'fast-import succeeded');
}
}
if (1) {
- use POSIX qw(dup2);
- my @cmd = ('git', "--git-dir=$dir", qw(hash-object -w --stdin));
+ my $cmd = [ 'git', "--git-dir=$dir", qw(hash-object -w --stdin) ];
# need a big file, use the AGPL-3.0 :p
my $big_data = getcwd().'/COPYING';
my $size = -s $big_data;
ok($size > 8192, 'file is big enough');
- my ($r, $w);
- ok(pipe($r, $w), 'created pipe');
-
- my $pid = fork;
- defined $pid or die "fork failed: $!\n";
- if ($pid == 0) {
- close $r;
- open STDIN, '<', $big_data or die "open $big_data: $!\n";
- dup2(fileno($w), 1);
- exec @cmd;
- die "failed exec: ",join(' ', @cmd),": $!\n";
- }
- close $w;
- my $n = read $r, my $buf, 41;
- waitpid $pid, 0;
+ my $buf = '';
+ IPC::Run::run($cmd, '<', $big_data, '>', \$buf);
is(0, $?, 'hashed object successfully');
chomp $buf;
ok($gcf->packed_bytes > 0, 'packed size is positive');
}
+if ('alternates reloaded') {
+ my $alt = tempdir('pi-git-XXXXXX', TMPDIR => 1, CLEANUP => 1);
+ my @cmd = ('git', "--git-dir=$alt", qw(hash-object -w --stdin));
+ is(system(qw(git init -q --bare), $alt), 0, 'create alt directory');
+ open my $fh, '<', "$alt/config" or die "open failed: $!\n";
+ my $rd = popen_rd(\@cmd, {}, { 0 => fileno($fh) } );
+ close $fh or die "close failed: $!";
+ chomp(my $remote = <$rd>);
+ my $gcf = PublicInbox::Git->new($dir);
+ is($gcf->cat_file($remote), undef, "remote file not found");
+ open $fh, '>>', "$dir/objects/info/alternates" or
+ die "open failed: $!\n";
+ print $fh "$alt/objects" or die "print failed: $!\n";
+ close $fh or die "close failed: $!";
+ my $found = $gcf->cat_file($remote);
+ open $fh, '<', "$alt/config" or die "open failed: $!\n";
+ my $config = eval { local $/; <$fh> };
+ is($$found, $config, 'alternates reloaded');
+}
+
done_testing();