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