/usr/share/perl5/Test/Git.pm is in libgit-repository-perl 1.317-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 | package Test::Git;
$Test::Git::VERSION = '1.317';
use strict;
use warnings;
use Exporter;
use Test::Builder;
use Git::Repository; # 1.15
use File::Temp qw( tempdir );
use File::Spec::Functions qw( catdir );
use Git::Repository::Util qw( cmp_git );
use Cwd qw( cwd );
use Carp;
our @ISA = qw( Exporter );
our @EXPORT = qw( has_git test_repository );
my $Test = Test::Builder->new();
sub has_git {
my ( $version, @options ) = ( ( grep !ref, @_ )[0], grep ref, @_ );
# check some git is present
$Test->skip_all('Default git binary not found in PATH')
if !Git::Repository::Command::_is_git('git');
# check it's at least some minimum version
my $git_version = Git::Repository->version(@options);
$Test->skip_all(
"Test script requires git >= $version (this is only $git_version)")
if $version && Git::Repository->version_lt( $version, @options );
}
sub test_repository {
my %args = @_;
croak "Can't use both 'init' and 'clone' parameters"
if exists $args{init} && exists $args{clone};
# setup some default values
my $temp = $args{temp} || [ CLEANUP => 1 ]; # File::Temp options
my $init = $args{init} || []; # git init options
my $opts = $args{git} || {}; # Git::Repository options
my $safe = { %$opts, fatal => [] }; # ignore 'fatal' settings
my $clone = $args{clone}; # git clone options
# version check
my $bad_version;
my $git_version = Git::Repository->version($safe);
if ($clone) {
if (
cmp_git( $git_version, '1.6.2.rc0' ) < 0
|| ( cmp_git( '1.7.0.rc1', $git_version ) <= 0
&& cmp_git( $git_version, '1.7.0.2' ) <= 0 )
)
{
$bad_version = "test_repository( clone => ... ) requires git >= 1.6.2.rc0 and 1.7.0.rc1 < git < 1.7.0.2 (this is $git_version)";
}
}
elsif ( cmp_git( $git_version, '1.4.0' ) <= 0 ) {
$bad_version = "test_repository( init => ... ) requires git >= 1.4.0 (this is only $git_version)";
}
croak $bad_version if $bad_version;
# create a temporary directory to host our repository
my $dir = tempdir(@$temp);
my $cwd = { cwd => $dir }; # option to chdir there
# create the git repository there
unshift @$init,
Git::Repository->version_lt('1.5.0.rc1') ? 'init-db' : 'init';
my @cmd = $clone ? ( clone => @$clone, $dir ) : ( @$init, $cwd );
Git::Repository->run( @cmd, $safe );
# create the Git::Repository object
my $gitdir = Git::Repository->run( qw( rev-parse --git-dir ), $cwd );
return Git::Repository->new( git_dir => catdir( $dir, $gitdir ), $opts );
}
1;
__END__
=head1 NAME
Test::Git - Helper functions for test scripts using Git
=head1 SYNOPSIS
use Test::More;
use Test::Git;
# check there is a git binary available, or skip all
has_git();
# check there is a minimum version of git available, or skip all
has_git( '1.6.5' );
# check the git we want to test has a minimum version, or skip all
has_git( '1.6.5', { git => '/path/to/alternative/git' } );
# normal plan
plan tests => 2;
# create a new, empty repository in a temporary location
# and return a Git::Repository object
my $r = test_repository();
# clone an existing repository in a temporary location
# and return a Git::Repository object
my $c = test_repository( clone => [ $url ] );
# run some tests on the repository
...
=head1 DESCRIPTION
L<Test::Git> provides a number of helpful functions when running test
scripts that require the creation and management of a Git repository.
=head1 EXPORTED FUNCTIONS
=head2 has_git
has_git( $version, \%options );
Checks if there is a git binary available, or skips all tests.
If the optional L<$version> argument is provided, also checks if the
available git binary has a version greater or equal to C<$version>.
This function also accepts an option hash of the same kind as those
accepted by L<Git::Repository> and L<Git::Repository::Command>.
This function must be called before C<plan()>, as it performs a B<skip_all>
if requirements are not met.
Note that the C<test_requires_git> function provided by the
L<Test::Requires::Git> module is much more flexible.
=head2 test_repository
test_repository( %options );
Creates a new empty git repository in a temporary location, and returns
a L<Git::Repository> object pointing to it.
This function takes options as a hash. Each key will influence a
different part of the creation process.
The keys are:
=over 4
=item temp
Array reference containing parameters to L<File::Temp> C<tempdir> function.
Default: C<<[ CLEANUP => 1 ]>>
=item init
Array reference containing parameters to C<git init>.
Must not contain the target directory parameter, which is provided
by C<test_repository()> (via L<File::Temp>).
Default: C<[]>
The C<init> option is only supported with Git versions higher or
equal to 1.6.2.rc0.
=item clone
Array reference containing parameters to C<git clone>.
Must not contain the target directory parameter, which is provided
by C<test_repository()> (via L<File::Temp>).
Note that C<clone> and C<init> are mutually exclusive and that
C<test_repository()> will croak if both are provided.
This option has no default value, since at least a Git URL must be
provided to the C<clone> option.
The C<clone> option is only supported with Git versions higher or
equal to 1.6.2.rc0.
=item git
Hash reference containing options for L<Git::Repository>.
Default: C<{}>
=back
This call is the equivalent of the default call with no options:
test_repository(
temp => [ CLEANUP => 1 ], # File::Temp::tempdir options
init => [], # git init options
git => {}, # Git::Repository options
);
To create a I<bare> repository:
test_repository( init => [ '--bare' ] );
To leave the repository in its location after the end of the test:
test_repository( temp => [ CLEANUP => 0 ] );
Note that since C<test_repository()> uses C<git init> to create the test
repository, it requires at least Git version C<1.5.0.rc1>.
=head1 ACKNOWLEDGEMENTS
The C<clone> option and capability of C<test_repository()> owes a lot
to Nathan Nutter (NNUTTER), who wanted to be able to clone into a test
repository.
=head1 SEE ALSO
L<Test::Requires::Git>.
=head1 COPYRIGHT
Copyright 2010-2016 Philippe Bruhat (BooK), all rights reserved.
=head1 LICENSE
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut
|