X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fgit.t;h=d4694f44c2d98393458a856c7b7dabe502c9acdf;hb=3c313f9034aac96182e2efdc2f92c40803626f32;hp=4532921ddea305d16078654614ac313b5a7b000b;hpb=b140961420c0f240c9c3f55e83c52cfc3efa709d;p=public-inbox.git
diff --git a/t/git.t b/t/git.t
index 4532921d..d4694f44 100644
--- a/t/git.t
+++ b/t/git.t
@@ -1,32 +1,26 @@
-# Copyright (C) 2015 all contributors
-# License: AGPL-3.0+ (https://www.gnu.org/licenses/agpl-3.0.txt)
+# Copyright (C) 2015-2019 all contributors
+# License: AGPL-3.0+
use strict;
use warnings;
use Test::More;
-use File::Temp qw/tempdir/;
-my $dir = tempdir(CLEANUP => 1);
-use Cwd qw/getcwd/;
+use PublicInbox::TestCommon;
+my ($dir, $for_destroy) = tmpdir();
+use PublicInbox::Spawn qw(popen_rd);
+
+use_ok 'PublicInbox::Git';
-use_ok 'PublicInbox::GitCatFile';
{
is(system(qw(git init -q --bare), $dir), 0, 'created git directory');
- my @cmd = ('git', "--git-dir=$dir", 'fast-import', '--quiet');
-
- my $fi_data = getcwd().'/t/git.fast-import-data';
+ my $fi_data = './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;
+ local $ENV{GIT_DIR} = $dir;
+ system("git fast-import --quiet <$fi_data");
is($?, 0, 'fast-import succeeded');
}
{
- my $gcf = PublicInbox::GitCatFile->new($dir);
+ my $gcf = PublicInbox::Git->new($dir);
+ is($gcf->modified, 749520000, 'modified time detected from commit');
my $f = 'HEAD:foo.txt';
my @x = $gcf->check($f);
is(scalar @x, 3, 'returned 3 element array for existing file');
@@ -37,98 +31,78 @@ use_ok 'PublicInbox::GitCatFile';
my $raw = $gcf->cat_file($f);
is($x[2], length($$raw), 'length matches');
- {
- my $size;
- my $rv = $gcf->cat_file($f, sub {
- my ($in, $left) = @_;
- $size = $$left;
- 'nothing'
- });
- is($rv, 'nothing', 'returned from callback without reading');
- is($size, $x[2], 'set size for callback correctly');
- }
-
- eval { $gcf->cat_file($f, sub { die 'OMG' }) };
- like($@, qr/\bOMG\b/, 'died in callback propagated');
is(${$gcf->cat_file($f)}, $$raw, 'not broken after failures');
-
- {
- my ($buf, $r);
- my $rv = $gcf->cat_file($f, sub {
- my ($in, $left) = @_;
- $r = read($in, $buf, 2);
- $$left -= $r;
- 'blah'
- });
- is($r, 2, 'only read 2 bytes');
- is($buf, '--', 'partial read succeeded');
- is($rv, 'blah', 'return value propagated');
- }
is(${$gcf->cat_file($f)}, $$raw, 'not broken after partial read');
}
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 $big_data = './COPYING';
ok(-r $big_data, 'COPYING readable');
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 = do {
+ local $ENV{GIT_DIR} = $dir;
+ `git hash-object -w --stdin <$big_data`;
+ };
is(0, $?, 'hashed object successfully');
chomp $buf;
- my $gcf = PublicInbox::GitCatFile->new($dir);
+ my $gcf = PublicInbox::Git->new($dir);
my $rsize;
- is($gcf->cat_file($buf, sub {
- $rsize = ${$_[1]};
- 'x';
- }), 'x', 'checked input');
- is($rsize, $size, 'got correct size on big file');
-
my $x = $gcf->cat_file($buf, \$rsize);
is($rsize, $size, 'got correct size ref on big file');
is(length($$x), $size, 'read correct number of bytes');
- my $rline;
- $gcf->cat_file($buf, sub {
- my ($in, $left) = @_;
- $rline = <$in>;
- $$left -= length($rline);
- });
- {
- open my $fh, '<', $big_data or die "open failed: $!\n";
- is($rline, <$fh>, 'first line matches');
- };
+ my $ref = $gcf->qx(qw(cat-file blob), $buf);
+ my @ref = $gcf->qx(qw(cat-file blob), $buf);
+ my $nl = scalar @ref;
+ ok($nl > 1, "qx returned array length of $nl");
- my $all;
- $gcf->cat_file($buf, sub {
- my ($in, $left) = @_;
- my $x = read($in, $all, $$left);
- $$left -= $x;
- });
- {
- open my $fh, '<', $big_data or die "open failed: $!\n";
- local $/;
- is($all, <$fh>, 'entire read matches');
- };
+ $gcf->qx(qw(repack -adq));
+ ok($gcf->packed_bytes > 0, 'packed size is positive');
}
+if ('alternates reloaded') {
+ my ($alt, $alt_obj) = tmpdir();
+ 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');
+
+ ok(!$gcf->cleanup, 'cleanup can expire');
+ ok(!$gcf->cleanup, 'cleanup idempotent');
+
+ my $t = $gcf->modified;
+ ok($t <= time, 'repo not modified in the future');
+ isnt($t, 0, 'repo not modified in 1970')
+}
+
+use_ok 'PublicInbox::Git', qw(git_unquote git_quote);
+my $s;
+is("foo\nbar", git_unquote($s = '"foo\\nbar"'), 'unquoted newline');
+is("Eléanor", git_unquote($s = '"El\\303\\251anor"'), 'unquoted octal');
+is(git_unquote($s = '"I\"m"'), 'I"m', 'unquoted dq');
+is(git_unquote($s = '"I\\m"'), 'I\\m', 'unquoted backslash');
+
+is(git_quote($s = "Eléanor"), '"El\\303\\251anor"', 'quoted octal');
+is(git_quote($s = "hello\"world"), '"hello\"world"', 'quoted dq');
+is(git_quote($s = "hello\\world"), '"hello\\\\world"', 'quoted backslash');
+is(git_quote($s = "hello\nworld"), '"hello\\nworld"', 'quoted LF');
+
done_testing();