File Coverage

File:blib/lib/Git/ReleaseRepo/Command/add.pm
Coverage:75.0%

linestmtbrancondsubpodtimecode
1package Git::ReleaseRepo::Command::add;
2# ABSTRACT: Add a module to the next release
3
4
2
2
2
1597
2
32
use strict;
5
2
2
2
4
1
26
use warnings;
6
2
2
2
4
1
5
use Moose;
7
2
2
2
7109
1
7
use Git::ReleaseRepo -command;
8
2
2
2
268
2
723
use File::Spec::Functions qw( catdir );
9
10with 'Git::ReleaseRepo::WithVersionPrefix';
11
12override usage_desc => sub {
13    my ( $self ) = @_;
14    return super() . " <module_name> [<module_url>]";
15};
16
17sub description {
18
0
1
0
    return 'Add a module to the next release';
19}
20
21around opt_spec => sub {
22    my ( $orig, $self ) = @_;
23    return (
24        $self->$orig(),
25        [ 'bugfix' => 'Add to the latest release branch as a bug fix' ],
26        [ 'all|a' => "Add all out-of-date modules to the release" ],
27    );
28};
29
30sub validate_args {
31
5
1
47
    my ( $self, $opt, $args ) = @_;
32
5
12
    if ( $opt->all ) {
33
0
0
        if ( @$args ) {
34
0
0
            return $self->usage_error( "--all does not make sense with module names to add" );
35        }
36    }
37    else {
38
5
22
        if ( scalar @$args < 1 ) {
39
0
0
            return $self->usage_error( "You must specify a submodule to add to the next release" );
40        }
41
5
13
        if ( scalar @$args > 2 ) {
42
0
0
            return $self->usage_error( "Too many arguments" );
43        }
44    }
45}
46
47augment execute => sub {
48    my ( $self, $opt, $args ) = @_;
49    my $git = $self->git;
50    my $branch;
51    if ( $opt->bugfix ) {
52        $branch = $git->latest_release_branch;
53        die "Cannot add with --bugfix: No release branch found!\n" if !$branch;
54    }
55    else {
56        $branch = "master";
57    }
58    if ( $git->has_branch( $branch ) ) {
59        $git->checkout( $branch );
60    }
61    if ( $opt->all ) {
62        my @outdated = $git->outdated;
63        for my $outdated ( @outdated ) {
64            $self->update_submodule( $outdated, $branch );
65        }
66        my $message = "Updating all outdated:\n"
67                    . join "\n", map { sprintf "\t\%s", $_ } sort @outdated;
68        $git->run( commit => ( @outdated ), -m => $message );
69    }
70    elsif ( @$args == 1 ) {
71        $self->update_submodule( @$args, $branch );
72        $git->run( commit => ( @$args ), -m => "Updating $args->[0]" );
73    }
74    elsif ( @$args == 2 ) {
75        $self->add_submodule( @$args );
76        $git->run( commit => ( '.gitmodules', $args->[0] ), -m => "Adding $args->[0] to release" );
77    }
78    $git->checkout;
79};
80
81sub update_submodule {
82
3
0
10
    my ( $self, $module, $branch ) = @_;
83
3
9
    $branch ||= "master";
84
3
20
    my $git = $self->git;
85
3
14
    if ( !$git->submodule->{ $module } ) {
86
0
0
        die "Cannot add $module: Submodule does not exist\n";
87    }
88
3
23
    my $subgit = $git->submodule_git( $module );
89
3
14
    my $cmd = $subgit->command( 'fetch' );
90
3
13734
    $cmd->close;
91
3
41114
    $cmd = $subgit->command( checkout => 'origin/' . $branch );
92
3
13706
    my @stdout = readline $cmd->stdout;
93
3
7709
    my @stderr = readline $cmd->stderr;
94
3
50
    $cmd->close;
95
3
162
    if ( $cmd->exit != 0 ) {
96
0
0
        die "Could not checkout 'origin/$branch': \nSTDERR: " . ( join "\n", @stderr )
97            . "\nSTDOUT: " . ( join "\n", @stdout );
98    }
99}
100
101sub add_submodule {
102
2
0
7
    my ( $self, $module, $repo ) = @_;
103
2
11
    my $git = $self->git;
104
2
6
    $git->run(
105        submodule => add => '--', $repo, $module,
106    );
107}
108
109
2
2
2
5
1
7
no Moose;
110__PACKAGE__->meta->make_immutable;
1111;