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