6 use Cwd qw/cwd abs_path/;
7 use File::Spec::Functions qw/catdir catfile/;
8 use File::Temp qw/tempfile tempdir/;
10 use Test::More tests => 2 + 2 * 4 + 12 * (3 + 1 + 3 + 6);
12 use App::Rgit::Utils qw/:codes/;
17 use App::Rgit::Policy::Callback;
20 my ($tree, $prefix) = @_;
22 my $r = delete $tree->{_};
23 while (my ($d, $v) = each %$tree) {
25 my $dir = catdir $prefix, $d;
26 mkdir $dir or die "mkdir($dir): $!";
27 my @r = build($v, $dir);
30 ref eq 'main' ? @{$_}[1 .. 3]
31 : map { catdir($d, $_) } @{$_}[1 .. 3]
34 my $file = catfile($prefix, $d);
35 open my $fh, '>', $file or die "open($file): $!";
40 return $r ? bless $r, 'main' : @ret;
45 refs => { dummy => 1 },
46 objects => { dummy => 1 },
51 return $bare ? [ $n, "$n.git", "$n.git", "$n.git" ]
52 : [ $n, catdir($n, '.git'), $n, "$n.git" ]
55 my $tmpdir = tempdir(CLEANUP => 1);
57 chdir $tmpdir or die "chdir($tmpdir): $!";
58 my @expected = sort { $a->[1] cmp $b->[1] } build({
66 refs => { dummy => 1 },
77 refs => { dummy => 1 },
78 objects => { dummy => 1 },
87 chdir $cwd or die "chdir($cwd): $!";
89 is(@expected, 3, 'only three valid git repos');
90 is(grep({ ref eq 'ARRAY' } @expected), 3, 'all of them are array references');
94 map({ catdir($tmpdir, $_) } @{$_}[1 .. 3]),
100 my ($cmd, $exp) = @_;
101 my ($fh, $filename) = tempfile(UNLINK => 1);
102 my $policy = App::Rgit::Policy->new(
103 @_ > 2 ? (name => 'Callback', callback => $_[2])
104 : (name => 'Default')
106 my $ar = App::Rgit->new(
107 git => abs_path('t/bin/git'),
110 args => [ abs_path($filename), $cmd, qw/%n %g %w %b %G %W %B %R %%n %x/ ],
113 isnt($ar, undef, "each $cmd has a defined object");
115 my $fail = $cmd eq 'FAIL' ? 1 : 0;
117 ($exit, undef) = $ar->run;
121 is($exit, $fail, "each $cmd returned $fail");
122 my @lines = split /\n/, do { local $/; <$fh> };
123 my $res = [ map [ split /\|/, $_ ], @lines ];
124 $exp = [ map [ $cmd, @$_ ], @$exp ];
125 for my $i (0 .. $#$exp) {
128 isnt($r, undef, "each $cmd visited repository $i");
131 skip 'didn\'t visited that repo' => 10 unless defined $r;
132 s/[\r\n]*$// for @$r;
133 is($r->[$_], $e->[$_], "each $cmd argument $_ for repository $i is ok")
139 try 'commit', [ @expected ];
140 try 'FAIL', [ $expected[0] ];
141 try 'FAIL', [ @expected ],
144 try 'FAIL', [ map { ($expected[$_]) x 2 } 0 .. $#expected ],
145 sub { my $ret = $c ? undef : REDO; $c = 1 - $c; $ret };