X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fsolver_git.t;h=22714ae574a10002bbc4e803fc6117543ffe6128;hb=aca6555ed4696ba1f24296a63afa7450a5afde2a;hp=7f0cd999344dc52da63d00c86a4b1d2d27a48c46;hpb=0f6b0cac5bf10d036a84dbab732e8991edf56c34;p=public-inbox.git
diff --git a/t/solver_git.t b/t/solver_git.t
index 7f0cd999..22714ae5 100644
--- a/t/solver_git.t
+++ b/t/solver_git.t
@@ -1,54 +1,56 @@
-# Copyright (C) 2019-2020 all contributors
+#!perl -w
+# Copyright (C) 2019-2021 all contributors
# License: AGPL-3.0+
use strict;
-use warnings;
-use Test::More;
-use Cwd qw(abs_path);
+use v5.10.1;
use PublicInbox::TestCommon;
+use Cwd qw(abs_path);
require_git(2.6);
+use Digest::SHA qw(sha1_hex);
use PublicInbox::Spawn qw(popen_rd);
require_mods(qw(DBD::SQLite Search::Xapian Plack::Util));
-chomp(my $git_dir = `git rev-parse --git-dir 2>/dev/null`);
-plan skip_all => "$0 must be run from a git working tree" if $?;
+my $git_dir = xqx([qw(git rev-parse --git-dir)], undef, {2 => \(my $null)});
+$? == 0 or plan skip_all => "$0 must be run from a git working tree";
+chomp $git_dir;
# needed for alternates, and --absolute-git-dir is only in git 2.13+
$git_dir = abs_path($git_dir);
-use_ok "PublicInbox::$_" for (qw(Inbox V2Writable MIME Git SolverGit WWW));
+use_ok "PublicInbox::$_" for (qw(Inbox V2Writable Git SolverGit WWW));
-my ($inboxdir, $for_destroy) = tmpdir();
-my $opts = {
- inboxdir => $inboxdir,
- name => 'test-v2writable',
- version => 2,
- -primary_address => 'test@example.com',
+my ($tmpdir, $for_destroy) = tmpdir();
+my $ibx = create_inbox 'v2', version => 2,
+ indexlevel => 'medium', sub {
+ my ($im) = @_;
+ $im->add(eml_load 't/solve/0001-simple-mod.patch') or BAIL_OUT;
+ $im->add(eml_load 't/solve/0002-rename-with-modifications.patch') or
+ BAIL_OUT;
};
-my $ibx = PublicInbox::Inbox->new($opts);
-my $im = PublicInbox::V2Writable->new($ibx, 1);
-$im->{parallel} = 0;
-
-my $deliver_patch = sub ($) {
- my $mime = PublicInbox::InboxWritable::mime_from_path($_[0]) or
- die "open $_[0]: $!";
- $im->add($mime);
- $im->done;
-};
-
-$deliver_patch->('t/solve/0001-simple-mod.patch');
my $v1_0_0_tag = 'cb7c42b1e15577ed2215356a2bf925aef59cdd8d';
+my $v1_0_0_tag_short = substr($v1_0_0_tag, 0, 16);
+my $expect = '69df7d565d49fbaaeb0a067910f03dc22cd52bd0';
+
+test_lei({tmpdir => $tmpdir}, sub {
+ lei_ok('blob', '69df7d5', '-I', $ibx->{inboxdir});
+ is(sha1_hex("blob ".length($lei_out)."\0".$lei_out),
+ $expect, 'blob contents output');
+
+ # fallbacks
+ lei_ok('blob', $v1_0_0_tag, '-I', $ibx->{inboxdir});
+ lei_ok('blob', $v1_0_0_tag_short, '-I', $ibx->{inboxdir});
+});
my $git = PublicInbox::Git->new($git_dir);
$ibx->{-repo_objs} = [ $git ];
my $res;
my $solver = PublicInbox::SolverGit->new($ibx, sub { $res = $_[0] });
-open my $log, '+>>', "$inboxdir/solve.log" or die "open: $!";
-my $psgi_env = { 'psgi.errors' => *STDERR, 'psgi.url_scheme' => 'http',
+open my $log, '+>>', "$tmpdir/solve.log" or die "open: $!";
+my $psgi_env = { 'psgi.errors' => \*STDERR, 'psgi.url_scheme' => 'http',
'HTTP_HOST' => 'example.com' };
$solver->solve($psgi_env, $log, '69df7d5', {});
ok($res, 'solved a blob!');
my $wt_git = $res->[0];
is(ref($wt_git), 'PublicInbox::Git', 'got a git object for the blob');
-my $expect = '69df7d565d49fbaaeb0a067910f03dc22cd52bd0';
is($res->[1], $expect, 'resolved blob to unabbreviated identifier');
is($res->[2], 'blob', 'type specified');
is($res->[3], 4405, 'size returned');
@@ -57,12 +59,6 @@ is(ref($wt_git->cat_file($res->[1])), 'SCALAR', 'wt cat-file works');
is_deeply([$expect, 'blob', 4405],
[$wt_git->check($res->[1])], 'wt check works');
-if (0) { # TODO: check this?
- seek($log, 0, 0);
- my $z = do { local $/; <$log> };
- diag $z;
-}
-
my $oid = $expect;
for my $i (1..2) {
my $more;
@@ -87,7 +83,6 @@ $solver = PublicInbox::SolverGit->new($ibx, sub { $res = $_[0] });
$solver->solve($psgi_env, $log, $git_v2_20_1_tag, {});
is($res, undef, 'no error on a tag not in our repo');
-$deliver_patch->('t/solve/0002-rename-with-modifications.patch');
$solver = PublicInbox::SolverGit->new($ibx, sub { $res = $_[0] });
$solver->solve($psgi_env, $log, '0a92431', {});
ok($res, 'resolved without hints');
@@ -108,8 +103,9 @@ my @psgi = qw(HTTP::Request::Common Plack::Test URI::Escape Plack::Builder);
SKIP: {
require_mods(@psgi, 7 + scalar(@psgi));
use_ok($_) for @psgi;
- my $binfoo = "$inboxdir/binfoo.git";
- system(qw(git init --bare -q), $binfoo) == 0 or die "git init: $?";
+ my $binfoo = "$ibx->{inboxdir}/binfoo.git";
+ my $l = "$ibx->{inboxdir}/inbox.lock";
+ -f $l or BAIL_OUT "BUG: $l missing: $!";
require_ok 'PublicInbox::ViewVCS';
my $big_size = do {
no warnings 'once';
@@ -117,27 +113,40 @@ SKIP: {
};
my %bin = (big => $big_size, small => 1);
my %oid; # (small|big) => OID
- my $cmd = [ qw(git hash-object -w --stdin) ];
- my $env = { GIT_DIR => $binfoo };
- while (my ($label, $size) = each %bin) {
- pipe(my ($rin, $win)) or die;
- my $rout = popen_rd($cmd , $env, { 0 => $rin });
- $rin = undef;
- print { $win } ("\0" x $size) or die;
- close $win or die;
- chomp($oid{$label} = <$rout>);
- close $rout or die "$?";
+ my $lk = bless { lock_path => $l }, 'PublicInbox::Lock';
+ my $acq = $lk->lock_for_scope;
+ my $stamp = "$binfoo/stamp";
+ if (open my $fh, '<', $stamp) {
+ %oid = map { chomp; split(/=/, $_) } (<$fh>);
+ } else {
+ PublicInbox::Import::init_bare($binfoo);
+ my $cmd = [ qw(git hash-object -w --stdin) ];
+ my $env = { GIT_DIR => $binfoo };
+ open my $fh, '>', "$stamp.$$" or BAIL_OUT;
+ while (my ($label, $size) = each %bin) {
+ pipe(my ($rin, $win)) or BAIL_OUT;
+ my $rout = popen_rd($cmd , $env, { 0 => $rin });
+ $rin = undef;
+ print { $win } ("\0" x $size) or BAIL_OUT;
+ close $win or BAIL_OUT;
+ chomp(my $x = <$rout>);
+ close $rout or BAIL_OUT "$?";
+ print $fh "$label=$x\n" or BAIL_OUT;
+ $oid{$label} = $x;
+ }
+ close $fh or BAIL_OUT;
+ rename("$stamp.$$", $stamp) or BAIL_OUT;
}
-
+ undef $acq;
# ensure the PSGI frontend (ViewVCS) works:
my $name = $ibx->{name};
my $cfgpfx = "publicinbox.$name";
- my $cfgpath = "$inboxdir/httpd-config";
+ my $cfgpath = "$tmpdir/httpd-config";
open my $cfgfh, '>', $cfgpath or die;
print $cfgfh <{address};
- inboxdir = $inboxdir
+ address = $ibx->{-primary_address}
+ inboxdir = $ibx->{inboxdir}
coderepo = public-inbox
coderepo = binfoo
url = http://example.com/$name
@@ -173,7 +182,9 @@ EOF
is($res->code, 404, 'failure with null OID');
$res = $cb->(GET("/$name/$v1_0_0_tag/s/"));
- is($res->code, 200, 'shows commit');
+ is($res->code, 200, 'shows commit (unabbreviated)');
+ $res = $cb->(GET("/$name/$v1_0_0_tag_short/s/"));
+ is($res->code, 200, 'shows commit (abbreviated)');
while (my ($label, $size) = each %bin) {
$res = $cb->(GET("/$name/$oid{$label}/s/"));
is($res->code, 200, "$label binary file");
@@ -190,10 +201,10 @@ EOF
require_mods(qw(Plack::Test::ExternalServer), 7);
my $env = { PI_CONFIG => $cfgpath };
my $sock = tcp_server() or die;
- my ($out, $err) = map { "$inboxdir/std$_.log" } qw(out err);
+ my ($out, $err) = map { "$tmpdir/std$_.log" } qw(out err);
my $cmd = [ qw(-httpd -W0), "--stdout=$out", "--stderr=$err" ];
my $td = start_script($cmd, $env, { 3 => $sock });
- my ($h, $p) = ($sock->sockhost, $sock->sockport);
+ my ($h, $p) = tcp_host_port($sock);
local $ENV{PLACK_TEST_EXTERNALSERVER_URI} = "http://$h:$p";
Plack::Test::ExternalServer::test_psgi(client => $client);
}