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