| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Minilla::Migrate; |
|
2
|
1
|
|
|
1
|
|
2360
|
use strict; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
30
|
|
|
3
|
1
|
|
|
1
|
|
5
|
use warnings; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
22
|
|
|
4
|
1
|
|
|
1
|
|
5
|
use utf8; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
4
|
|
|
5
|
|
|
|
|
|
|
|
|
6
|
1
|
|
|
1
|
|
21
|
use File::pushd; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
47
|
|
|
7
|
1
|
|
|
1
|
|
6
|
use CPAN::Meta; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
30
|
|
|
8
|
1
|
|
|
1
|
|
7
|
use File::Find (); |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
40
|
|
|
9
|
1
|
|
|
1
|
|
6
|
use TOML 0.92 qw(to_toml); |
|
|
1
|
|
|
|
|
28
|
|
|
|
1
|
|
|
|
|
48
|
|
|
10
|
1
|
|
|
1
|
|
7
|
use Config; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
47
|
|
|
11
|
|
|
|
|
|
|
|
|
12
|
1
|
|
|
1
|
|
7
|
use Minilla::Gitignore; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
48
|
|
|
13
|
1
|
|
|
|
|
76
|
use Minilla::Util qw( |
|
14
|
|
|
|
|
|
|
slurp spew require_optional |
|
15
|
|
|
|
|
|
|
cmd cmd_perl slurp_utf8 spew_utf8 |
|
16
|
|
|
|
|
|
|
slurp_raw spew_raw |
|
17
|
1
|
|
|
1
|
|
6
|
); |
|
|
1
|
|
|
|
|
2
|
|
|
18
|
1
|
|
|
1
|
|
7
|
use Minilla::Logger; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
47
|
|
|
19
|
1
|
|
|
1
|
|
6
|
use Minilla::Git; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
79
|
|
|
20
|
1
|
|
|
1
|
|
7
|
use Minilla::Project; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
29
|
|
|
21
|
|
|
|
|
|
|
|
|
22
|
1
|
|
|
1
|
|
7
|
use Moo; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
5
|
|
|
23
|
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
has project => ( |
|
25
|
|
|
|
|
|
|
is => 'lazy', |
|
26
|
|
|
|
|
|
|
); |
|
27
|
|
|
|
|
|
|
|
|
28
|
1
|
|
|
1
|
|
394
|
no Moo; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
3
|
|
|
29
|
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
sub _build_project { |
|
31
|
0
|
|
|
0
|
|
|
my $self = shift; |
|
32
|
0
|
|
|
|
|
|
Minilla::Project->new(); |
|
33
|
|
|
|
|
|
|
} |
|
34
|
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
sub run { |
|
36
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
|
37
|
|
|
|
|
|
|
|
|
38
|
0
|
0
|
|
|
|
|
if (!-d '.git') { |
|
39
|
|
|
|
|
|
|
# init git repo |
|
40
|
0
|
|
|
|
|
|
infof("Initializing git\n"); |
|
41
|
0
|
|
|
|
|
|
cmd('git', 'init'); |
|
42
|
|
|
|
|
|
|
} |
|
43
|
|
|
|
|
|
|
|
|
44
|
0
|
|
|
|
|
|
my $guard = pushd($self->project->dir); |
|
45
|
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
# Generate cpanfile from Build.PL/Makefile.PL |
|
47
|
0
|
0
|
|
|
|
|
unless (-f 'cpanfile') { |
|
48
|
0
|
|
|
|
|
|
$self->migrate_cpanfile(); |
|
49
|
|
|
|
|
|
|
} |
|
50
|
|
|
|
|
|
|
|
|
51
|
0
|
|
|
|
|
|
$self->generate_license(); |
|
52
|
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
# TODO move top level *.pm to lib/? |
|
54
|
|
|
|
|
|
|
|
|
55
|
0
|
0
|
|
|
|
|
if (-f 'dist.ini') { |
|
|
|
0
|
|
|
|
|
|
|
56
|
0
|
|
|
|
|
|
$self->dist_ini2minil_toml(); |
|
57
|
|
|
|
|
|
|
} elsif (!-f 'minil.toml') { |
|
58
|
0
|
|
|
|
|
|
$self->project->generate_minil_toml('Default'); |
|
59
|
|
|
|
|
|
|
} |
|
60
|
|
|
|
|
|
|
|
|
61
|
0
|
|
|
|
|
|
$self->remove_unused_files(); |
|
62
|
0
|
|
|
|
|
|
$self->migrate_gitignore(); |
|
63
|
0
|
|
|
|
|
|
$self->project->regenerate_files(); |
|
64
|
0
|
|
|
|
|
|
$self->migrate_changes(); |
|
65
|
|
|
|
|
|
|
|
|
66
|
0
|
|
|
|
|
|
git_add('.'); |
|
67
|
|
|
|
|
|
|
} |
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
sub migrate_changes { |
|
70
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
|
71
|
|
|
|
|
|
|
|
|
72
|
0
|
0
|
|
|
|
|
if (-f 'Changes') { |
|
73
|
|
|
|
|
|
|
# Q. Why :raw? |
|
74
|
|
|
|
|
|
|
# A. It's for windows. See dzil. |
|
75
|
0
|
|
|
|
|
|
my $content = slurp_raw('Changes'); |
|
76
|
0
|
0
|
|
|
|
|
unless ($content =~ qr!\{\{\$NEXT\}\}!) { |
|
77
|
0
|
|
|
|
|
|
$content =~ s!^(Revision history for Perl extension \S+\n\n)!$1\{\{\$NEXT\}\}\n\n!; |
|
78
|
|
|
|
|
|
|
} |
|
79
|
0
|
|
|
|
|
|
spew_raw('Changes', $content); |
|
80
|
|
|
|
|
|
|
} else { |
|
81
|
|
|
|
|
|
|
# Q. Why :raw? |
|
82
|
|
|
|
|
|
|
# A. It's for windows. See dzil. |
|
83
|
0
|
|
|
|
|
|
require Minilla::Profile::Default; |
|
84
|
0
|
|
|
|
|
|
Minilla::Profile::Default->new_from_project( |
|
85
|
|
|
|
|
|
|
$self->project |
|
86
|
|
|
|
|
|
|
)->render('Changes'); |
|
87
|
|
|
|
|
|
|
} |
|
88
|
|
|
|
|
|
|
} |
|
89
|
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
sub rm { |
|
91
|
0
|
|
|
0
|
0
|
|
my ($self, $file) = @_; |
|
92
|
|
|
|
|
|
|
} |
|
93
|
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
sub dist_ini2minil_toml { |
|
95
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
|
96
|
|
|
|
|
|
|
|
|
97
|
0
|
|
|
|
|
|
infof("Converting dist.ini to minil.toml\n"); |
|
98
|
|
|
|
|
|
|
|
|
99
|
0
|
|
|
|
|
|
require_optional( 'Config/MVP/Reader/INI.pm', 'Migrate dzil repo' ); |
|
100
|
0
|
|
|
|
|
|
require_optional( 'Dist/Zilla/MVP/Assembler.pm', 'Migrate dzil repo' ); |
|
101
|
0
|
|
|
|
|
|
require_optional( 'Dist/Zilla/Chrome/Term.pm', 'Migrate dzil repo' ); |
|
102
|
0
|
|
|
|
|
|
my $sequence = Config::MVP::Reader::INI->read_into_assembler( |
|
103
|
|
|
|
|
|
|
'dist.ini', |
|
104
|
|
|
|
|
|
|
Dist::Zilla::MVP::Assembler->new( |
|
105
|
|
|
|
|
|
|
chrome => Dist::Zilla::Chrome::Term->new(), |
|
106
|
|
|
|
|
|
|
) |
|
107
|
|
|
|
|
|
|
); |
|
108
|
0
|
|
|
|
|
|
my $conf = do { |
|
109
|
|
|
|
|
|
|
# Note. dist.ini using @Milla does not have '_' section. |
|
110
|
0
|
|
|
|
|
|
my $section = $sequence->section_named('_'); |
|
111
|
0
|
0
|
|
|
|
|
$section ? $section->payload : +{}; |
|
112
|
|
|
|
|
|
|
}; |
|
113
|
|
|
|
|
|
|
|
|
114
|
0
|
|
|
|
|
|
my $dst = +{}; |
|
115
|
0
|
|
|
|
|
|
for my $key (qw(name author version license)) { |
|
116
|
0
|
0
|
|
|
|
|
if ( defined(my $val = $conf->{$key}) ) { |
|
117
|
0
|
|
|
|
|
|
$dst->{$key} = $val; |
|
118
|
|
|
|
|
|
|
} |
|
119
|
|
|
|
|
|
|
} |
|
120
|
0
|
0
|
|
|
|
|
if (%$dst) { |
|
121
|
0
|
|
|
|
|
|
my $toml = to_toml($dst); |
|
122
|
0
|
|
|
|
|
|
spew( 'minil.toml' => $toml ); |
|
123
|
0
|
|
|
|
|
|
git_add('minil.toml'); |
|
124
|
|
|
|
|
|
|
} |
|
125
|
0
|
|
|
|
|
|
git_rm('--quiet', 'dist.ini'); |
|
126
|
|
|
|
|
|
|
|
|
127
|
0
|
|
|
|
|
|
$self->project->clear_metadata(); |
|
128
|
|
|
|
|
|
|
} |
|
129
|
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
sub generate_license { |
|
131
|
0
|
|
|
0
|
0
|
|
my ($self) = @_; |
|
132
|
|
|
|
|
|
|
|
|
133
|
0
|
0
|
|
|
|
|
unless (-f 'LICENSE') { |
|
134
|
0
|
|
|
|
|
|
spew_raw('LICENSE', $self->project->metadata->license->fulltext()); |
|
135
|
0
|
|
|
|
|
|
git_add(qw(-f LICENSE)); |
|
136
|
|
|
|
|
|
|
} |
|
137
|
|
|
|
|
|
|
} |
|
138
|
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
sub migrate_cpanfile { |
|
140
|
0
|
|
|
0
|
0
|
|
my ($self) = @_; |
|
141
|
|
|
|
|
|
|
|
|
142
|
0
|
|
|
|
|
|
my $metafile; |
|
143
|
0
|
0
|
|
|
|
|
if (-f 'Build.PL') { |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
144
|
0
|
0
|
|
|
|
|
if (slurp('Build.PL') =~ /Module::Build::Tiny/) { |
|
145
|
0
|
|
|
|
|
|
infof("M::B::Tiny was detected. I hope META.json is already exists here\n"); |
|
146
|
0
|
|
|
|
|
|
$metafile = 'META.json'; |
|
147
|
|
|
|
|
|
|
} else { |
|
148
|
0
|
|
|
|
|
|
cmd_perl('Build.PL'); |
|
149
|
0
|
|
|
|
|
|
$metafile = 'MYMETA.json'; |
|
150
|
|
|
|
|
|
|
} |
|
151
|
|
|
|
|
|
|
} elsif (-f 'Makefile.PL') { |
|
152
|
|
|
|
|
|
|
# ExtUtils::MakeMaker or Module::Install's |
|
153
|
0
|
|
|
|
|
|
cmd_perl('Makefile.PL'); |
|
154
|
0
|
|
|
|
|
|
cmd($Config{make}, 'metafile'); |
|
155
|
0
|
|
|
|
|
|
$metafile = 'MYMETA.json'; |
|
156
|
|
|
|
|
|
|
} elsif (-f 'dist.ini') { |
|
157
|
0
|
|
|
|
|
|
my %orig = map { $_ => 1 } glob('*/META.yml'); |
|
|
0
|
|
|
|
|
|
|
|
158
|
0
|
|
|
|
|
|
cmd_perl('-S', 'dzil', 'build'); |
|
159
|
0
|
|
|
|
|
|
($metafile) = grep { !$orig{$_} } glob('*/META.yml'); |
|
|
0
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
} else { |
|
161
|
0
|
|
|
|
|
|
errorf("There is no Build.PL/Makefile.PL/dist.ini: %s\n", Cwd::getcwd()); |
|
162
|
|
|
|
|
|
|
} |
|
163
|
|
|
|
|
|
|
|
|
164
|
0
|
0
|
0
|
|
|
|
unless (defined($metafile) && -f $metafile) { |
|
165
|
0
|
|
|
|
|
|
errorf("Build.PL/Makefile.PL does not generates %s\n", $metafile); |
|
166
|
|
|
|
|
|
|
} |
|
167
|
|
|
|
|
|
|
|
|
168
|
0
|
|
|
|
|
|
my $meta = CPAN::Meta->load_file($metafile); |
|
169
|
0
|
|
|
|
|
|
my $prereqs = $meta->effective_prereqs->as_string_hash; |
|
170
|
|
|
|
|
|
|
|
|
171
|
0
|
|
|
|
|
|
infof("Using Module::Build (Because this distribution uses xs)\n"); |
|
172
|
0
|
|
|
|
|
|
delete $prereqs->{configure}->{requires}->{'ExtUtils::MakeMaker'}; |
|
173
|
0
|
|
|
|
|
|
delete $prereqs->{configure}->{requires}->{'Module::Build'}; |
|
174
|
0
|
|
|
|
|
|
delete $prereqs->{configure}->{requires}->{'Module::Build::Tiny'}; |
|
175
|
|
|
|
|
|
|
|
|
176
|
0
|
|
|
|
|
|
my $cpanfile = Module::CPANfile->from_prereqs($prereqs); |
|
177
|
0
|
|
|
|
|
|
spew('cpanfile', $cpanfile->to_string); |
|
178
|
|
|
|
|
|
|
|
|
179
|
0
|
|
|
|
|
|
git_add('cpanfile'); |
|
180
|
|
|
|
|
|
|
} |
|
181
|
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
sub remove_unused_files { |
|
183
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
|
184
|
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
# Some users put a README.pod symlink for main module. |
|
186
|
|
|
|
|
|
|
# But it's duplicated to README.md created by Minilla. |
|
187
|
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
# remove some unusable files |
|
189
|
0
|
|
|
|
|
|
for my $file (qw( |
|
190
|
|
|
|
|
|
|
Makefile.PL |
|
191
|
|
|
|
|
|
|
MANIFEST |
|
192
|
|
|
|
|
|
|
MANIFEST.SKIP |
|
193
|
|
|
|
|
|
|
.shipit |
|
194
|
|
|
|
|
|
|
xt/97_podspell.t |
|
195
|
|
|
|
|
|
|
xt/99_pod.t |
|
196
|
|
|
|
|
|
|
xt/01_podspell.t xt/03_pod.t xt/05_cpan_meta.t |
|
197
|
|
|
|
|
|
|
xt/04_minimum_version.t xt/06_meta_author.t |
|
198
|
|
|
|
|
|
|
xt/podspell.t |
|
199
|
|
|
|
|
|
|
MANIFEST.SKIP.bak |
|
200
|
|
|
|
|
|
|
MANIFEST.bak |
|
201
|
|
|
|
|
|
|
README.pod |
|
202
|
|
|
|
|
|
|
META.yml |
|
203
|
|
|
|
|
|
|
README |
|
204
|
|
|
|
|
|
|
MYMETA.json |
|
205
|
|
|
|
|
|
|
MYMETA.yml |
|
206
|
|
|
|
|
|
|
inc/Module/Install.pm |
|
207
|
|
|
|
|
|
|
), glob('inc/Module/Install/*.pm')) { |
|
208
|
0
|
0
|
|
|
|
|
if (-e $file) { |
|
209
|
0
|
0
|
|
|
|
|
if (grep { $_ eq $file } git_ls_files()) { |
|
|
0
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
# committed file |
|
211
|
0
|
|
|
|
|
|
git_rm('--quiet', $file); |
|
212
|
|
|
|
|
|
|
} else { |
|
213
|
0
|
|
|
|
|
|
unlink $file; |
|
214
|
|
|
|
|
|
|
} |
|
215
|
|
|
|
|
|
|
} |
|
216
|
|
|
|
|
|
|
} |
|
217
|
|
|
|
|
|
|
} |
|
218
|
|
|
|
|
|
|
|
|
219
|
|
|
|
|
|
|
sub migrate_gitignore { |
|
220
|
0
|
|
|
0
|
0
|
|
my ($self) = @_; |
|
221
|
|
|
|
|
|
|
|
|
222
|
0
|
|
|
|
|
|
my @lines; |
|
223
|
|
|
|
|
|
|
|
|
224
|
0
|
0
|
|
|
|
|
my $gitignore = ( |
|
225
|
|
|
|
|
|
|
-f '.gitignore' |
|
226
|
|
|
|
|
|
|
? Minilla::Gitignore->load('.gitignore') |
|
227
|
|
|
|
|
|
|
: Minilla::Gitignore->new() |
|
228
|
|
|
|
|
|
|
); |
|
229
|
0
|
|
|
|
|
|
$gitignore->remove('META.json'); |
|
230
|
0
|
|
|
|
|
|
$gitignore->remove('/META.json'); |
|
231
|
0
|
|
|
|
|
|
$gitignore->remove('LICENSE'); |
|
232
|
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
# Add some lines |
|
234
|
0
|
|
|
|
|
|
$gitignore->add(sprintf('/%s-*', $self->project->dist_name)); |
|
235
|
0
|
|
|
|
|
|
for my $fname (qw( |
|
236
|
|
|
|
|
|
|
/.build |
|
237
|
|
|
|
|
|
|
/_build_params |
|
238
|
|
|
|
|
|
|
/Build |
|
239
|
|
|
|
|
|
|
/Build.bat |
|
240
|
|
|
|
|
|
|
!Build/ |
|
241
|
|
|
|
|
|
|
!META.json |
|
242
|
|
|
|
|
|
|
!LICENSE |
|
243
|
|
|
|
|
|
|
)) { |
|
244
|
0
|
|
|
|
|
|
$gitignore->add($fname); |
|
245
|
|
|
|
|
|
|
} |
|
246
|
|
|
|
|
|
|
|
|
247
|
0
|
|
|
|
|
|
$gitignore->save('.gitignore'); |
|
248
|
|
|
|
|
|
|
|
|
249
|
0
|
|
|
|
|
|
git_add(qw(.gitignore)); |
|
250
|
|
|
|
|
|
|
} |
|
251
|
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
|
|
253
|
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
1; |
|
255
|
|
|
|
|
|
|
|