use strict;
use warnings;
-use Cwd qw/abs_path/;
+use Cwd qw/abs_path/;
use File::Temp qw/tempfile/;
-use Test::More tests => 9 * 5;
+use Test::More;
use App::Rgit;
+use lib 't/lib';
+use App::Rgit::TestUtils qw/can_run_git/;
+
+my ($can_run, $reason) = can_run_git;
+if ($can_run) {
+ plan tests => 9 * 5;
+} else {
+ plan skip_all => "Can't run the mock git executable on this system: $reason";
+}
+
my @expected = (
([ [ qw/%n %g %w %b %%/ ] ]) x 5
);
-local $ENV{GIT_DIR} = 't';
+local $ENV{GIT_DIR} = 't';
local $ENV{GIT_EXEC_PATH} = abs_path('t/bin/git');
for my $cmd (qw/daemon gui help init version/) {
my ($fh, $filename) = tempfile(UNLINK => 1);
+
my $ar = App::Rgit->new(
git => $ENV{GIT_EXEC_PATH},
root => $ENV{GIT_DIR},
cmd => $cmd,
- args => [ abs_path($filename), $cmd, qw/%n %g %w %b %%/ ]
+ args => [ abs_path($filename), $cmd, qw/%n %g %w %b %%/ ],
);
- isnt($ar, undef, "once $cmd has a defined object");
+ isa_ok $ar, 'App::Rgit', "once $cmd is an App::Rgit object";
+
my $exit = $ar->run;
- is($exit, 0, "once $cmd returned 0");
+ is $exit, 0, "once $cmd returned 0";
+
my @lines = sort split /\n/, do { local $/; <$fh> };
- is(@lines, 1, "once $cmd visited only one repo");
+ is @lines, 1, "once $cmd visited only one repo";
+
my $r = [ split /\|/, defined $lines[0] ? $lines[0] : '' ];
my $e = [ $cmd, qw/%n %g %w %b %%/ ];
s/[\r\n]*$// for @$r;
- is($r->[$_], $e->[$_], "once $cmd argument $_ is ok")
- for 0 .. 5;
+ for (0 .. 5) {
+ is $r->[$_], $e->[$_], "once $cmd argument $_ is ok";
+ }
}
--- /dev/null
+package App::Rgit::TestUtils;
+
+use strict;
+use warnings;
+
+use Cwd qw/abs_path/;
+use File::Temp qw/tempfile/;
+use POSIX qw/WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG SIGINT SIGQUIT/;
+
+BEGIN {
+ no warnings 'redefine';
+ *WIFEXITED = sub { 1 } unless eval { WIFEXITED(0); 1 };
+ *WEXITSTATUS = sub { shift() >> 8 } unless eval { WEXITSTATUS(0); 1 };
+ *WIFSIGNALED = sub { shift() & 127 } unless eval { WIFSIGNALED(0); 1 };
+}
+
+use base qw/Exporter/;
+
+our @EXPORT_OK = (qw/can_run_git/);
+
+sub can_run_git {
+ my ($fh, $filename) = tempfile(UNLINK => 1);
+
+ my @ret = (1, '');
+
+CHECK:
+ {
+ my @args = (
+ abs_path($filename),
+ 'version',
+ );
+
+ my $git = 't/bin/git';
+ if ($^O eq 'MSWin32') {
+ unless (-x $git) {
+ $git .= '.bat';
+ unless (-x $git) {
+ @ret = (0, "no $git executable");
+ last CHECK;
+ }
+ }
+ } else {
+ unless (-x $git) {
+ @ret = (0, "no $git executable");
+ last CHECK;
+ }
+ }
+
+ system { $git } $git, @args;
+
+ if ($? == -1) {
+ @ret = (0, $! || "unknown");
+ last CHECK;
+ }
+
+ my $status;
+ $status = WEXITSTATUS($?) if WIFEXITED($?);
+
+ if (WIFSIGNALED($?)) {
+ @ret = (0, 'process recieved signal ' . WTERMSIG($?));
+ } elsif ($status) {
+ @ret = (0, "process exited with code $status");
+ }
+ }
+
+ return wantarray ? @ret : $ret[0];
+}
+
+1;