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