File Coverage

File:blib/lib/Git/ReleaseRepo/Command/deploy.pm
Coverage:87.2%

linestmtbrancondsubpodtimecode
1package Git::ReleaseRepo::Command::deploy;
2# ABSTRACT: Deploy a release repository
3
4
2
2
2
1618
2
31
use strict;
5
2
2
2
4
2
23
use warnings;
6
2
2
2
4
5
5
use Moose;
7
2
2
2
7141
2
53
use File::Spec::Functions qw( catdir );
8
2
2
2
5398
2824
81
use File::Copy qw( move );
9
2
2
2
5
2
703
use Cwd qw( getcwd );
10
11extends 'Git::ReleaseRepo::CreateCommand';
12
13override usage_desc => sub {
14    my ( $self ) = @_;
15    return super() . " <repo_url> [<repo_name>]";
16};
17
18sub description {
19
0
1
0
    return 'Deploy a release repository';
20}
21
22sub validate_args {
23
3
1
1751
    my ( $self, $opt, $args ) = @_;
24
3
9
    return $self->usage_error( "Repository URL is required" ) if ( @$args < 1 );
25
3
6
    return $self->usage_error( "Too many arguments" ) if ( @$args > 2 );
26
3
8
    return $self->usage_error( 'Must specify --version_prefix' ) unless $opt->{version_prefix};
27}
28
29around opt_spec => sub {
30    my ( $orig, $self ) = @_;
31    return (
32        $self->$orig,
33        [ 'branch=s' => 'Specify the release branch to deploy. Defaults to the latest release branch.' ],
34        [ 'master' => 'Deploy the "master" version of the repository and all submodules, for testing.' ],
35    );
36};
37
38augment execute => sub {
39    my ( $self, $opt, $args ) = @_;
40    my $repo_name = $args->[1];
41    my $rename_repo = 0;
42    if ( !$repo_name ) {
43        # The automatic name will come from the release branch of the deployed repository, which
44        # we won't have until we actually clone the repository, so create a temporary
45        # directory instead
46        $rename_repo = 1;
47        $repo_name = join "-", $self->repo_name_from_url( $args->[0] ), 'deploy', time;
48    }
49    my $repo_dir = catdir( getcwd, $repo_name );
50    my $cmd = Git::Repository->command( clone => $args->[0], $repo_dir );
51    my @stderr = readline $cmd->stderr;
52    my @stdout = readline $cmd->stdout;
53    $cmd->close;
54    if ( $cmd->exit != 0 ) {
55        die "Could not clone '$args->[0]'.\nEXIT: " . $cmd->exit . "\nSTDERR: " . ( join "\n", @stderr )
56            . "\nSTDOUT: " . ( join "\n", @stdout );
57    }
58    my $repo = Git::Repository->new( work_tree => $repo_dir );
59    $repo->release_prefix( $opt->{version_prefix} );
60    my $version = $opt->{master} ? "master"
61                : $opt->{branch} ? $repo->latest_version( $opt->{branch} )
62                : $repo->latest_version;
63    my $branch = $opt->{master} ? "master"
64                : $opt->{branch} ? $opt->{branch}
65                : $repo->latest_release_branch;
66    $cmd = $repo->command( checkout => $version );
67    @stderr = readline $cmd->stderr;
68    @stdout = readline $cmd->stdout;
69    $cmd->close;
70    if ( $cmd->exit != 0 ) {
71        die "Could not checkout '$version'.\nEXIT: " . $cmd->exit . "\nSTDERR: " . ( join "\n", @stderr )
72            . "\nSTDOUT: " . ( join "\n", @stdout );
73    }
74    $repo->run( submodule => 'update', '--init' );
75    if ( $opt->{master} ) {
76        my $cmd = $repo->command( submodule => 'foreach', 'git checkout master && git pull origin master' );
77        my @stderr = readline $cmd->stderr;
78        my @stdout = readline $cmd->stdout;
79        $cmd->close;
80        if ( $cmd->exit != 0 ) {
81            die "Could not checkout master\nEXIT: " . $cmd->exit . "\nSTDERR: " . ( join "\n", @stderr )
82                . "\nSTDOUT: " . ( join "\n", @stdout );
83        }
84    }
85    if ( $rename_repo ) {
86        $repo_name = join "-", $self->repo_name_from_url( $args->[0] ), $branch;
87        my $new_repo_dir = catdir( getcwd, $repo_name );
88        move( $repo_dir, $new_repo_dir );
89        $repo = Git::Repository->new( work_tree => $new_repo_dir );
90    }
91    # Set new default repo and configuration
92    # Deploy creates a detatched HEAD, so we need to know what branch we're
93    # tracking
94    $self->update_config( $opt, $repo, { track => $branch } );
95};
96
971;