File Coverage

blib/lib/App/Git/Workflow/Pom.pm
Criterion Covered Total %
statement 98 110 89.0
branch 21 36 58.3
condition 24 43 55.8
subroutine 16 16 100.0
pod 4 4 100.0
total 163 209 77.9


line stmt bran cond sub pod time code
1              
2             # Created on: 2014-08-06 19:04:05
3             # Create by: Ivan Wills
4             # $Id$
5             # $Revision$, $HeadURL$, $Date$
6             # $Revision$, $Source$, $Date$
7              
8             use strict;
9 6     6   97036 use warnings;
  6         21  
  6         149  
10 6     6   25 use version;
  6         9  
  6         125  
11 6     6   730 use Carp qw/carp croak cluck confess longmess/;
  6         3146  
  6         24  
12 6     6   351 use Data::Dumper qw/Dumper/;
  6         12  
  6         373  
13 6     6   2117 use English qw/ -no_match_vars /;
  6         22806  
  6         280  
14 6     6   866 use XML::Tiny;
  6         4192  
  6         28  
15 6     6   4182 use App::Git::Workflow::Repository qw//;
  6         8188  
  6         254  
16 6     6   1822 use App::Git::Workflow;
  6         17  
  6         124  
17 6     6   1942 use base qw/App::Git::Workflow/;
  6         18  
  6         239  
18 6     6   36  
  6         12  
  6         6081  
19             our $VERSION = version->new(1.1.19);
20              
21             my $class = shift;
22             my $self = App::Git::Workflow->new(@_);
23 20     20 1 55 bless $self, $class;
24 20         97  
25 20         54 return $self;
26             }
27 20         48  
28             my $A = $a;
29             $A =~ s/(\d+)/sprintf "%014i", $1/egxms;
30             my $B = $b;
31 2     2   4 $B =~ s/(\d+)/sprintf "%014i", $1/egxms;
32 2         13  
  6         28  
33 2         5 return $A cmp $B;
34 2         6 }
  6         18  
35              
36 2         10 my ($self) = @_;
37             return $self->{MAX_AGE} ||= 60 * 60 * 24 * (
38             $ENV{GIT_WORKFLOW_MAX_AGE}
39             || $self->git->config('workflow.max-age')
40 4     4   8 || 120
41             );
42             }
43 4   50     27  
      33        
44             my ($self, $pom, $match, $skip) = @_;
45             my @branches = $self->branches('both');
46             my $settings = $self->settings();
47             my %versions;
48             my $count = 0;
49 4     4 1 13 my $max_age = $self->_max_age;
50 4         24 my $run = !$settings->{max_age} || $settings->{max_age} == $max_age ? 0 : 1;
51 4         20  
52 4         8 while (!%versions && $run < 10) {
53 4         6 BRANCH:
54 4         14 for my $branch (sort @branches) {
55 4 50 33     22 $settings->{pom_versions}{$branch} ||= {};
56             my $saved = $settings->{pom_versions}{$branch};
57 4   66     26  
58             # skip branches marked as OLD
59 4         15 next BRANCH if !$run && $saved->{old};
60 11   100     567 next BRANCH if $match && $branch !~ /$match/;
61 11         18 next BRANCH if $skip && $skip =~ /$skip/;
62              
63             my $current = eval { $self->commit_details($branch) } or next;
64 11 50 33     36  
65 11 50 33     24 # Skip any branches that are over $MAX_AGE old
66 11 50 33     30 if ( $current->{time} < time - $max_age ) {
67             $saved->{old} = 1;
68 11 100       16 $self->save_settings() if $count++ % 20 == 0;
  11         51  
69             next BRANCH;
70             }
71 8 50       31  
72 0         0 delete $saved->{old};
73 0 0       0  
74 0         0 # used saved version if it exists.
75             if ( $saved && $saved->{time} && $saved->{time} == $current->{time} ) {
76             $versions{$saved->{numerical}}{$branch} = $saved->{version};
77 8         14 next BRANCH;
78             }
79              
80 8 100 66     37 my $xml = eval { $self->git->show("$branch:$pom"); };
      66        
81 2         6  
82 2         8 next BRANCH if !$xml;
83             chomp $xml;
84             next BRANCH if !$xml;
85 6         9  
  6         15  
86             $branch =~ s{^origin/}{}xms;
87 6 50       17  
88 6         14 my $numerical = my $version = eval { $self->pom_version($xml, $pom) };
89 6 50       21  
90             # make sure we get a valid version
91 6         15 if ( $@ || !defined $numerical ) {
92             next BRANCH;
93 6         9 }
  6         14  
94              
95             # remove snapshots from the end
96 6 50 33     28 $numerical =~ s/-SNAPSHOT$//xms;
97 0         0 # remove any extranious text from the front
98             $numerical =~ s/^\D+//xms;
99              
100             $versions{$numerical}{$branch} = $version;
101 6         20 $settings->{pom_versions}{$branch} = {
102             numerical => $numerical,
103 6         14 version => $version,
104             time => $current->{time},
105 6         18 };
106             $self->save_settings() if $count++ % 50 == 0;
107             }
108             $run++;
109             }
110 6         34  
111 6 100       33 $self->save_settings();
112              
113 4         627 return \%versions;
114             }
115              
116 4         18 my ($self, $xml, $pom) = @_;
117              
118 4         58 if ( $pom && $pom =~ /[.]json$/ ) {
119             require JSON;
120             my $json = eval { JSON::decode_json($xml) }
121             or do { warn "Could not read $xml as json : $@\n"; };
122 12     12 1 1264 return $json->{version};
123             }
124 12 50 66     63 if ( $pom && $pom =~ /[.]ya?ml$/ ) {
125 0         0 require YAML;
126 0         0 my $json = YAML::Load($xml);
127 0 0       0 return $json->{version};
  0         0  
128 0         0 }
129              
130 12 50 66     34 my $doc = XML::Tiny::parsefile( $xml !~ /\n/ && -f $xml ? $xml : '_TINY_XML_STRING_' . $xml);
131 0         0  
132 0         0 for my $elem (@{ $doc->[0]{content} }) {
133 0         0 next if $elem->{name} ne 'version';
134              
135             return $elem->{content}[0]{content};
136 12 100 100     169 }
137              
138 12         6780 return;
  12         32  
