1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
|
package CPANPLUS::Internals::Constants::Report;
use strict;
use CPANPLUS::Error;
use File::Spec;
use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
require Exporter;
use vars qw[$VERSION @ISA @EXPORT];
use Package::Constants;
$VERSION = 0.01;
@ISA = qw[Exporter];
@EXPORT = Package::Constants->list( __PACKAGE__ );
### for the version
require CPANPLUS::Internals;
### OS to regex map ###
my %OS = (
Amiga => 'amigaos',
Atari => 'mint',
BSD => 'bsdos|darwin|freebsd|openbsd|netbsd',
Be => 'beos',
BeOS => 'beos',
Cygwin => 'cygwin',
Darwin => 'darwin',
EBCDIC => 'os390|os400|posix-bc|vmesa',
Haiku => 'haiku',
HPUX => 'hpux',
Linux => 'linux',
MSDOS => 'dos|os2|MSWin32|cygwin',
'bin\\d*Mac'=> 'MacOS|darwin', # binMac, bin56Mac, bin58Mac...
Mac => 'MacOS|darwin',
MacPerl => 'MacOS',
MacOS => 'MacOS|darwin',
MacOSX => 'darwin',
MPE => 'mpeix',
MPEiX => 'mpeix',
OS2 => 'os2',
Plan9 => 'plan9',
RISCOS => 'riscos',
SGI => 'irix',
Solaris => 'solaris',
Unix => 'aix|bsdos|darwin|dgux|dynixptx|freebsd|'.
'linux|hpux|machten|netbsd|next|openbsd|dec_osf|'.
'svr4|sco_sv|unicos|unicosmk|solaris|sunos',
VMS => 'VMS',
VOS => 'VOS',
Win32 => 'MSWin32|cygwin',
Win32API => 'MSWin32|cygwin',
);
use constant GRADE_FAIL => 'fail';
use constant GRADE_PASS => 'pass';
use constant GRADE_NA => 'na';
use constant GRADE_UNKNOWN => 'unknown';
use constant MAX_REPORT_SEND
=> 2;
use constant CPAN_TESTERS_EMAIL
=> 'cpan-testers@perl.org';
### the cpan mail account for this user ###
use constant CPAN_MAIL_ACCOUNT
=> sub {
my $username = shift or return;
return $username . '@cpan.org';
};
### check if this module is platform specific and if we're on that
### specific platform. Alternately, the module is not platform specific
### and we're always OK to send out test results.
use constant RELEVANT_TEST_RESULT
=> sub {
my $mod = shift or return;
my $name = $mod->module;
my $specific;
for my $platform (keys %OS) {
if( $name =~ /\b$platform\b/i ) {
# beware the Mac != MAC
next if($platform eq 'Mac' &&
$name !~ /\b$platform\b/);
$specific++;
return 1 if
$^O =~ /^(?:$OS{$platform})$/
}
};
return $specific ? 0 : 1;
};
use constant UNSUPPORTED_OS
=> sub {
my $buffer = shift or return;
if( $buffer =~
/No support for OS|OS unsupported/im ) {
return 1;
}
return 0;
};
use constant PERL_VERSION_TOO_LOW
=> sub {
my $buffer = shift or return;
# ExtUtils::MakeMaker format
if( $buffer =~
/Perl .*? required--this is only .*?/m ) {
return 1;
}
# Module::Build format
if( $buffer =~
/ERROR:( perl:)? Version .*?( of perl)? is installed, but we need version >= .*?/m ) {
return 1;
}
return 0;
};
use constant NO_TESTS_DEFINED
=> sub {
my $buffer = shift or return;
if( $buffer =~
/(No tests defined( for [\w:]+ extension)?\.)/
and $buffer !~ /\*\.t/m and
$buffer !~ /test\.pl/m
) {
return $1
}
return;
};
### what stage did the test fail? ###
use constant TEST_FAIL_STAGE
=> sub {
my $buffer = shift or return;
return $buffer =~ /(MAKE [A-Z]+).*/
? lc $1 :
'fetch';
};
use constant MISSING_PREREQS_LIST
=> sub {
my $buffer = shift;
my @list = map { s/.pm$//; s|/|::|g; $_ }
($buffer =~
m/\bCan\'t locate (\S+) in \@INC/g);
### make sure every missing prereq is only
### listed ones
{ my %seen;
@list = grep { !$seen{$_}++ } @list
}
return @list;
};
use constant MISSING_EXTLIBS_LIST
=> sub {
my $buffer = shift;
my @list =
($buffer =~
m/No library found for -l([-\w]+)/g);
return @list;
};
use constant REPORT_MESSAGE_HEADER
=> sub {
my ($version, $author) = @_;
return << ".";
Dear $author,
This is a computer-generated error report created automatically by
CPANPLUS, version $version. Testers personal comments may appear
at the end of this report.
.
};
use constant REPORT_MESSAGE_FAIL_HEADER
=> sub {
my($stage, $buffer) = @_;
return << ".";
Thank you for uploading your work to CPAN. However, it appears that
there were some problems testing your distribution.
TEST RESULTS:
Below is the error stack from stage '$stage':
$buffer
.
};
use constant REPORT_MISSING_PREREQS
=> sub {
my ($author,$email,@missing) = @_;
$author = ($author && $email)
? "$author ($email)"
: 'Your Name Here';
my $modules = join "\n", @missing;
my $prereqs = join "\n",
map {"\t'$_'\t=> '0',".
" # or a minimum working version"}
@missing;
return << ".";
MISSING PREREQUISITES:
It was observed that the test suite seem to fail without these modules:
$modules
As such, adding the prerequisite module(s) to 'PREREQ_PM' in your
Makefile.PL should solve this problem. For example:
WriteMakefile(
AUTHOR => '$author',
... # other information
PREREQ_PM => {
$prereqs
}
);
If you are interested in making a more flexible Makefile.PL that can
probe for missing dependencies and install them, ExtUtils::AutoInstall
at <http://search.cpan.org/dist/ExtUtils-AutoInstall/> may be
worth a look.
Thanks! :-)
.
};
use constant REPORT_MISSING_TESTS
=> sub {
return << ".";
RECOMMENDATIONS:
It would be very helpful if you could include even a simple test
script in the next release, so people can verify which platforms
can successfully install them, as well as avoid regression bugs?
A simple 't/use.t' that says:
#!/usr/bin/env perl -w
use strict;
use Test;
BEGIN { plan tests => 1 }
use Your::Module::Here; ok(1);
exit;
__END__
would be appreciated. If you are interested in making a more robust
test suite, please see the Test::Simple, Test::More and Test::Tutorial
documentation at <http://search.cpan.org/dist/Test-Simple/>.
Thanks! :-)
.
};
use constant REPORT_LOADED_PREREQS
=> sub {
my $mod = shift;
my $cb = $mod->parent;
my $prq = $mod->status->prereqs || {};
### not every prereq may be coming from CPAN
### so maybe we wont find it in our module
### tree at all...
### skip ones that cant be found in teh list
### as reported in #12723
my @prq = grep { defined }
map { $cb->module_tree($_) }
sort keys %$prq;
### no prereqs?
return '' unless @prq;
### some apparently, list what we loaded
my $str = << ".";
PREREQUISITES:
Here is a list of prerequisites you specified and versions we
managed to load:
.
$str .= join '',
map { sprintf "\t%s %-30s %8s %8s\n",
@$_
} [' ', 'Module Name', 'Have', 'Want'],
map { my $want = $prq->{$_->name};
[ do { $_->is_uptodate(
version => $want
) ? ' ' : '!'
},
$_->name,
$_->installed_version,
$want
],
### might be empty entries in there
} grep { defined $_ } @prq;
return $str;
};
use constant REPORT_TESTS_SKIPPED
=> sub {
return << ".";
******************************** NOTE ********************************
*** ***
*** The tests for this module were skipped during this build ***
*** ***
**********************************************************************
.
};
use constant REPORT_MESSAGE_FOOTER
=> sub {
return << ".";
******************************** NOTE ********************************
The comments above are created mechanically, possibly without manual
checking by the sender. As there are many people performing automatic
tests on each upload to CPAN, it is likely that you will receive
identical messages about the same problem.
If you believe that the message is mistaken, please reply to the first
one with correction and/or additional informations, and do not take
it personally. We appreciate your patience. :)
**********************************************************************
Additional comments:
.
};
1;
# Local variables:
# c-indentation-style: bsd
# c-basic-offset: 4
# indent-tabs-mode: nil
# End:
# vim: expandtab shiftwidth=4:
|