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