File Coverage

blib/lib/App/EUMM/Upgrade.pm
Criterion Covered Total %
statement 62 70 88.5
branch 17 30 56.6
condition 2 3 66.6
subroutine 7 8 87.5
pod 0 1 0.0
total 88 112 78.5


line stmt bran cond sub pod time code
1             package App::EUMM::Upgrade;
2              
3 2     2   12888 use strict;
  2         3  
  2         56  
4 2     2   7 use warnings;
  2         1  
  2         93  
5              
6             =head1 NAME
7              
8             App::EUMM::Upgrade - Perl tool to upgrade ExtUtils::MakeMaker-based Makefile.PL
9              
10             =head1 VERSION
11              
12             Version 0.24
13              
14             =cut
15              
16             our $VERSION = '0.24';
17              
18              
19             =head1 SYNOPSIS
20              
21             eumm-upgrade is a tool to allow using new features of ExtUtils::MakeMaker without losing
22             compatibility with older versions. It adds compatibility code to Makefile.PL and
23             tries to automatically detect some properties like license, minimum Perl version required and
24             repository used.
25              
26             Just run eumm-upgrade.pl in directory with Makefile.PL. Old file will be copied to Makefile.PL.bak.
27             If you use Github, Internet connection is required.
28              
29             You need to check resulting Makefile.PL manually as transformation is done
30             with regular expressions.
31              
32             If you need to declare number of spaces in indent in Makefile.PL, use following string at start of
33             it (set 'c-basic-offset' to your value):
34              
35             # -*- mode: perl; c-basic-offset: 4; indent-tabs-mode: nil; -*-
36              
37             =head1 new EUMM features
38              
39             LICENSE - shows license on search.cpan.org
40              
41             META_MERGE - add something (like repository URL or bugtracker UTL) to META.yml. Repository and
42             bugtracker URL are used on search.cpan.org.
43              
44             MIN_PERL_VERSION - minimum version of Perl required for module work. Not used currently, but will
45             be in the future.
46              
47             CONFIGURE_REQUIRES - modules that are used in Makefile.PL and should be installed before running it.
48              
49             BUILD_REQUIRES - modules that are used in installation and testing, but are not required by module
50             itself. Useful for ppm/OS package generaton and metadata parsing tools.
51              
52             =head1 AUTHOR
53              
54             Alexandr Ciornii, C<< >>
55              
56             =head1 BUGS
57              
58             Please report any bugs or feature requests to C, or through
59             the web interface at L. I will be notified, and then you'll
60             automatically be notified of progress on your bug as I make changes.
61              
62              
63             =head1 SUPPORT
64              
65             You can find documentation for this module with the perldoc command.
66              
67             perldoc App::EUMM::Upgrade
68              
69              
70             You can also look for information at:
71              
72             =over 4
73              
74             =item * RT: CPAN's request tracker
75              
76             L
77              
78             =item * AnnoCPAN: Annotated CPAN documentation
79              
80             L
81              
82             =item * CPAN Ratings
83              
84             L
85              
86             =item * Search CPAN
87              
88             L
89              
90             =back
91              
92              
93             =head1 ACKNOWLEDGEMENTS
94              
95              
96             =head1 COPYRIGHT & LICENSE
97              
98             Copyright 2009-2015 Alexandr Ciornii.
99              
100             GPL v3
101              
102             =cut
103 2     2   31 use Exporter 'import';
  2         8  
  2         386  
