The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

#
# (c) Jan Gehring <jan.gehring@gmail.com>
#
=head1 NAME
Rex::Commands::SCM - Sourcecontrol for Subversion and Git.
=head1 DESCRIPTION
With this module you can checkout subversion and git repositories.
Version <= 1.0: All these functions will not be reported.
All these functions are not idempotent.
=head1 SYNOPSIS
use Rex::Commands::SCM;
set repository => "myrepo",
url => 'git@foo.bar:myrepo.git';
set repository => "myrepo2",
type => "subversion",
username => "myuser",
password => "mypass";
task "checkout", sub {
checkout "myrepo";
checkout "myrepo",
path => "webapp";
checkout "myrepo",
path => "webapp",
branch => 1.6; # branch only for git
# For Git only, will replay any local commits on top of pulled commits
checkout "myrepo",
path => "script_dir",
rebase => TRUE;
checkout "myrepo2";
};
=head1 EXPORTED FUNCTIONS
=cut
use v5.12.5;
our $VERSION = '1.16.0'; # VERSION
require Rex::Exporter;
use vars qw(@EXPORT %REPOS);
@EXPORT = qw(checkout);
Rex::Config->register_set_handler(
"repository" => sub {
my ( $name, %option ) = @_;
$REPOS{$name} = \%option;
}
);
=head2 checkout($name, %data);
With this function you can checkout a repository defined with I<set repository>. See Synopsis.
=cut
sub checkout {
my ( $name, %data ) = @_;
my $type = $REPOS{"$name"}->{"type"} ? $REPOS{$name}->{"type"} : "git";
my $class = "Rex::SCM::\u$type";
my $co_to = exists $data{"path"} ? $data{"path"} : "";
if ( $data{"path"} ) {
$data{"path"} = undef;
delete $data{"path"};
}
eval "use $class;";
if ($@) {
Rex::Logger::info( "Error loading SCM: $@\n", "warn" );
die("Error loading SCM: $@");
}
my $scm = $class->new;
my $repo = Rex::Config->get("repository");
Rex::Logger::debug("Checking out $repo -> $co_to");
$scm->checkout( $REPOS{$name}, $co_to, \%data );
}
1;