139 20 100       56 }
140              
141 11         62 my ($self, $pom, $versions) = @_;
142             $versions ||= $self->get_pom_versions($pom);
143              
144 1         11 # sanity check
145             die "No POM versions found!" if !%$versions;
146              
147             my ($max) = reverse sort _alphanum_sort keys %{$versions};
148 3     3 1 7 my ($primary, $secondary) = split /[.]/, $max;
149 3   66     12 $secondary++;
150              
151             return "$primary.$secondary.0-SNAPSHOT";
152 3 50       10 }
153              
154 3         6 1;
  3         18  
155 3         13  
156 3         6  
157             =head1 NAME
158 3         17  
159             App::Git::Workflow::Pom - Tools for maven POM files with git
160              
161             =head1 VERSION
162              
163             This documentation refers to App::Git::Workflow::Pom version 1.1.19
164              
165             =head1 SYNOPSIS
166              
167             use App::Git::Workflow::Pom qw/get_pom_versions pom_version next_pom_version/;
168              
169             # get all branch POM versions
170             my $versions = $pom->get_pom_versions("pom.xml");
171             # {
172             # 1.0 => { "some_branch" => "1.0.0-SNAPSHOT" },
173             # ...
174             # }
175              
176             # extract the version from the POM
177             my $version = $pom->pom_version("pom.xml");
178              
179             # find the next unused POM version.
180             my $next = $pom->next_pom_version("pom.xml");
181              
182             =head1 DESCRIPTION
183              
184             This library provides tools for looking at POM files in different branches.
185              
186             =head1 SUBROUTINES/METHODS
187              
188             =over 4
189              
190             =item C<new (%params)>
191              
192             Create a new C<App::Git::Workflow::Pom> object
193              
194             =item C<get_pom_versions ($pom_file)>
195              
196             Find all POM versions used in all branches.
197              
198             =item C<pom_version ($xml_text_or_file)>
199              
200             Extract the version number from C$xml_text_or_file>
201              
202             =item C<next_pom_version ($pom, $versions)>
203              
204             Find the next available POM version number.
205              
206             =back
207              
208             =head1 DIAGNOSTICS
209              
210             =head1 CONFIGURATION AND ENVIRONMENT
211              
212             =head1 DEPENDENCIES
213              
214             =head1 INCOMPATIBILITIES
215              
216             =head1 BUGS AND LIMITATIONS
217              
218             There are no known bugs in this module.
219              
220             Please report problems to Ivan Wills (ivan.wills@gmail.com).
221              
222             Patches are welcome.
223              
224             =head1 AUTHOR
225              
226             Ivan Wills - (ivan.wills@gmail.com)
227              
228             =head1 LICENSE AND COPYRIGHT
229              
230             Copyright (c) 2014 Ivan Wills (14 Mullion Close, Hornsby Heights, NSW Australia 2077).
231             All rights reserved.
232              
233             This module is free software; you can redistribute it and/or modify it under
234             the same terms as Perl itself. See L<perlartistic>. This program is
235             distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
236             without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
237             PARTICULAR PURPOSE.
238              
239             =cut