File Coverage

File:blib/lib/Git/ReleaseRepo/Command/release.pm
Coverage:89.7%

linestmtbrancondsubpodtimecode
1package Git::ReleaseRepo::Command::release;
2# ABSTRACT: Perform a release
3
4
2
2
2
14470
2
31
use strict;
5
2
2
2
4
2
25
use warnings;
6
2
2
2
4
2
6
use Moose;
7
2
2
2
7092
3
6
use Git::ReleaseRepo -command;
8
2
2
2
264
2
11
use Git::Repository;
9
10with 'Git::ReleaseRepo::WithVersionPrefix';
11
12sub description {
13
0
1
0
    return 'Perform a release';
14}
15
16around opt_spec => sub {
17    my ( $orig, $self ) = @_;
18    return (
19        $self->$orig(),
20        [ 'bugfix' => 'Release a bugfix release from the release branch' ],
21    );
22};
23
24augment execute => sub {
25    my ( $self, $opt, $args ) = @_;
26    my ( $version, $branch_version );
27    my $git = $self->git;
28    my $prefix = $self->release_prefix;
29    if ( $args->[0] ) {
30        $version = $args->[0];
31        ( $branch_version ) = $args->[0] =~ m/^($prefix\d+[.]\d+)/;
32    }
33    else {
34        my $latest_version = $git->latest_version;
35        my @parts = $latest_version ? split /[.]/, $latest_version
36                  : ( "${prefix}0", 0, 0 ); # Our first release!
37        if ( $opt->{bugfix} ) {
38            # Bugfix releases increment the third number
39            $parts[2]++;
40        }
41        else {
42            # Normal releases increment the second number
43            $parts[1]++;
44            $parts[2] = 0;
45        }
46        # Remove anything after the 3rd number. If they wanted more, they
47        # should have given us an argument!
48        $version = join ".", @parts[0..2];
49        $branch_version = join ".", @parts[0..1];
50    }
51    print "Release version $version\n";
52    print "Starting release cycle $branch_version\n" if !$opt->{bugfix};
53    if ( $opt->bugfix ) {
54        $git->checkout( $git->latest_release_branch );
55    }
56    else {
57        $git->checkout;
58    }
59    # Release all modules too!
60    for my $module ( keys $git->submodule ) {
61        my $subgit = $git->submodule_git( $module );
62        if ( !$opt->{bugfix} ) {
63            $self->branch_release( $subgit, $branch_version );
64        }
65        $self->tag_release( $subgit, $version );
66    }
67    if ( !$opt->{bugfix} ) {
68        $self->branch_release( $git, $branch_version );
69    }
70    $self->tag_release( $git, $version );
71};
72
73sub branch_release {
74
5
0
12
    my ( $self, $git, $version ) = @_;
75
5
15
    $git->run( branch => $version );
76
5
33601
    if ( $git->has_remote( 'origin' ) ) {
77
3
16
        $git->command( push => origin => "$version:$version" );
78    }
79}
80
81sub tag_release {
82
10
0
22
    my ( $self, $git, $version ) = @_;
83
10
26
    $git->run( tag => $version );
84
10
57810
    if ( $git->has_remote( 'origin' ) ) {
85
6
30
        $git->command( push => origin => '--tags' );
86    }
87}
88
891;