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