Re: [PATCH] Update IPC::Cmd to 0.42
[p5sagit/p5-mst-13.2.git] / utils / perlbug.PL
CommitLineData
37fa004c 1#!/usr/local/bin/perl
2
3use Config;
4use File::Basename qw(&basename &dirname);
8a5546a1 5use Cwd;
1948c06a 6use File::Spec::Functions;
37fa004c 7
8# List explicitly here the variables you want Configure to
9# generate. Metaconfig only looks for shell variables, so you
10# have to mention them as if they were shell variables, not
11# %Config entries. Thus you write
12# $startperl
13# to ensure Configure will look for $Config{startperl}.
84902520 14# $perlpath
37fa004c 15
16# This forces PL files to create target in same directory as PL file.
17# This is so that make depend always knows where to find PL derivatives.
8a5546a1 18$origdir = cwd;
44a8e56a 19chdir dirname($0);
20$file = basename($0, '.PL');
774d564b 21$file .= '.com' if $^O eq 'VMS';
37fa004c 22
55d729e4 23open OUT, ">$file" or die "Can't create $file: $!";
37fa004c 24
84902520 25# extract patchlevel.h information
26
1948c06a 27open PATCH_LEVEL, "<" . catfile(updir, "patchlevel.h")
28 or die "Can't open patchlevel.h: $!";
84902520 29
30my $patchlevel_date = (stat PATCH_LEVEL)[9];
31
32while (<PATCH_LEVEL>) {
548074df 33 last if $_ =~ /^\s*static\s+(?:const\s+)?char.*?local_patches\[\]\s*=\s*{\s*$/;
34}
35
36if (! defined($_)) {
37 warn "Warning: local_patches section not found in patchlevel.h\n";
55d729e4 38}
84902520 39
fb73857a 40my @patches;
84902520 41while (<PATCH_LEVEL>) {
fb73857a 42 last if /^\s*}/;
3bcc0c4b 43 next if /^\s*#/; # preprocessor stuff
84902520 44 chomp;
5963b987 45 s/^\s+,?\s*"?//;
46 s/"?\s*,?$//;
84902520 47 s/(['\\])/\\$1/g;
fb73857a 48 push @patches, $_ unless $_ eq 'NULL';
55d729e4 49}
50my $patch_desc = "'" . join("',\n '", @patches) . "'";
51my $patch_tags = join "", map /(\S+)/ ? "+$1 " : (), @patches;
84902520 52
c0a6bf09 53close(PATCH_LEVEL) or die "Error closing patchlevel.h: $!";
84902520 54
5edeba26 55# TO DO (prehaps): store/embed $Config::config_sh into perlbug. When perlbug is
56# used, compare $Config::config_sh with the stored version. If they differ then
57# append a list of individual differences to the bug report.
58
84902520 59
37fa004c 60print "Extracting $file (with variable substitutions)\n";
61
62# In this section, perl variables will be expanded during extraction.
63# You can use $Config{...} to use Configure variables.
64
fa510083 65my $extract_version = sprintf("%vd", $^V);
1ec03f31 66
37fa004c 67print OUT <<"!GROK!THIS!";
5f05dabc 68$Config{startperl}
69 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
70 if \$running_under_some_shell;
84902520 71
1ec03f31 72my \$config_tag1 = '$extract_version - $Config{cf_time}';
fb73857a 73
84902520 74my \$patchlevel_date = $patchlevel_date;
fb73857a 75my \$patch_tags = '$patch_tags';
76my \@patches = (
55d729e4 77 $patch_desc
fb73857a 78);
37fa004c 79!GROK!THIS!
80
81# In the following, perl variables are not expanded during extraction.
82
83print OUT <<'!NO!SUBS!';
84
54c90be1 85use warnings;
86no warnings 'once'; # Eventually, the $::opt_ stuff should get cleaned up
721e2275 87use strict;
37fa004c 88use Config;
1ec03f31 89use File::Spec; # keep perlbug Perl 5.005 compatible
37fa004c 90use Getopt::Std;
721e2275 91use File::Basename 'basename';
37fa004c 92
93sub paraprint;
94
55d729e4 95BEGIN {
54c90be1 96 eval { require Mail::Send;};
55d729e4 97 $::HaveSend = ($@ eq "");
54c90be1 98 eval { require Mail::Util; } ;
55d729e4 99 $::HaveUtil = ($@ eq "");
003a92ef 100 # use secure tempfiles wherever possible
54c90be1 101 eval { require File::Temp; };
003a92ef 102 $::HaveTemp = ($@ eq "");
13f4c5e4 103 eval { require Module::CoreList; };
104 $::HaveCoreList = ($@ eq "");
55d729e4 105};
c07a80fd 106
54c90be1 107my $Version = "1.39";
c07a80fd 108
109# Changed in 1.06 to skip Mail::Send and Mail::Util if not available.
a5f75d66 110# Changed in 1.07 to see more sendmail execs, and added pipe output.
111# Changed in 1.08 to use correct address for sendmail.
c07a80fd 112# Changed in 1.09 to close the REP file before calling it up in the editor.
113# Also removed some old comments duplicated elsewhere.
114# Changed in 1.10 to run under VMS without Mail::Send; also fixed
a5f75d66 115# temp filename generation.
c07a80fd 116# Changed in 1.11 to clean up some text and removed Mail::Send deactivator.
a5f75d66 117# Changed in 1.12 to check for editor errors, make save/send distinction
118# clearer and add $ENV{REPLYTO}.
84478119 119# Changed in 1.13 to hopefully make it more difficult to accidentally
120# send mail
ab3ef367 121# Changed in 1.14 to make the prompts a little more clear on providing
122# helpful information. Also let file read fail gracefully.
8ecf1a0c 123# Changed in 1.15 to add warnings to stop people using perlbug for non-bugs.
124# Also report selected environment variables.
774d564b 125# Changed in 1.16 to include @INC, and allow user to re-edit if no changes.
137443ea 126# Changed in 1.17 Win32 support added. GSAR 97-04-12
1b0e3b9e 127# Changed in 1.18 add '-ok' option for reporting build success. CFR 97-06-18
84902520 128# Changed in 1.19 '-ok' default not '-v'
129# add local patch information
130# warn on '-ok' if this is an old system; add '-okay'
fb73857a 131# Changed in 1.20 Added patchlevel.h reading and version/config checks
55d729e4 132# Changed in 1.21 Added '-nok' for reporting build failure DFD 98-05-05
133# Changed in 1.22 Heavy reformatting & minor bugfixes HVDS 98-05-10
cca87523 134# Changed in 1.23 Restore -ok(ay): say 'success'; don't prompt
105f9295 135# Changed in 1.24 Added '-F<file>' to save report HVDS 98-07-01
8b49bb9a 136# Changed in 1.25 Warn on failure to open save file. HVDS 98-07-12
eedd3c36 137# Changed in 1.26 Don't require -t STDIN for -ok. HVDS 98-07-15
1948c06a 138# Changed in 1.27 Added Mac OS and File::Spec support CNANDOR 99-07-27
50d3c28b 139# Changed in 1.28 Additional questions for Perlbugtron RFOLEY 20.03.2000
975b416b 140# Changed in 1.29 Perlbug(tron): auto(-ok), short prompts RFOLEY 05-05-2000
b0c10877 141# Changed in 1.30 Added warnings on failure to open files MSTEVENS 13-07-2000
c0a6bf09 142# Changed in 1.31 Add checks on close().Fix my $var unless. TJENNESS 26-07-2000
93b42772 143# Changed in 1.32 Use File::Spec->tmpdir TJENNESS 20-08-2000
489b74f8 144# Changed in 1.33 Don't require -t STDOUT for -ok.
de94c9df 145# Changed in 1.34 Added Message-Id RFOLEY 18-06-2002
003a92ef 146# Changed in 1.35 Use File::Temp (patch from Solar Designer) NWCLARK 28-02-2004
13f4c5e4 147# Changed in 1.36 Initial Module::CoreList support Alexandr Ciornii 11-07-2007
54c90be1 148# Changed in 1.37 Killed some string evals, rewrote most prose JESSE 2008-06-08
149# Changed in 1.38 Actually enforce the CoreList check,
150# Record the module the user enters if they do so
151# Refactor prompts to use common code JESSE 2008-06-08
152# Changed in 1.39 Trap mail sending failures (simple ones) so JESSE 2008-06-08
153# users might be able to recover their bug reports
154# Refactor mail sending routines
155# Unify message building code
156# Unify message header building
157# Fix "module" prompting to not squish "category" prompting
158# use warnings; (except 'once' warnings)
159# Unified report fingerprint/change detection code
160# Removed some labeled 'gotos'
161#TODO:
162# make sure failure (transmission-wise) of Mail::Send is accounted for.
163# (This may work now. Unsure of the original author's issue -JESSE 2008-06-08)
1b0e3b9e 164# - Test -b option
37fa004c 165
721e2275 166my( $file, $usefile, $cc, $address, $bugaddress, $testaddress, $thanksaddress,
167 $filename, $messageid, $domain, $subject, $from, $verbose, $ed, $outfile,
54c90be1 168 $fh, $me, $body, $andcc, %REP, $ok, $thanks, $progname,
169 $Is_MacOS, $Is_MSWin32, $Is_Linux, $Is_VMS, $Is_OpenBSD,
170 $report_about_module, $category, $severity,
171
172);
37fa004c 173
fa510083 174my $perl_version = $^V ? sprintf("%vd", $^V) : $];
1ec03f31 175
176my $config_tag2 = "$perl_version - $Config{cf_time}";
fb73857a 177
37fa004c 178Init();
179
55d729e4 180if ($::opt_h) { Help(); exit; }
181if ($::opt_d) { Dump(*STDOUT); exit; }
eedd3c36 182if (!-t STDIN && !($ok and not $::opt_n)) {
721e2275 183 paraprint <<"EOF";
184Please use $progname interactively. If you want to
84478119 185include a file, you can use the -f switch.
186EOF
55d729e4 187 die "\n";
84478119 188}
c07a80fd 189
37fa004c 190Query();
cca87523 191Edit() unless $usefile || ($ok and not $::opt_n);
37fa004c 192NowWhat();
54c90be1 193if ($outfile) {
194 save_message_to_disk($outfile);
195} else {
196 Send();
197 print "\nThank you for taking the time to file a bug report!\n\n";
198}
37fa004c 199
200exit;
201
975b416b 202sub ask_for_alternatives { # (category|severity)
50d3c28b 203 my $name = shift;
975b416b 204 my %alts = (
205 'category' => {
206 'default' => 'core',
207 'ok' => 'install',
721e2275 208 # Inevitably some of these will end up in RT whatever we do:
209 'thanks' => 'thanks',
975b416b 210 'opts' => [qw(core docs install library utilities)], # patch, notabug
211 },
212 'severity' => {
213 'default' => 'low',
214 'ok' => 'none',
dda32041 215 'thanks' => 'none',
975b416b 216 'opts' => [qw(critical high medium low wishlist none)], # zero
7f2de2d2 217 },
975b416b 218 );
54c90be1 219 die "Invalid alternative ($name) requested\n" unless grep(/^$name$/, keys %alts);
50d3c28b 220 my $alt = "";
721e2275 221 my $what = $ok || $thanks;
222 if ($what) {
223 $alt = $alts{$name}{$what};
975b416b 224 } else {
225 my @alts = @{$alts{$name}{'opts'}};
54c90be1 226 print "\n\n";
975b416b 227 paraprint <<EOF;
54c90be1 228Please pick a $name from the following list:
50d3c28b 229
230 @alts
50d3c28b 231EOF
975b416b 232 my $err = 0;
233 do {
234 if ($err++ > 5) {
235 die "Invalid $name: aborting.\n";
236 }
54c90be1 237 $alt = _prompt('', "\u$name", $alts{$name}{'default'});
238 $alt ||= $alts{$name}{'default'};
975b416b 239 } while !((($alt) = grep(/^$alt/i, @alts)));
240 }
50d3c28b 241 lc $alt;
242}
243
37fa004c 244sub Init {
55d729e4 245 # -------- Setup --------
246
247 $Is_MSWin32 = $^O eq 'MSWin32';
248 $Is_VMS = $^O eq 'VMS';
afc5e478 249 $Is_Linux = lc($^O) eq 'linux';
8843dda6 250 $Is_OpenBSD = lc($^O) eq 'openbsd';
1948c06a 251 $Is_MacOS = $^O eq 'MacOS';
252
253 @ARGV = split m/\s+/,
54c90be1 254 MacPerl::Ask('Provide command line args here (-h for help):')
1948c06a 255 if $Is_MacOS && $MacPerl::Version =~ /App/;
55d729e4 256
721e2275 257 if (!getopts("Adhva:s:b:f:F:r:e:SCc:to:n:T")) { Help(); exit; };
55d729e4 258
259 # This comment is needed to notify metaconfig that we are
260 # using the $perladmin, $cf_by, and $cf_time definitions.
261
262 # -------- Configuration ---------
263
264 # perlbug address
721e2275 265 $bugaddress = 'perlbug@perl.org';
55d729e4 266
267 # Test address
3e79b69b 268 $testaddress = 'perlbug-test@perl.org';
55d729e4 269
721e2275 270 # Thanks address
271 $thanksaddress = 'perl-thanks@perl.org';
272
273 if (basename ($0) =~ /^perlthanks/i) {
274 # invoked as perlthanks
275 $::opt_T = 1;
276 $::opt_C = 1; # don't send a copy to the local admin
277 }
278
279 if ($::opt_T) {
280 $thanks = 'thanks';
281 }
282
283 $progname = $thanks ? 'perlthanks' : 'perlbug';
55d729e4 284 # Target address
721e2275 285 $address = $::opt_a || ($::opt_t ? $testaddress
286 : $thanks ? $thanksaddress : $bugaddress);
55d729e4 287
288 # Users address, used in message and in Reply-To header
289 $from = $::opt_r || "";
290
291 # Include verbose configuration information
292 $verbose = $::opt_v || 0;
293
294 # Subject of bug-report message
295 $subject = $::opt_s || "";
296
297 # Send a file
298 $usefile = ($::opt_f || 0);
299
300 # File to send as report
301 $file = $::opt_f || "";
302
105f9295 303 # File to output to
304 $outfile = $::opt_F || "";
305
55d729e4 306 # Body of report
307 $body = $::opt_b || "";
de94c9df 308
55d729e4 309 # Editor
310 $ed = $::opt_e || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT}
311 || ($Is_VMS && "edit/tpu")
312 || ($Is_MSWin32 && "notepad")
1948c06a 313 || ($Is_MacOS && '')
55d729e4 314 || "vi";
315
316 # Not OK - provide build failure template by finessing OK report
317 if ($::opt_n) {
318 if (substr($::opt_n, 0, 2) eq 'ok' ) {
319 $::opt_o = substr($::opt_n, 1);
320 } else {
321 Help();
322 exit();
323 }
324 }
325
326 # OK - send "OK" report for build on this system
721e2275 327 $ok = '';
55d729e4 328 if ($::opt_o) {
329 if ($::opt_o eq 'k' or $::opt_o eq 'kay') {
330 my $age = time - $patchlevel_date;
331 if ($::opt_o eq 'k' and $age > 60 * 24 * 60 * 60 ) {
332 my $date = localtime $patchlevel_date;
333 print <<"EOF";
334"perlbug -ok" and "perlbug -nok" do not report on Perl versions which
335are more than 60 days old. This Perl version was constructed on
336$date. If you really want to report this, use
337"perlbug -okay" or "perlbug -nokay".
84902520 338EOF
1b0e3b9e 339 exit();
340 }
55d729e4 341 # force these options
342 unless ($::opt_n) {
343 $::opt_S = 1; # don't prompt for send
344 $::opt_b = 1; # we have a body
345 $body = "Perl reported to build OK on this system.\n";
346 }
347 $::opt_C = 1; # don't send a copy to the local admin
348 $::opt_s = 1; # we have a subject line
349 $subject = ($::opt_n ? 'Not ' : '')
1ec03f31 350 . "OK: perl $perl_version ${patch_tags}on"
55d729e4 351 ." $::Config{'archname'} $::Config{'osvers'} $subject";
721e2275 352 $ok = 'ok';
55d729e4 353 } else {
354 Help();
355 exit();
1b0e3b9e 356 }
55d729e4 357 }
37fa004c 358
55d729e4 359 # Possible administrator addresses, in order of confidence
360 # (Note that cf_email is not mentioned to metaconfig, since
361 # we don't really want it. We'll just take it if we have to.)
362 #
363 # This has to be after the $ok stuff above because of the way
364 # that $::opt_C is forced.
365 $cc = $::opt_C ? "" : (
366 $::opt_c || $::Config{'perladmin'}
367 || $::Config{'cf_email'} || $::Config{'cf_by'}
368 );
369
de94c9df 370 if ($::HaveUtil) {
371 $domain = Mail::Util::maildomain();
372 } elsif ($Is_MSWin32) {
373 $domain = $ENV{'USERDOMAIN'};
374 } else {
375 require Sys::Hostname;
376 $domain = Sys::Hostname::hostname();
377 }
378
379 # Message-Id - rjsf
380 $messageid = "<$::Config{'version'}_${$}_".time."\@$domain>";
381
55d729e4 382 # My username
383 $me = $Is_MSWin32 ? $ENV{'USERNAME'}
384 : $^O eq 'os2' ? $ENV{'USER'} || $ENV{'LOGNAME'}
1948c06a 385 : $Is_MacOS ? $ENV{'USER'}
55d729e4 386 : eval { getpwuid($<) }; # May be missing
c0830f08 387
388 $from = $::Config{'cf_email'}
389 if !$from && $::Config{'cf_email'} && $::Config{'cf_by'} && $me &&
390 ($me eq $::Config{'cf_by'});
55d729e4 391} # sub Init
37fa004c 392
393sub Query {
55d729e4 394 # Explain what perlbug is
395 unless ($ok) {
721e2275 396 if ($thanks) {
397 paraprint <<'EOF';
398This program provides an easy way to send a thank-you message back to the
399authors and maintainers of perl.
400
401If you wish to submit a bug report, please run it without the -T flag
402(or run the program perlbug rather than perlthanks)
403EOF
404 } else {
405 paraprint <<"EOF";
54c90be1 406This program provides an easy way to create a message reporting a
407bug in the core perl distribution (along with tests or patches)
408to the volunteers who maintain perl at $address. To send a thank-you
409note to $thanksaddress instead of a bug report, please run 'perlthanks'.
410
411Please do not use $0 to send test messages, test whether perl
412works, or to report bugs in perl modules from CPAN.
413
414For help using perl, try posting to the Usenet newsgroup
415comp.lang.perl.misc.
37fa004c 416EOF
721e2275 417 }
1b0e3b9e 418 }
37fa004c 419
55d729e4 420 # Prompt for subject of message, if needed
2e7f46bf 421
54c90be1 422 if ($subject && TrivialSubject($subject)) {
2e7f46bf 423 $subject = '';
424 }
425
55d729e4 426 unless ($subject) {
54c90be1 427 print
428"First of all, please provide a subject for the message.\n";
429 if ( not $thanks) {
721e2275 430 paraprint <<EOF;
54c90be1 431This should be a concise description of your bug or problem
432which will help the volunteers working to improve perl to categorize
433and resolve the issue. Be as specific and descriptive as
434you can. A subject like "perl bug" or "perl problem" will make it
435much less likely that your issue gets the attention it deserves.
37fa004c 436EOF
721e2275 437 }
55d729e4 438
439 my $err = 0;
2e7f46bf 440 do {
54c90be1 441 $subject = _prompt('','Subject');
2e7f46bf 442 if ($err++ == 5) {
721e2275 443 if ($thanks) {
444 $subject = 'Thanks for Perl';
445 } else {
446 die "Aborting.\n";
447 }
55d729e4 448 }
2e7f46bf 449 } while (TrivialSubject($subject));
55d729e4 450 }
451
452 # Prompt for return address, if needed
453 unless ($from) {
454 # Try and guess return address
455 my $guess;
456
457 $guess = $ENV{'REPLY-TO'} || $ENV{'REPLYTO'} || '';
1948c06a 458 if ($Is_MacOS) {
459 require Mac::InternetConfig;
460 $guess = $Mac::InternetConfig::InternetConfig{
461 Mac::InternetConfig::kICEmail()
462 };
463 }
464
55d729e4 465 unless ($guess) {
de94c9df 466 # move $domain to where we can use it elsewhere
467 if ($domain) {
55d729e4 468 if ($Is_VMS && !$::Config{'d_socket'}) {
469 $guess = "$domain\:\:$me";
41f926b8 470 } else {
55d729e4 471 $guess = "$me\@$domain" if $domain;
c07a80fd 472 }
55d729e4 473 }
474 }
37fa004c 475
55d729e4 476 if ($guess) {
477 unless ($ok) {
478 paraprint <<EOF;
54c90be1 479Perl's developers may need your email address to contact you for
480further information about your issue or to inform you when it is
481resolved. If the default shown is not your email address, please
482correct it.
37fa004c 483EOF
55d729e4 484 }
485 } else {
486 paraprint <<EOF;
54c90be1 487Please enter your full internet email address so that Perl's
488developers can contact you with questions about your issue or to
489inform you that it has been resolved.
37fa004c 490EOF
37fa004c 491 }
37fa004c 492
55d729e4 493 if ($ok && $guess) {
494 # use it
495 $from = $guess;
496 } else {
497 # verify it
54c90be1 498 $from = _prompt('','Your address',$guess);
55d729e4 499 $from = $guess if $from eq '';
500 }
501 }
37fa004c 502
55d729e4 503 if ($from eq $cc or $me eq $cc) {
504 # Try not to copy ourselves
505 $cc = "yourself";
506 }
37fa004c 507
55d729e4 508 # Prompt for administrator address, unless an override was given
509 if( !$::opt_C and !$::opt_c ) {
54c90be1 510 my $description = <<EOF;
511$0 can send a copy of this report to your local perl
512administrator. If the address below is wrong, please correct it,
513or enter 'none' or 'yourself' to not send a copy.
37fa004c 514EOF
54c90be1 515 my $entry = _prompt($description, "Local perl administrator", $cc);
37fa004c 516
55d729e4 517 if ($entry ne "") {
518 $cc = $entry;
519 $cc = '' if $me eq $cc;
37fa004c 520 }
55d729e4 521 }
37fa004c 522
55d729e4 523 $cc = '' if $cc =~ /^(none|yourself|me|myself|ourselves)$/i;
54c90be1 524 if ($cc) {
525 $andcc = " and $cc"
526 } else {
527 $andcc = ''
528 }
37fa004c 529
55d729e4 530 # Prompt for editor, if no override is given
ab3ef367 531editor:
55d729e4 532 unless ($::opt_e || $::opt_f || $::opt_b) {
26ab4e07 533
54c90be1 534 my $description;
26ab4e07 535
54c90be1 536 chomp (my $common_end = <<"EOF");
537You will probably want to use a text editor to enter the body of
538your report. If "$ed" is the editor you want to use, then just press
539Enter, otherwise type in the name of the editor you would like to
540use.
541
542If you have already composed the body of your report, you may enter
543"file", and $0 will prompt you to enter the name of the file
544containing your report.
721e2275 545EOF
546
547 if ($thanks) {
54c90be1 548 $description = <<"EOF";
549It's now time to compose your thank-you message.
721e2275 550
54c90be1 551Some information about your local perl configuration will automatically
552be included at the end of your message, because we're curious about
553the different ways that people build and use perl. If you'd rather
554not share this information, you're welcome to delete it.
721e2275 555
556$common_end
557EOF
558 } else {
54c90be1 559 $description = <<"EOF";
560It's now time to compose your bug report. Try to make the report
561concise but descriptive. Please include any detail which you think
562might be relevant or might help the volunteers working to improve
563perl. If you are reporting something that does not work as you think
564it should, please try to include examples of the actual result and of
565what you expected.
566
567Some information about your local perl configuration will automatically
568be included at the end of your report. If you are using an unusual
569version of perl, it would be useful if you could confirm that you
570can replicate the problem on a standard build of perl as well.
37fa004c 571
721e2275 572$common_end
37fa004c 573EOF
721e2275 574 }
575
54c90be1 576 my $entry = _prompt($description, "Editor", $ed);
55d729e4 577 $usefile = 0;
578 if ($entry eq "file") {
579 $usefile = 1;
580 } elsif ($entry ne "") {
581 $ed = $entry;
37fa004c 582 }
55d729e4 583 }
721e2275 584 if ($::HaveCoreList && !$ok && !$thanks) {
54c90be1 585 my $description = <<EOF;
586If your bug is about a Perl module rather than a core language
587feature, please enter its name here. If it's not, just hit Enter
588to skip this question.
13f4c5e4 589EOF
54c90be1 590
591 my $entry = '';
592 while ($entry eq '') {
593 $entry = _prompt($description, 'Module');
13f4c5e4 594 my $first_release = Module::CoreList->first_release($entry);
54c90be1 595 if ($entry and not $first_release) {
13f4c5e4 596 paraprint <<EOF;
54c90be1 597$entry is not a "core" Perl module. Please check that you entered
598its name correctly. If it is correct, quit this program, try searching
599for $entry on http://rt.cpan.org, and report your issue there.
13f4c5e4 600EOF
54c90be1 601
602 $entry = '';
603 } elsif ($entry) {
604 $category ||= 'library';
605 $report_about_module = $entry;
606 last;
607 } else {
608 last;
609 }
13f4c5e4 610 }
611 }
37fa004c 612
50d3c28b 613 # Prompt for category of bug
975b416b 614 $category ||= ask_for_alternatives('category');
50d3c28b 615
616 # Prompt for severity of bug
975b416b 617 $severity ||= ask_for_alternatives('severity');
50d3c28b 618
55d729e4 619 # Generate scratch file to edit report in
620 $filename = filename();
37fa004c 621
55d729e4 622 # Prompt for file to read report from, if needed
623 if ($usefile and !$file) {
ab3ef367 624filename:
54c90be1 625 my $description = <<EOF;
37fa004c 626What is the name of the file that contains your report?
37fa004c 627EOF
54c90be1 628 my $entry = _prompt($description, "Filename");
37fa004c 629
55d729e4 630 if ($entry eq "") {
631 paraprint <<EOF;
54c90be1 632It seems you didn't enter a filename. Please choose to use a text
633editor or enter a filename.
ab3ef367 634EOF
55d729e4 635 goto editor;
636 }
637
638 unless (-f $entry and -r $entry) {
639 paraprint <<EOF;
54c90be1 640'$entry' doesn't seem to be a readable file. You may have mistyped
641its name or may not have permission to read it.
642
643If you don't want to use a file as the content of your report, just
644hit Enter and you'll be able to select a text editor instead.
ab3ef367 645EOF
55d729e4 646 goto filename;
37fa004c 647 }
55d729e4 648 $file = $entry;
649 }
37fa004c 650
55d729e4 651 # Generate report
c9967ac8 652 open(REP,">$filename") or die "Unable to create report file '$filename': $!\n";
721e2275 653 my $reptype = !$ok ? ($thanks ? 'thank-you' : 'bug')
654 : $::opt_n ? "build failure" : "success";
37fa004c 655
55d729e4 656 print REP <<EOF;
84902520 657This is a $reptype report for perl from $from,
1ec03f31 658generated with the help of perlbug $Version running under perl $perl_version.
37fa004c 659
660EOF
661
55d729e4 662 if ($body) {
663 print REP $body;
664 } elsif ($usefile) {
665 open(F, "<$file")
c9967ac8 666 or die "Unable to read report file from '$file': $!\n";
55d729e4 667 while (<F>) {
668 print REP $_
669 }
c9967ac8 670 close(F) or die "Error closing '$file': $!";
55d729e4 671 } else {
721e2275 672 if ($thanks) {
673 print REP <<'EOF';
674
675-----------------------------------------------------------------
54c90be1 676[Please enter your thank-you message here]
721e2275 677
678
679
54c90be1 680[You're welcome to delete anything below this line]
721e2275 681-----------------------------------------------------------------
682EOF
683 } else {
684 print REP <<'EOF';
774d564b 685
686-----------------------------------------------------------------
54c90be1 687[Please describe your issue here]
774d564b 688
689
690
691[Please do not change anything below this line]
692-----------------------------------------------------------------
693EOF
721e2275 694 }
55d729e4 695 }
696 Dump(*REP);
c0a6bf09 697 close(REP) or die "Error closing report file: $!";
55d729e4 698
54c90be1 699 # Set up an initial report fingerprint so we can compare it later
700 _fingerprint_lines_in_report();
701
55d729e4 702} # sub Query
c07a80fd 703
704sub Dump {
55d729e4 705 local(*OUT) = @_;
37fa004c 706
50d3c28b 707 print OUT <<EFF;
708---
709Flags:
710 category=$category
711 severity=$severity
890b8eb0 712EFF
54c90be1 713
714 if ($report_about_module ) {
715 print OUT <<EFF;
716 module=$report_about_module
717EFF
718 }
890b8eb0 719 if ($::opt_A) {
720 print OUT <<EFF;
721 ack=no
722EFF
723 }
724 print OUT <<EFF;
50d3c28b 725---
726EFF
727 print OUT "This perlbug was built using Perl $config_tag1\n",
1ec03f31 728 "It is being executed now by Perl $config_tag2.\n\n"
55d729e4 729 if $config_tag2 ne $config_tag1;
fb73857a 730
55d729e4 731 print OUT <<EOF;
1ec03f31 732Site configuration information for perl $perl_version:
37fa004c 733
734EOF
55d729e4 735 if ($::Config{cf_by} and $::Config{cf_time}) {
736 print OUT "Configured by $::Config{cf_by} at $::Config{cf_time}.\n\n";
737 }
738 print OUT Config::myconfig;
37fa004c 739
55d729e4 740 if (@patches) {
741 print OUT join "\n ", "Locally applied patches:", @patches;
742 print OUT "\n";
743 };
84902520 744
55d729e4 745 print OUT <<EOF;
8ecf1a0c 746
774d564b 747---
1ec03f31 748\@INC for perl $perl_version:
774d564b 749EOF
55d729e4 750 for my $i (@INC) {
751 print OUT " $i\n";
752 }
774d564b 753
55d729e4 754 print OUT <<EOF;
8ecf1a0c 755
774d564b 756---
1ec03f31 757Environment for perl $perl_version:
8ecf1a0c 758EOF
5cf1d1f1 759 my @env =
760 qw(PATH LD_LIBRARY_PATH LANG PERL_BADLANG SHELL HOME LOGDIR LANGUAGE);
761 push @env, $Config{ldlibpthname} if $Config{ldlibpthname} ne '';
27414c22 762 push @env, grep /^(?:PERL|LC_|LANG|CYGWIN)/, keys %ENV;
8876aa85 763 my %env;
764 @env{@env} = @env;
765 for my $env (sort keys %env) {
55d729e4 766 print OUT " $env",
767 exists $ENV{$env} ? "=$ENV{$env}" : ' (unset)',
768 "\n";
769 }
770 if ($verbose) {
1ec03f31 771 print OUT "\nComplete configuration data for perl $perl_version:\n\n";
55d729e4 772 my $value;
773 foreach (sort keys %::Config) {
774 $value = $::Config{$_};
775 $value =~ s/'/\\'/g;
776 print OUT "$_='$value'\n";
84902520 777 }
55d729e4 778 }
779} # sub Dump
37fa004c 780
781sub Edit {
55d729e4 782 # Edit the report
783 if ($usefile || $body) {
54c90be1 784 my $description = "Please make sure that the name of the editor you want to use is correct.";
785 my $entry = _prompt($description, 'Editor', $ed);
55d729e4 786 $ed = $entry unless $entry eq '';
787 }
a5f75d66 788
54c90be1 789 _edit_file($ed);
790}
791
792sub _edit_file {
793 my $editor = shift;
794
795 my $report_written = 0;
796
797 while ( !$report_written ) {
798 if ($Is_MacOS) {
799 require ExtUtils::MakeMaker;
800 ExtUtils::MM_MacOS::launch_file($filename);
801 _prompt('', "Press Enter when done." );
802 } else { # we're not on oldschool mac os
803 my $exit_status = system("$editor $filename");
804 if ($exit_status) {
805 my $desc = <<EOF;
806The editor you chose ('$editor') could not be run!
807
808If you mistyped its name, please enter it now, otherwise just press Enter.
1948c06a 809EOF
54c90be1 810 my $entry = _prompt( $desc, 'Editor', $editor );
811 if ( $entry ne "" ) {
812 $editor = $entry;
813 next;
814 } else {
815 paraprint <<EOF;
816You may want to save your report to a file, so you can edit and
817mail it later.
a5f75d66 818EOF
54c90be1 819 return;
820 }
821 }
822 }
823 return if ( $ok and not $::opt_n ) || $body;
a5f75d66 824
54c90be1 825 # Check that we have a report that has some, eh, report in it.
774d564b 826
54c90be1 827 unless ( _fingerprint_lines_in_report() ) {
828 my $description = <<EOF;
829It looks like you didn't enter a report. You may [r]etry your edit
830or [c]ancel this report.
831EOF
832 my $action = _prompt( $description, "Action (Retry/Cancel) " );
833 if ( $action =~ /^[re]/i ) { # <R>etry <E>dit
834 next;
835 } elsif ( $action =~ /^[cq]/i ) { # <C>ancel, <Q>uit
836 Cancel(); # cancel exits
837 }
838 }
839 # Ok. the user did what they needed to;
840 return;
55d729e4 841
55d729e4 842 }
54c90be1 843}
774d564b 844
774d564b 845
846sub Cancel {
847 1 while unlink($filename); # remove all versions under VMS
54c90be1 848 print "\nQuitting without sending your message.\n";
774d564b 849 exit(0);
37fa004c 850}
851
852sub NowWhat {
55d729e4 853 # Report is done, prompt for further action
854 if( !$::opt_S ) {
855 while(1) {
54c90be1 856 my $menu = <<EOF;
857
858
859You have finished composing your message. At this point, you have
860a few options. You can:
861
862 * [Se]end the message to $address$andcc,
863 * [D]isplay the message on the screen,
864 * [R]e-edit the message
865 * Display or change the message's [su]bject
866 * Save the message to a [f]ile to mail at another time
867 * [Q]uit without sending a message
868
37fa004c 869EOF
8b49bb9a 870 retry:
54c90be1 871 print $menu;
872 my $action = _prompt('', "Action (Send/Display/Edit/Subject/Save to File)");;
873 print "\n";
55d729e4 874 if ($action =~ /^(f|sa)/i) { # <F>ile/<Sa>ve
54c90be1 875 if ( SaveMessage() ) { exit }
55d729e4 876 } elsif ($action =~ /^(d|l|sh)/i ) { # <D>isplay, <L>ist, <Sh>ow
877 # Display the message
c9967ac8 878 open(REP, "<$filename") or die "Couldn't open file '$filename': $!\n";
55d729e4 879 while (<REP>) { print $_ }
c9967ac8 880 close(REP) or die "Error closing report file '$filename': $!";
2e7f46bf 881 } elsif ($action =~ /^su/i) { # <Su>bject
54c90be1 882 my $reply = _prompt( "Subject: $subject", "If the above subject is fine, press Enter. Otherwise, type a replacement now\nSubject");
2e7f46bf 883 if ($reply ne '') {
884 unless (TrivialSubject($reply)) {
885 $subject = $reply;
886 print "Subject: $subject\n";
887 }
888 }
55d729e4 889 } elsif ($action =~ /^se/i) { # <S>end
890 # Send the message
54c90be1 891 my $reply = _prompt( "Are you certain you want to send this message?", 'Please type "yes" if you are','no');
892 if ($reply =~ /^yes$/) {
55d729e4 893 last;
894 } else {
895 paraprint <<EOF;
54c90be1 896You didn't type "yes", so your message has not yet been sent.
ab3ef367 897EOF
55d729e4 898 }
899 } elsif ($action =~ /^[er]/i) { # <E>dit, <R>e-edit
900 # edit the message
901 Edit();
902 } elsif ($action =~ /^[qc]/i) { # <C>ancel, <Q>uit
903 Cancel();
01544859 904 } elsif ($action =~ /^s/i) {
55d729e4 905 paraprint <<EOF;
54c90be1 906The command you entered was ambiguous. Please type "send", "save" or "subject".
84478119 907EOF
55d729e4 908 }
37fa004c 909 }
55d729e4 910 }
911} # sub NowWhat
37fa004c 912
2e7f46bf 913sub TrivialSubject {
914 my $subject = shift;
915 if ($subject =~
916 /^(y(es)?|no?|help|perl( (bug|problem))?|bug|problem)$/i ||
917 length($subject) < 4 ||
918 $subject !~ /\s/) {
54c90be1 919 print "\nThe subject you entered wasn't very descriptive. Please try again.\n\n";
2e7f46bf 920 return 1;
921 } else {
922 return 0;
923 }
924}
925
54c90be1 926sub SaveMessage {
927 my $file_save = $outfile || "$progname.rep";
928 my $file = _prompt( '', "Name of file to save message in", $file_save );
929 save_message_to_disk($file) || return undef;
930 print "\n";
931 paraprint <<EOF;
932A copy of your message has been saved in '$file' for you to
933send to '$address' with your normal mail client.
934EOF
935}
936
37fa004c 937sub Send {
54c90be1 938
55d729e4 939 # Message has been accepted for transmission -- Send the message
afc5e478 940
54c90be1 941 # on linux certain "mail" implementations won't accept the subject
afc5e478 942 # as "~s subject" and thus the Subject header will be corrupted
943 # so don't use Mail::Send to be safe
54c90be1 944 eval {
945 if ( $::HaveSend && !$Is_Linux && !$Is_OpenBSD ) {
946 _send_message_mailsend();
947 } elsif ($Is_VMS) {
948 _send_message_vms();
949 } else {
950 _send_message_sendmail();
951 }
952 };
37fa004c 953
54c90be1 954 if ( my $error = $@ ) {
955 paraprint <<EOF;
956$0 has detected an error while trying to send your message: $error.
c07a80fd 957
54c90be1 958Your message may not have been sent. You will now have a chance to save a copy to disk.
c07a80fd 959EOF
54c90be1 960 SaveMessage();
961 return;
55d729e4 962 }
54c90be1 963
964 1 while unlink($filename); # remove all versions under VMS
965} # sub Send
37fa004c 966
967sub Help {
55d729e4 968 print <<EOF;
37fa004c 969
54c90be1 970This program is designed to help you generate and send bug reports
971(and thank-you notes) about perl5 and the modules which ship with it.
972
973In most cases, you can just run "$0" interactively from a command
974line without any special arguments and follow the prompts.
975
976Advanced usage:
55d729e4 977
105f9295 978$0 [-v] [-a address] [-s subject] [-b body | -f inpufile ] [ -F outputfile ]
d121ca8c 979 [-r returnaddress] [-e editor] [-c adminaddress | -C] [-S] [-t] [-h]
890b8eb0 980$0 [-v] [-r returnaddress] [-A] [-ok | -okay | -nok | -nokay]
55d729e4 981
37fa004c 982
983Options:
984
985 -v Include Verbose configuration data in the report
55d729e4 986 -f File containing the body of the report. Use this to
37fa004c 987 quickly send a prepared message.
1948c06a 988 -F File to output the resulting mail message to, instead of mailing.
37fa004c 989 -S Send without asking for confirmation.
c9967ac8 990 -a Address to send the report to. Defaults to '$address'.
991 -c Address to send copy of report to. Defaults to '$cc'.
37fa004c 992 -C Don't send copy to administrator.
55d729e4 993 -s Subject to include with the message. You will be prompted
37fa004c 994 if you don't supply one on the command line.
995 -b Body of the report. If not included on the command line, or
996 in a file with -f, you will get a chance to edit the message.
997 -r Your return address. The program will ask you to confirm
998 this if you don't give it here.
55d729e4 999 -e Editor to use.
c9967ac8 1000 -t Test mode. The target address defaults to '$testaddress'.
1001 -T Thank-you mode. The target address defaults to '$thanksaddress'.
489b74f8 1002 -d Data mode. This prints out your configuration data, without mailing
c07a80fd 1003 anything. You can use this with -v to get more complete data.
890b8eb0 1004 -A Don't send a bug received acknowledgement to the return address.
84902520 1005 -ok Report successful build on this system to perl porters
55d729e4 1006 (use alone or with -v). Only use -ok if *everything* was ok:
1007 if there were *any* problems at all, use -nok.
fb73857a 1008 -okay As -ok but allow report from old builds.
55d729e4 1009 -nok Report unsuccessful build on this system to perl porters
1010 (use alone or with -v). You must describe what went wrong
1011 in the body of the report which you will be asked to edit.
1012 -nokay As -nok but allow report from old builds.
1013 -h Print this help message.
1014
37fa004c 1015EOF
1016}
1017
55d729e4 1018sub filename {
003a92ef 1019 if ($::HaveTemp) {
1020 # Good. Use a secure temp file
1021 my ($fh, $filename) = File::Temp::tempfile(UNLINK => 1);
1022 close($fh);
1023 return $filename;
1024 } else {
1025 # Bah. Fall back to doing things less securely.
1026 my $dir = File::Spec->tmpdir();
1027 $filename = "bugrep0$$";
1028 $filename++ while -e File::Spec->catfile($dir, $filename);
1029 $filename = File::Spec->catfile($dir, $filename);
1030 }
55d729e4 1031}
1032
37fa004c 1033sub paraprint {
1034 my @paragraphs = split /\n{2,}/, "@_";
37fa004c 1035 for (@paragraphs) { # implicit local $_
55d729e4 1036 s/(\S)\s*\n/$1 /g;
1037 write;
1038 print "\n";
37fa004c 1039 }
37fa004c 1040}
37fa004c 1041
54c90be1 1042sub _prompt {
1043 my ($explanation, $prompt, $default) = (@_);
1044 if ($explanation) {
1045 print "\n\n";
1046 paraprint $explanation;
1047 }
1048 print $prompt. ($default ? " [$default]" :''). ": ";
1049 my $result = scalar(<>);
1050 chomp($result);
1051 $result =~ s/^\s*(.*?)\s*$/$1/s;
1052 if ($default && $result eq '') {
1053 return $default;
1054 } else {
1055 return $result;
1056 }
1057}
1058
1059sub _build_header {
1060 my %attr = (@_);
1061
1062 my $head = '';
1063 for my $header (keys %attr) {
1064 $head .= "$header: ".$attr{$header}."\n";
1065 }
1066 return $head;
1067}
1068
1069sub _message_headers {
1070 my %headers = ( To => $address, Subject => $subject );
1071 $headers{'Cc'} = $cc if ($cc);
1072 $headers{'Message-Id'} = $messageid if ($messageid);
1073 $headers{'Reply-To'} = $from if ($from);
1074 return \%headers;
1075}
1076
1077sub build_complete_message {
1078 my $content = _build_header(%{_message_headers()}) . "\n\n";
1079 open( REP, "<$filename" ) or die "Couldn't open file '$filename': $!\n";
1080 while (<REP>) { $content .= $_; }
1081 close(REP) or die "Error closing report file '$filename': $!";
1082 return $content;
1083}
1084
1085sub save_message_to_disk {
1086 my $file = shift;
1087
1088 open OUTFILE, ">$file" or do { warn "Couldn't open '$file': $!\n"; return undef};
1089 print OUTFILE build_complete_message();
1090 close(OUTFILE) or do { warn "Error closing $file: $!"; return undef };
1091 print "\nMessage saved.\n";
1092 return 1;
1093}
1094
1095sub _send_message_vms {
1096 if ( ( $address =~ /@/ and $address !~ /^\w+%"/ )
1097 or ( $cc =~ /@/ and $cc !~ /^\w+%"/ ) ) {
1098 my $prefix;
1099 foreach ( qw[ IN MX SMTP UCX PONY WINS ], '' ) {
1100 $prefix = "$_%", last if $ENV{"MAIL\$PROTOCOL_$_"};
1101 }
1102 $address = qq[${prefix}"$address"] unless $address =~ /^\w+%"/;
1103 $cc = qq[${prefix}"$cc"] unless !$cc || $cc =~ /^\w+%"/;
1104 }
1105 $subject =~ s/"/""/g;
1106 $address =~ s/"/""/g;
1107 $cc =~ s/"/""/g;
1108 my $sts = system(qq[mail/Subject="$subject" $filename. "$address","$cc"]);
1109 if ($sts) {
1110 die "Can't spawn off mail (leaving bug report in $filename): $sts";
1111 }
1112}
1113
1114sub _send_message_mailsend {
1115 my $msg = Mail::Send->new();
1116 my %headers = %{_message_headers()};
1117 for my $key ( keys %headers) {
1118 $msg->add($key => $headers{$key});
1119 }
1120
1121 $fh = $msg->open;
1122 open(REP, "<$filename") or die "Couldn't open '$filename': $!\n";
1123 while (<REP>) { print $fh $_ }
1124 close(REP) or die "Error closing $filename: $!";
1125 $fh->close;
1126
1127 print "\nMessage sent.\n";
1128}
1129
1130sub _probe_for_sendmail {
1131 my $sendmail = "";
1132 for (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail)) {
1133 $sendmail = $_, last if -e $_;
1134 }
1135 if ( $^O eq 'os2' and $sendmail eq "" ) {
1136 my $path = $ENV{PATH};
1137 $path =~ s:\\:/:;
1138 my @path = split /$Config{'path_sep'}/, $path;
1139 for (@path) {
1140 $sendmail = "$_/sendmail", last if -e "$_/sendmail";
1141 $sendmail = "$_/sendmail.exe", last if -e "$_/sendmail.exe";
1142 }
1143 }
1144 return $sendmail;
1145}
1146
1147sub _send_message_sendmail {
1148 my $sendmail = _probe_for_sendmail();
1149 unless ($sendmail) {
1150 paraprint(<<"EOF"), die "\n";
1151It appears that there is no program which looks like "sendmail" on
1152your system and that the Mail::Send library from CPAN isn't available.
1153Because of this, there's no easy way to automatically send your
1154message.
1155
1156A copy of your message has been saved in '$filename' for you to
1157send to '$address' with your normal mail client.
1158EOF
1159 }
1160
1161 open( SENDMAIL, "|$sendmail -t -oi" )
1162 || die "'|$sendmail -t -oi' failed: $!";
1163 print SENDMAIL build_complete_message();
1164 if ( close(SENDMAIL) ) {
1165 print "\nMessage sent\n";
1166 } else {
1167 warn "\nSendmail returned status '", $? >> 8, "'\n";
1168 }
1169}
1170
1171
1172
1173# a strange way to check whether any significant editing
1174# has been done: check whether any new non-empty lines
1175# have been added.
1176
1177sub _fingerprint_lines_in_report {
1178 my $new_lines = 0;
1179 # read in the report template once so that
1180 # we can track whether the user does any editing.
1181 # yes, *all* whitespace is ignored.
1182
1183 open(REP, "<$filename") or die "Unable to open report file '$filename': $!\n";
1184 while (my $line = <REP>) {
1185 $line =~ s/\s+//g;
1186 $new_lines++ if (!$REP{$line});
1187
1188 }
1189 close(REP) or die "Error closing report file '$filename': $!";
1190 # returns the number of lines with content that wasn't there when last we looked
1191 return $new_lines;
1192}
1193
1194
1195
37fa004c 1196format STDOUT =
1197^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
1198$_
1199.
d121ca8c 1200
1201__END__
1202
1203=head1 NAME
1204
1205perlbug - how to submit bug reports on Perl
1206
1207=head1 SYNOPSIS
1208
54c90be1 1209B<perlbug>
1210
d121ca8c 1211B<perlbug> S<[ B<-v> ]> S<[ B<-a> I<address> ]> S<[ B<-s> I<subject> ]>
105f9295 1212S<[ B<-b> I<body> | B<-f> I<inputfile> ]> S<[ B<-F> I<outputfile> ]>
1213S<[ B<-r> I<returnaddress> ]>
d121ca8c 1214S<[ B<-e> I<editor> ]> S<[ B<-c> I<adminaddress> | B<-C> ]>
890b8eb0 1215S<[ B<-S> ]> S<[ B<-t> ]> S<[ B<-d> ]> S<[ B<-A> ]> S<[ B<-h> ]>
d121ca8c 1216
55d729e4 1217B<perlbug> S<[ B<-v> ]> S<[ B<-r> I<returnaddress> ]>
890b8eb0 1218 S<[ B<-A> ]> S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]>
1b0e3b9e 1219
d121ca8c 1220=head1 DESCRIPTION
1221
d121ca8c 1222
54c90be1 1223This program is designed to help you generate and send bug reports
1224(and thank-you notes) about perl5 and the modules which ship with it.
1225
1226In most cases, you can just run it interactively from a command
1227line without any special arguments and follow the prompts.
1228
1229If you have found a bug with a non-standard port (one that was not
1230part of the I<standard distribution>), a binary distribution, or a
1231non-core module (such as Tk, DBI, etc), then please see the
1232documentation that came with that distribution to determine the
1233correct place to report bugs.
d121ca8c 1234
54c90be1 1235If you are unable to send your report using B<perlbug> (most likely
1236because your system doesn't have a way to send mail that perlbug
1237recognizes), you may be able to use this tool to compose your report
1238and save it to a file which you can then send to B<perlbug@perl.org>
1239using your regular mail client.
d121ca8c 1240
54c90be1 1241In extreme cases, B<perlbug> may not work well enough on your system
1242to guide you through composing a bug report. In those cases, you
1243may be able to use B<perlbug -d> to get system configuration
1244information to include in a manually composed bug report to
1245B<perlbug@perl.org>.
d121ca8c 1246
54c90be1 1247
1248When reporting a bug, please run through this checklist:
d121ca8c 1249
1250=over 4
1251
884baa66 1252=item What version of Perl you are running?
d121ca8c 1253
1254Type C<perl -v> at the command line to find out.
1255
1256=item Are you running the latest released version of perl?
1257
54c90be1 1258Look at http://www.perl.org/ to find out. If you are not using the
1259latest released version, please try to replicate your bug on the
1260latest stable release.
1261
1262Note that reports about bugs in old versions of Perl, especially
1263those which indicate you haven't also tested the current stable
1264release of Perl, are likely to receive less attention from the
1265volunteers who build and maintain Perl than reports about bugs in
1266the current release.
1267
1268This tool isn't apropriate for reporting bugs in any version
1269prior to Perl 5.0.
d121ca8c 1270
1271=item Are you sure what you have is a bug?
1272
54c90be1 1273A significant number of the bug reports we get turn out to be
1274documented features in Perl. Make sure the issue you've run into
1275isn't intentional by glancing through the documentation that comes
1276with the Perl distribution.
d121ca8c 1277
54c90be1 1278Given the sheer volume of Perl documentation, this isn't a trivial
1279undertaking, but if you can point to documentation that suggests
1280the behaviour you're seeing is I<wrong>, your issue is likely to
1281receive more attention. You may want to start with B<perldoc>
1282L<perltrap> for pointers to common traps that new (and experienced)
1283Perl programmers run into.
d121ca8c 1284
54c90be1 1285If you're unsure of the meaning of an error message you've run
1286across, B<perldoc> L<perldiag> for an explanation. If the message
1287isn't in perldiag, it probably isn't generated by Perl. You may
1288have luck consulting your operating system documentation instead.
bdcdfa19 1289
54c90be1 1290If you are on a non-UNIX platform B<perldoc> L<perlport>, as some
1948c06a 1291features may be unimplemented or work differently.
bdcdfa19 1292
54c90be1 1293You may be able to figure out what's going wrong using the Perl
1294debugger. For information about how to use the debugger B<perldoc>
1295L<perldebug>.
d121ca8c 1296
1297=item Do you have a proper test case?
1298
1299The easier it is to reproduce your bug, the more likely it will be
54c90be1 1300fixed -- if nobody can duplicate your problem, it probably won't be
1301addressed.
1302
1303A good test case has most of these attributes: short, simple code;
1304few dependencies on external commands, modules, or libraries; no
1305platform-dependent code (unless it's a platform-specific bug);
1306clear, simple documentation.
1307
1308A good test case is almost always a good candidate to be included in
1309Perl's test suite. If you have the time, consider writing your test case so
1310that it can be easily included into the standard test suite.
d121ca8c 1311
54c90be1 1312=item Have you included all relevant information?
d121ca8c 1313
54c90be1 1314Be sure to include the B<exact> error messages, if any.
1315"Perl gave an error" is not an exact error message.
bdcdfa19 1316
1317If you get a core dump (or equivalent), you may use a debugger
1318(B<dbx>, B<gdb>, etc) to produce a stack trace to include in the bug
54c90be1 1319report.
1320
1321NOTE: unless your Perl has been compiled with debug info
bdcdfa19 1322(often B<-g>), the stack trace is likely to be somewhat hard to use
884baa66 1323because it will most probably contain only the function names and not
bdcdfa19 1324their arguments. If possible, recompile your Perl with debug info and
54c90be1 1325reproduce the crash and the stack trace.
bdcdfa19 1326
d121ca8c 1327=item Can you describe the bug in plain English?
1328
54c90be1 1329The easier it is to understand a reproducible bug, the more likely
1330it will be fixed. Any insight you can provide into the problem
1331will help a great deal. In other words, try to analyze the problem
1332(to the extent you can) and report your discoveries.
d121ca8c 1333
1334=item Can you fix the bug yourself?
1335
1336A bug report which I<includes a patch to fix it> will almost
54c90be1 1337definitely be fixed. When sending a patch, please use the C<diff>
1338program with the C<-u> option to generate "unified" diff files.
1339Bug reports with patches are likely to receive significantly more
1340attention and interest than those without patches.
1341
1342Your patch may be returned with requests for changes, or requests for more
d121ca8c 1343detailed explanations about your fix.
1344
54c90be1 1345Here are a few hints for creating high-quality patches:
1346
1347Make sure the patch is not reversed (the first argument to diff is
1348typically the original file, the second argument your changed file).
1349Make sure you test your patch by applying it with the C<patch>
1350program before you send it on its way. Try to follow the same style
1351as the code you are trying to patch. Make sure your patch really
1352does work (C<make test>, if the thing you're patching is covered
1353by Perl's test suite).
d121ca8c 1354
1355=item Can you use C<perlbug> to submit the report?
1356
1357B<perlbug> will, amongst other things, ensure your report includes
54c90be1 1358crucial information about your version of perl. If C<perlbug> is
1359unable to mail your report after you have typed it in, you may have
1360to compose the message yourself, add the output produced by C<perlbug
1361-d> and email it to B<perlbug@perl.org>. If, for some reason, you
1362cannot run C<perlbug> at all on your system, be sure to include the
1363entire output produced by running C<perl -V> (note the uppercase V).
d121ca8c 1364
bdcdfa19 1365Whether you use C<perlbug> or send the email manually, please make
54c90be1 1366your Subject line informative. "a bug" is not informative. Neither
1367is "perl crashes" nor is "HELP!!!". These don't help. A compact
1368description of what's wrong is fine.
bdcdfa19 1369
d121ca8c 1370=back
1371
54c90be1 1372Having done your bit, please be prepared to wait, to be told the
1373bug is in your code, or possibly to get no reply at all. The
1374volunteers who maintain Perl are busy folks, so if your problem is
1375an obvious bug in your own code, is difficult to understand or is
1376a duplicate of an existing report, you may not receive a personal
1377reply.
1378
26ab4e07 1379If it is important to you that your bug be fixed, do monitor the
54c90be1 1380perl5-porters@perl.org mailing list and the commit logs to development
1381versions of Perl, and encourage the maintainers with kind words or
1382offers of frosty beverages. (Please do be kind to the maintainers.
1383Harassing or flaming them is likely to have the opposite effect of
1384the one you want.)
1385
1386Feel free to update the ticket about your bug on http://rt.perl.org
1387if a new version of Perl is released and your bug is still present.
d121ca8c 1388
1389=head1 OPTIONS
1390
1391=over 8
1392
1393=item B<-a>
1394
3e79b69b 1395Address to send the report to. Defaults to B<perlbug@perl.org>.
d121ca8c 1396
890b8eb0 1397=item B<-A>
1398
1399Don't send a bug received acknowledgement to the reply address.
1400Generally it is only a sensible to use this option if you are a
1401perl maintainer actively watching perl porters for your message to
1402arrive.
1403
d121ca8c 1404=item B<-b>
1405
1406Body of the report. If not included on the command line, or
1407in a file with B<-f>, you will get a chance to edit the message.
1408
1409=item B<-C>
1410
1411Don't send copy to administrator.
1412
1413=item B<-c>
1414
1415Address to send copy of report to. Defaults to the address of the
1416local perl administrator (recorded when perl was built).
1417
1418=item B<-d>
1419
1420Data mode (the default if you redirect or pipe output). This prints out
1421your configuration data, without mailing anything. You can use this
1422with B<-v> to get more complete data.
1423
1424=item B<-e>
1425
55d729e4 1426Editor to use.
d121ca8c 1427
1428=item B<-f>
1429
1430File containing the body of the report. Use this to quickly send a
1431prepared message.
1432
105f9295 1433=item B<-F>
1434
1435File to output the results to instead of sending as an email. Useful
1436particularly when running perlbug on a machine with no direct internet
1437connection.
1438
d121ca8c 1439=item B<-h>
1440
1441Prints a brief summary of the options.
1442
1b0e3b9e 1443=item B<-ok>
1444
84902520 1445Report successful build on this system to perl porters. Forces B<-S>
1446and B<-C>. Forces and supplies values for B<-s> and B<-b>. Only
1b0e3b9e 1447prompts for a return address if it cannot guess it (for use with
84902520 1448B<make>). Honors return address specified with B<-r>. You can use this
1449with B<-v> to get more complete data. Only makes a report if this
1450system is less than 60 days old.
1451
1452=item B<-okay>
1453
1454As B<-ok> except it will report on older systems.
1b0e3b9e 1455
55d729e4 1456=item B<-nok>
1457
1458Report unsuccessful build on this system. Forces B<-C>. Forces and
1459supplies a value for B<-s>, then requires you to edit the report
1460and say what went wrong. Alternatively, a prepared report may be
1461supplied using B<-f>. Only prompts for a return address if it
1462cannot guess it (for use with B<make>). Honors return address
1463specified with B<-r>. You can use this with B<-v> to get more
1464complete data. Only makes a report if this system is less than 60
1465days old.
1466
1467=item B<-nokay>
1468
1469As B<-nok> except it will report on older systems.
1470
d121ca8c 1471=item B<-r>
1472
1473Your return address. The program will ask you to confirm its default
1474if you don't use this option.
1475
1476=item B<-S>
1477
1478Send without asking for confirmation.
1479
1480=item B<-s>
1481
1482Subject to include with the message. You will be prompted if you don't
1483supply one on the command line.
1484
1485=item B<-t>
1486
3e79b69b 1487Test mode. The target address defaults to B<perlbug-test@perl.org>.
d121ca8c 1488
1489=item B<-v>
1490
1491Include verbose configuration data in the report.
1492
1493=back
1494
1495=head1 AUTHORS
1496
54c90be1 1497Kenneth Albanowski (E<lt>kjahds@kjahds.comE<gt>), subsequently
1498I<doc>tored by Gurusamy Sarathy (E<lt>gsar@activestate.comE<gt>),
1499Tom Christiansen (E<lt>tchrist@perl.comE<gt>), Nathan Torkington
1500(E<lt>gnat@frii.comE<gt>), Charles F. Randall (E<lt>cfr@pobox.comE<gt>),
1501Mike Guy (E<lt>mjtg@cam.a.ukE<gt>), Dominic Dunlop
1502(E<lt>domo@computer.orgE<gt>), Hugo van der Sanden (E<lt>hv@crypt.org<gt>),
50d3c28b 1503Jarkko Hietaniemi (E<lt>jhi@iki.fiE<gt>), Chris Nandor
1504(E<lt>pudge@pobox.comE<gt>), Jon Orwant (E<lt>orwant@media.mit.eduE<gt>,
2402d92a 1505Richard Foley (E<lt>richard.foley@rfi.netE<gt>), and Jesse Vincent
54c90be1 1506(E<lt>jesse@bestpractical.com<gt>).
d121ca8c 1507
1508=head1 SEE ALSO
1509
bdcdfa19 1510perl(1), perldebug(1), perldiag(1), perlport(1), perltrap(1),
1511diff(1), patch(1), dbx(1), gdb(1)
d121ca8c 1512
1513=head1 BUGS
1514
1515None known (guess what must have been used to report them?)
1516
1517=cut
1518
37fa004c 1519!NO!SUBS!
1520
1521close OUT or die "Can't close $file: $!";
1522chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1523exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
8a5546a1 1524chdir $origdir;