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