104             our @EXPORT=qw/remove_conditional_code/;
105             sub _indent_space_number {
106 22     22   17 my $str=shift;
107 22 100       63 $str=~/^(\s+)/ or return 0;
108 17         21 my $ind=$1;
109 17         28 $ind=~s/\t/ /gs;
110 17         34 return length($ind);
111             }
112              
113 0     0   0 sub _unindent_t {
114             # my $replace
115             # die unless
116             }
117             sub _unindent {
118 6     6   17 my $space_string_to_set=shift;
119 6         6 my $text=shift;
120 6         1431 print "#'$space_string_to_set','$text'\n";
121 6         54 my @lines=split /(?<=[\x0A\x0D])/s,$text;
122 2     2   37 use List::Util qw/min/;
  2         3  
  2         1266  
123 6         10 my $minspace=min(map {_indent_space_number($_)} @lines);
  16         24  
124 6         8 my $s1=_indent_space_number($space_string_to_set);
125             #die "$s1 > $minspace" if $s1 > $minspace;
126 6 50       13 return $text if $s1==$minspace;
127             #if (grep { $_ !~ /^$space_string_to_set/ } @lines) {
128            
129             #}
130             #my $space_str
131 6         4 my $line;
132 6         4 my $i=0;
133 6         9 foreach my $l (@lines) {
134 16 50       21 next unless $l;
135 16 100       22 if ($i==0) {
136 6         9 $l =~ s/^\s+//;
137 6         6 $i++;
138 6         9 next;
139             }
140 10 50       43 unless ($l=~s/^$space_string_to_set//) {
141 0         0 die "Text (line '$l') does not start with removal line ($space_string_to_set)";
142             }
143 10 50       13 next unless $l;
144 10 50       20 if ($l=~m/^(\s+)/) {
145 10         11 my $space=$1;
146 10 100       10 if (!defined $line) {
147 2         3 $line=$space;
148 2         4 next;
149             } else {
150 8 50       23 if ($space=~/^$line/) {
    0          
151 8         13 next;
152             } elsif ($line=~/^$space/) {
153 0         0 $line=$space;
154 0 0       0 if ($line eq '') {
155             #warn("line set to '' on line '$l'");
156             }
157             } else {
158 0         0 die "Cannot find common start, on line '$l'";
159             }
160             }
161             } else {
162 0         0 return $text;
163             }
164             }
165 6 50 66     22 if (!$line and $i>1) {
166 0         0 die "Cannot find common start";
167             }
168 6         6 $i=0;
169 6         5 foreach my $l (@lines) {
170 16 50       18 next unless $l;
171 16 100       21 if ($i==0) {
172 6         9 $l="$space_string_to_set$l";
173 6         3 $i++;
174 6         7 next;
175             }
176 10 50       62 unless ($l=~s/^$line//) {
177 0         0 die "Text (line '$l') does not start with calculated removal line ($space_string_to_set)";
178             }
179 10         15 $l="$space_string_to_set$l";
180             }
181 6         28 return (join("",@lines)."");
182              
183             #foreach
184             #$text=~s/^(\s+)(\S)/_unindent_t(qq{$1},qq{$space_string_to_set}).qq{$2}/egm;
185            
186             #my $style=shift;
187             }
188              
189             sub remove_conditional_code {
190 8     8 0 3402 my $content=shift;
191 8         12 my $space=shift;
192 8         14 $content=~s/(WriteMakefile\()(\S)/$1\n$space$2/;
193              
194 8         15 $content=~s/
195             \(\s*\$\]\s*>=\s*5\.005\s*\?\s*(?:\#\#\s*\QAdd these new keywords supported since 5.005\E\s*)?
196             \s+\(\s*ABSTRACT(?:_FROM)?\s*=>\s*'([^'\n]+)',\s*(?:\#\s*\Qretrieve abstract from module\E\s*)?
197             \s+AUTHOR\s*=>\s*'([^'\n]+)'
198             \s*\)\s*\Q: ()\E\s*\),\s+
199             /ABSTRACT_FROM => '$1',\n${space}AUTHOR => '$2',\n/sx;
200              
201 8         27 my $eumm_version_check=qr/\$ ExtUtils::MakeMaker::VERSION\s+
202             (?:g[et]\s+' [\d\._]+ ' \s* | >=?\s*[\d\._]+\s+) |
203             eval\s*{\s*ExtUtils::MakeMaker->VERSION\([\d\._]+\)\s*}\s*
204             /xs;
205 8         172 $content=~s/
206 5         9 ^(\s*)\(\s* $eumm_version_check
207             \?\s+\(\s* #[\n\r]
208             ( [ \t]*[^()]+? ) #main text, should not contain ()
209             \s*
210             \)\s*\:\s*\(\)\s*\),
211             /_unindent($1,$2)/msxge;
212              
213 8         45 $content=~s/
214             \(\s*\$\]\s* \Q>=\E \s* 5[\d\._]+ \s* \?\s*\( \s*
215             ( [^()]+? ) ,? \s*
216             \)\s*\:\s*\(\)\s*\),
217             /$1,/sxg;
218             # ($] >= 5.005 ?
219             # (AUTHOR => 'Stephen Hardisty ') : ()),
220 8         44 return $content;
221             }
222              
223             1; # End of App::EUMM::Upgrade