7 use File::Basename qw(&basename &dirname);
9 use File::Spec::Functions;
11 # List explicitly here the variables you want Configure to
12 # generate. Metaconfig only looks for shell variables, so you
13 # have to mention them as if they were shell variables, not
14 # %Config entries. Thus you write
16 # to ensure Configure will look for $Config{startperl}.
19 # This forces PL files to create target in same directory as PL file.
20 # This is so that make depend always knows where to find PL derivatives.
23 my $file = basename($0, '.PL');
24 $file .= '.com' if $^O eq 'VMS';
26 open OUT, ">", $file or die "Can't create $file: $!";
28 # get patchlevel.h timestamp
30 -e catfile(updir, "patchlevel.h")
31 or die "Can't find patchlevel.h: $!";
33 my $patchlevel_date = (stat _)[9];
35 # TO DO (perhaps): store/embed $Config::config_sh into perlbug. When perlbug is
36 # used, compare $Config::config_sh with the stored version. If they differ then
37 # append a list of individual differences to the bug report.
40 print "Extracting $file (with variable substitutions)\n";
42 # In this section, perl variables will be expanded during extraction.
43 # You can use $Config{...} to use Configure variables.
45 my $extract_version = sprintf("%vd", $^V);
47 print OUT <<"!GROK!THIS!";
49 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
50 if 0; # ^ Run only under a shell
52 my \$config_tag1 = '$extract_version - $Config{cf_time}';
54 my \$patchlevel_date = $patchlevel_date;
57 # In the following, perl variables are not expanded during extraction.
59 print OUT <<'!NO!SUBS!';
60 my @patches = Config::local_patches();
61 my $patch_tags = join "", map /(\S+)/ ? "+$1 " : (), @patches;
63 BEGIN { pop @INC if $INC[-1] eq '.' }
67 use File::Spec; # keep perlbug Perl 5.005 compatible
69 use File::Basename 'basename';
71 $Getopt::Std::STANDARD_HELP_VERSION = 1;
76 eval { require Mail::Send;};
77 $::HaveSend = ($@ eq "");
78 eval { require Mail::Util; } ;
79 $::HaveUtil = ($@ eq "");
80 # use secure tempfiles wherever possible
81 eval { require File::Temp; };
82 $::HaveTemp = ($@ eq "");
83 eval { require Module::CoreList; };
84 $::HaveCoreList = ($@ eq "");
85 eval { require Text::Wrap; };
86 $::HaveWrap = ($@ eq "");
89 our $VERSION = "1.42";
92 # make sure failure (transmission-wise) of Mail::Send is accounted for.
93 # (This may work now. Unsure of the original author's issue -JESSE 2008-06-08)
96 my( $file, $usefile, $cc, $address, $thanksaddress,
97 $filename, $messageid, $domain, $subject, $from, $verbose, $ed, $outfile,
98 $fh, $me, $body, $andcc, %REP, $ok, $thanks, $progname,
99 $Is_MSWin32, $Is_Linux, $Is_VMS, $Is_OpenBSD,
100 $report_about_module, $category, $severity,
101 %opt, $have_attachment, $attachments, $has_patch, $mime_boundary
104 my $running_noninteractively = !-t STDIN;
106 my $perl_version = $^V ? sprintf("%vd", $^V) : $];
108 my $config_tag2 = "$perl_version - $Config{cf_time}";
112 if ($opt{h}) { Help(); exit; }
113 if ($opt{d}) { Dump(*STDOUT); exit; }
114 if ($running_noninteractively && !$opt{t} && !($ok and not $opt{n})) {
116 Please use $progname interactively. If you want to
117 include a file, you can use the -f switch.
123 Edit() unless $usefile || ($ok and not $opt{n});
128 print "\nThank you for taking the time to send a thank-you message!\n\n";
131 Please note that mailing lists are moderated, your message may take a while to
135 print "\nThank you for taking the time to file a bug report!\n\n";
138 Please note that mailing lists are moderated, your message may take a while to
139 show up. Please consider submitting your report directly to the issue tracker
140 at https://github.com/Perl/perl5/issues
145 save_message_to_disk($outfile);
150 sub ask_for_alternatives { # (category|severity)
156 # Inevitably some of these will end up in RT whatever we do:
157 'thanks' => 'thanks',
158 'opts' => [qw(core docs install library utilities)], # patch, notabug
164 'opts' => [qw(critical high medium low wishlist none)], # zero
167 die "Invalid alternative ($name) requested\n" unless grep(/^$name$/, keys %alts);
169 my $what = $ok || $thanks;
171 $alt = $alts{$name}{$what};
173 my @alts = @{$alts{$name}{'opts'}};
176 Please pick a $name from the following list:
183 die "Invalid $name: aborting.\n";
185 $alt = _prompt('', "\u$name", $alts{$name}{'default'});
186 $alt ||= $alts{$name}{'default'};
187 } while !((($alt) = grep(/^$alt/i, @alts)));
192 sub HELP_MESSAGE { Help(); exit; }
193 sub VERSION_MESSAGE { print "perlbug version $VERSION\n"; }
196 # -------- Setup --------
198 $Is_MSWin32 = $^O eq 'MSWin32';
199 $Is_VMS = $^O eq 'VMS';
200 $Is_Linux = lc($^O) eq 'linux';
201 $Is_OpenBSD = lc($^O) eq 'openbsd';
204 $thanksaddress = 'perl-thanks@perl.org';
206 # Defaults if getopts fails.
207 $outfile = (basename($0) =~ /^perlthanks/i) ? "perlthanks.rep" : "perlbug.rep";
208 $cc = $::Config{'perladmin'} || $::Config{'cf_email'} || $::Config{'cf_by'} || '';
210 HELP_MESSAGE() unless getopts("Adhva:s:b:f:F:r:e:SCc:to:n:T:p:", \%opt);
212 # This comment is needed to notify metaconfig that we are
213 # using the $perladmin, $cf_by, and $cf_time definitions.
214 # -------- Configuration ---------
216 if (basename ($0) =~ /^perlthanks/i) {
217 # invoked as perlthanks
219 $opt{C} = 1; # don't send a copy to the local admin
226 $progname = $thanks ? 'perlthanks' : 'perlbug';
228 $address = $opt{a} || ($thanks ? $thanksaddress : "");
230 # Users address, used in message and in From and Reply-To headers
231 $from = $opt{r} || "";
233 # Include verbose configuration information
234 $verbose = $opt{v} || 0;
236 # Subject of bug-report message
237 $subject = $opt{s} || "";
240 $usefile = ($opt{f} || 0);
242 # File to send as report
243 $file = $opt{f} || "";
245 # We have one or more attachments
246 $have_attachment = ($opt{p} || 0);
247 $mime_boundary = ('-' x 12) . "$VERSION.perlbug" if $have_attachment;
249 # Comma-separated list of attachments
250 $attachments = $opt{p} || "";
251 $has_patch = 0; # TBD based on file type
253 for my $attachment (split /\s*,\s*/, $attachments) {
254 unless (-f $attachment && -r $attachment) {
255 die "The attachment $attachment is not a readable file: $!\n";
257 $has_patch = 1 if $attachment =~ m/\.(patch|diff)$/;
261 $outfile = $opt{F} || "$progname.rep";
264 $body = $opt{b} || "";
267 $ed = $opt{e} || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT}
268 || ($Is_VMS && "edit/tpu")
269 || ($Is_MSWin32 && "notepad")
272 # Not OK - provide build failure template by finessing OK report
274 if (substr($opt{n}, 0, 2) eq 'ok' ) {
275 $opt{o} = substr($opt{n}, 1);
282 # OK - send "OK" report for build on this system
285 if ($opt{o} eq 'k' or $opt{o} eq 'kay') {
286 my $age = time - $patchlevel_date;
287 if ($opt{o} eq 'k' and $age > 60 * 24 * 60 * 60 ) {
288 my $date = localtime $patchlevel_date;
290 "perlbug -ok" and "perlbug -nok" do not report on Perl versions which
291 are more than 60 days old. This Perl version was constructed on
292 $date. If you really want to report this, use
293 "perlbug -okay" or "perlbug -nokay".
297 # force these options
299 $opt{S} = 1; # don't prompt for send
300 $opt{b} = 1; # we have a body
301 $body = "Perl reported to build OK on this system.\n";
303 $opt{C} = 1; # don't send a copy to the local admin
304 $opt{s} = 1; # we have a subject line
305 $subject = ($opt{n} ? 'Not ' : '')
306 . "OK: perl $perl_version ${patch_tags}on"
307 ." $::Config{'archname'} $::Config{'osvers'} $subject";
315 # Possible administrator addresses, in order of confidence
316 # (Note that cf_email is not mentioned to metaconfig, since
317 # we don't really want it. We'll just take it if we have to.)
319 # This has to be after the $ok stuff above because of the way
320 # that $opt{C} is forced.
321 $cc = $opt{C} ? "" : (
322 $opt{c} || $::Config{'perladmin'}
323 || $::Config{'cf_email'} || $::Config{'cf_by'}
327 $domain = Mail::Util::maildomain();
328 } elsif ($Is_MSWin32) {
329 $domain = $ENV{'USERDOMAIN'};
331 require Sys::Hostname;
332 $domain = Sys::Hostname::hostname();
336 $messageid = "<$::Config{'version'}_${$}_".time."\@$domain>";
339 $me = $Is_MSWin32 ? $ENV{'USERNAME'}
340 : $^O eq 'os2' ? $ENV{'USER'} || $ENV{'LOGNAME'}
341 : eval { getpwuid($<) }; # May be missing
343 $from = $::Config{'cf_email'}
344 if !$from && $::Config{'cf_email'} && $::Config{'cf_by'} && $me &&
345 ($me eq $::Config{'cf_by'});
349 # Explain what perlbug is
353 This program provides an easy way to send a thank-you message back to the
354 authors and maintainers of perl.
356 If you wish to generate a bug report, please run it without the -T flag
357 (or run the program perlbug rather than perlthanks)
361 This program provides an easy way to generate a bug report for the core
362 perl distribution (along with tests or patches). To send a thank-you
363 note to $thanksaddress instead of a bug report, please run 'perlthanks'.
365 The GitHub issue tracker at https://github.com/Perl/perl5/issues is the
366 best place to submit your report so it can be tracked and resolved.
368 Please do not use $0 to report bugs in perl modules from CPAN.
370 Suggestions for how to find help using Perl can be found at
371 https://perldoc.perl.org/perlcommunity.html
376 # Prompt for subject of message, if needed
378 if ($subject && TrivialSubject($subject)) {
384 "First of all, please provide a subject for the report.\n";
387 This should be a concise description of your bug or problem
388 which will help the volunteers working to improve perl to categorize
389 and resolve the issue. Be as specific and descriptive as
390 you can. A subject like "perl bug" or "perl problem" will make it
391 much less likely that your issue gets the attention it deserves.
397 $subject = _prompt('','Subject');
400 $subject = 'Thanks for Perl';
405 } while (TrivialSubject($subject));
407 $subject = '[PATCH] ' . $subject
408 if $has_patch && ($subject !~ m/^\[PATCH/i);
410 # Prompt for return address, if needed
412 # Try and guess return address
415 $guess = $ENV{'REPLY-TO'} || $ENV{'REPLYTO'} || $ENV{'EMAIL'}
419 # move $domain to where we can use it elsewhere
421 if ($Is_VMS && !$::Config{'d_socket'}) {
422 $guess = "$domain\:\:$me";
424 $guess = "$me\@$domain" if $domain;
432 Perl's developers may need your email address to contact you for
433 further information about your issue or to inform you when it is
434 resolved. If the default shown is not your email address, please
440 Please enter your full internet email address so that Perl's
441 developers can contact you with questions about your issue or to
442 inform you that it has been resolved.
451 $from = _prompt('','Your address',$guess);
452 $from = $guess if $from eq '';
456 if ($from eq $cc or $me eq $cc) {
457 # Try not to copy ourselves
461 # Prompt for administrator address, unless an override was given
462 if( $address and !$opt{C} and !$opt{c} ) {
463 my $description = <<EOF;
464 $0 can send a copy of this report to your local perl
465 administrator. If the address below is wrong, please correct it,
466 or enter 'none' or 'yourself' to not send a copy.
468 my $entry = _prompt($description, "Local perl administrator", $cc);
472 $cc = '' if $me eq $cc;
476 $cc = '' if $cc =~ /^(none|yourself|me|myself|ourselves)$/i;
483 # Prompt for editor, if no override is given
485 unless ($opt{e} || $opt{f} || $opt{b}) {
489 chomp (my $common_end = <<"EOF");
490 You will probably want to use a text editor to enter the body of
491 your report. If "$ed" is the editor you want to use, then just press
492 Enter, otherwise type in the name of the editor you would like to
495 If you have already composed the body of your report, you may enter
496 "file", and $0 will prompt you to enter the name of the file
497 containing your report.
501 $description = <<"EOF";
502 It's now time to compose your thank-you message.
504 Some information about your local perl configuration will automatically
505 be included at the end of your message, because we're curious about
506 the different ways that people build and use perl. If you'd rather
507 not share this information, you're welcome to delete it.
512 $description = <<"EOF";
513 It's now time to compose your bug report. Try to make the report
514 concise but descriptive. Please include any detail which you think
515 might be relevant or might help the volunteers working to improve
516 perl. If you are reporting something that does not work as you think
517 it should, please try to include examples of the actual result and of
520 Some information about your local perl configuration will automatically
521 be included at the end of your report. If you are using an unusual
522 version of perl, it would be useful if you could confirm that you
523 can replicate the problem on a standard build of perl as well.
529 my $entry = _prompt($description, "Editor", $ed);
531 if ($entry eq "file") {
533 } elsif ($entry ne "") {
537 if ($::HaveCoreList && !$ok && !$thanks) {
538 my $description = <<EOF;
539 If your bug is about a Perl module rather than a core language
540 feature, please enter its name here. If it's not, just hit Enter
541 to skip this question.
545 while ($entry eq '') {
546 $entry = _prompt($description, 'Module');
547 my $first_release = Module::CoreList->first_release($entry);
548 if ($entry and not $first_release) {
550 $entry is not a "core" Perl module. Please check that you entered
551 its name correctly. If it is correct, quit this program, try searching
552 for $entry on https://rt.cpan.org, and report your issue there.
556 } elsif (my $bug_tracker = $Module::CoreList::bug_tracker{$entry}) {
558 $entry included with core Perl is copied directly from the CPAN distribution.
559 Please report bugs in $entry directly to its maintainers using $bug_tracker
563 $category ||= 'library';
564 $report_about_module = $entry;
572 # Prompt for category of bug
573 $category ||= ask_for_alternatives('category');
575 # Prompt for severity of bug
576 $severity ||= ask_for_alternatives('severity');
578 # Generate scratch file to edit report in
579 $filename = filename();
581 # Prompt for file to read report from, if needed
582 if ($usefile and !$file) {
584 my $description = <<EOF;
585 What is the name of the file that contains your report?
587 my $entry = _prompt($description, "Filename");
591 It seems you didn't enter a filename. Please choose to use a text
592 editor or enter a filename.
597 unless (-f $entry and -r $entry) {
599 '$entry' doesn't seem to be a readable file. You may have mistyped
600 its name or may not have permission to read it.
602 If you don't want to use a file as the content of your report, just
603 hit Enter and you'll be able to select a text editor instead.
611 open(REP, '>:raw', $filename) or die "Unable to create report file '$filename': $!\n";
612 binmode(REP, ':raw :crlf') if $Is_MSWin32;
614 my $reptype = !$ok ? ($thanks ? 'thank-you' : 'bug')
615 : $opt{n} ? "build failure" : "success";
618 This is a $reptype report for perl from $from,
619 generated with the help of perlbug $VERSION running under perl $perl_version.
626 open(F, '<:raw', $file)
627 or die "Unable to read report file from '$file': $!\n";
628 binmode(F, ':raw :crlf') if $Is_MSWin32;
632 close(F) or die "Error closing '$file': $!";
637 -----------------------------------------------------------------
638 [Please enter your thank-you message here]
642 [You're welcome to delete anything below this line]
643 -----------------------------------------------------------------
648 -----------------------------------------------------------------
649 [Please describe your issue here]
653 [Please do not change anything below this line]
654 -----------------------------------------------------------------
659 close(REP) or die "Error closing report file: $!";
661 # Set up an initial report fingerprint so we can compare it later
662 _fingerprint_lines_in_report();
669 # these won't have been set if run with -d
670 $category ||= 'core';
687 if ($report_about_module ) {
689 module=$report_about_module
695 print OUT "This perlbug was built using Perl $config_tag1\n",
696 "It is being executed now by Perl $config_tag2.\n\n"
697 if $config_tag2 ne $config_tag1;
700 Site configuration information for perl $perl_version:
703 if ($::Config{cf_by} and $::Config{cf_time}) {
704 print OUT "Configured by $::Config{cf_by} at $::Config{cf_time}.\n\n";
706 print OUT Config::myconfig;
709 print OUT join "\n ", "Locally applied patches:", @patches;
716 \@INC for perl $perl_version:
725 Environment for perl $perl_version:
728 qw(PATH LD_LIBRARY_PATH LANG PERL_BADLANG SHELL HOME LOGDIR LANGUAGE);
729 push @env, $Config{ldlibpthname} if $Config{ldlibpthname} ne '';
730 push @env, grep /^(?:PERL|LC_|LANG|CYGWIN)/, keys %ENV;
733 for my $env (sort keys %env) {
735 exists $ENV{$env} ? "=$ENV{$env}" : ' (unset)',
739 print OUT "\nComplete configuration data for perl $perl_version:\n\n";
741 foreach (sort keys %::Config) {
742 $value = $::Config{$_};
743 $value = '' unless defined $value;
745 print OUT "$_='$value'\n";
752 if ($usefile || $body) {
753 my $description = "Please make sure that the name of the editor you want to use is correct.";
754 my $entry = _prompt($description, 'Editor', $ed);
755 $ed = $entry unless $entry eq '';
758 _edit_file($ed) unless $running_noninteractively;
764 my $report_written = 0;
766 while ( !$report_written ) {
767 my $exit_status = system("$editor $filename");
770 The editor you chose ('$editor') could not be run!
772 If you mistyped its name, please enter it now, otherwise just press Enter.
774 my $entry = _prompt( $desc, 'Editor', $editor );
775 if ( $entry ne "" ) {
780 You can edit your report after saving it to a file.
785 return if ( $ok and not $opt{n} ) || $body;
787 # Check that we have a report that has some, eh, report in it.
789 unless ( _fingerprint_lines_in_report() ) {
790 my $description = <<EOF;
791 It looks like you didn't enter a report. You may [r]etry your edit
792 or [c]ancel this report.
794 my $action = _prompt( $description, "Action (Retry/Cancel) " );
795 if ( $action =~ /^[re]/i ) { # <R>etry <E>dit
797 } elsif ( $action =~ /^[cq]/i ) { # <C>ancel, <Q>uit
798 Cancel(); # cancel exits
801 # Ok. the user did what they needed to;
809 1 while unlink($filename); # remove all versions under VMS
810 print "\nQuitting without generating a report.\n";
815 # Report is done, prompt for further action
818 my $send_to = $address || 'the Perl developers';
822 You have finished composing your report. At this point, you have
823 a few options. You can:
825 * Save the report to a [f]ile
826 * [Se]nd the report to $send_to$andcc
827 * [D]isplay the report on the screen
828 * [R]e-edit the report
829 * Display or change the report's [su]bject
830 * [Q]uit without generating the report
835 my $action = _prompt('', "Action (Save/Send/Display/Edit/Subject/Quit)",
838 if ($action =~ /^(f|sa)/i) { # <F>ile/<Sa>ve
839 if ( SaveMessage() ) { exit }
840 } elsif ($action =~ /^(d|l|sh)/i ) { # <D>isplay, <L>ist, <Sh>ow
841 # Display the message
842 print _read_report($filename);
843 if ($have_attachment) {
844 print "\n\n---\nAttachment(s):\n";
845 for my $att (split /\s*,\s*/, $attachments) { print " $att\n"; }
847 } elsif ($action =~ /^su/i) { # <Su>bject
848 my $reply = _prompt( "Subject: $subject", "If the above subject is fine, press Enter. Otherwise, type a replacement now\nSubject");
850 unless (TrivialSubject($reply)) {
852 print "Subject: $subject\n";
855 } elsif ($action =~ /^se/i) { # <S>end
859 To ensure your issue can be best tracked and resolved,
860 you should submit it to the GitHub issue tracker at
861 https://github.com/Perl/perl5/issues
864 my $reply = _prompt( "Are you certain you want to send this report to $send_to$andcc?", 'Please type "yes" if you are','no');
865 if ($reply =~ /^yes$/) {
866 $address ||= 'perl5-porters@perl.org';
870 You didn't type "yes", so your report has not been sent.
873 } elsif ($action =~ /^[er]/i) { # <E>dit, <R>e-edit
876 } elsif ($action =~ /^[qc]/i) { # <C>ancel, <Q>uit
878 } elsif ($action =~ /^s/i) {
880 The command you entered was ambiguous. Please type "send", "save" or "subject".
890 /^(y(es)?|no?|help|perl( (bug|problem))?|bug|problem)$/i ||
891 length($subject) < 4 ||
892 ($subject !~ /\s/ && ! $opt{t})) { # non-whitespace is accepted in test mode
893 print "\nThe subject you entered wasn't very descriptive. Please try again.\n\n";
901 my $file = _prompt( '', "Name of file to save report in", $outfile );
902 save_message_to_disk($file) || return undef;
908 # Message has been accepted for transmission -- Send the message
910 # on linux certain "mail" implementations won't accept the subject
911 # as "~s subject" and thus the Subject header will be corrupted
912 # so don't use Mail::Send to be safe
914 if ( $::HaveSend && !$Is_Linux && !$Is_OpenBSD ) {
915 _send_message_mailsend();
919 _send_message_sendmail();
923 if ( my $error = $@ ) {
925 $0 has detected an error while trying to send your message: $error.
927 Your message may not have been sent. You will now have a chance to save a copy to disk.
933 1 while unlink($filename); # remove all versions under VMS
939 This program is designed to help you generate bug reports
940 (and thank-you notes) about perl5 and the modules which ship with it.
942 In most cases, you can just run "$0" interactively from a command
943 line without any special arguments and follow the prompts.
947 $0 [-v] [-a address] [-s subject] [-b body | -f inpufile ] [ -F outputfile ]
948 [-r returnaddress] [-e editor] [-c adminaddress | -C] [-S] [-t] [-h]
950 $0 [-v] [-r returnaddress] [-ok | -okay | -nok | -nokay]
955 -v Include Verbose configuration data in the report
956 -f File containing the body of the report. Use this to
957 quickly send a prepared report.
958 -p File containing a patch or other text attachment. Separate
959 multiple files with commas.
960 -F File to output the resulting report to. Defaults to
962 -S Save or send the report without asking for confirmation.
963 -a Send the report to this address, instead of saving to a file.
964 -c Address to send copy of report to. Defaults to '$cc'.
965 -C Don't send copy to administrator.
966 -s Subject to include with the report. You will be prompted
967 if you don't supply one on the command line.
968 -b Body of the report. If not included on the command line, or
969 in a file with -f, you will get a chance to edit the report.
970 -r Your return address. The program will ask you to confirm
971 this if you don't give it here.
974 -T Thank-you mode. The target address defaults to '$thanksaddress'.
975 -d Data mode. This prints out your configuration data, without mailing
976 anything. You can use this with -v to get more complete data.
977 -ok Report successful build on this system to perl porters
978 (use alone or with -v). Only use -ok if *everything* was ok:
979 if there were *any* problems at all, use -nok.
980 -okay As -ok but allow report from old builds.
981 -nok Report unsuccessful build on this system to perl porters
982 (use alone or with -v). You must describe what went wrong
983 in the body of the report which you will be asked to edit.
984 -nokay As -nok but allow report from old builds.
985 -h Print this help message.
992 # Good. Use a secure temp file
993 my ($fh, $filename) = File::Temp::tempfile(UNLINK => 1);
997 # Bah. Fall back to doing things less securely.
998 my $dir = File::Spec->tmpdir();
999 $filename = "bugrep0$$";
1000 $filename++ while -e File::Spec->catfile($dir, $filename);
1001 $filename = File::Spec->catfile($dir, $filename);
1006 my @paragraphs = split /\n{2,}/, "@_";
1007 for (@paragraphs) { # implicit local $_
1015 my ($explanation, $prompt, $default) = (@_);
1018 paraprint $explanation;
1020 print $prompt. ($default ? " [$default]" :''). ": ";
1021 my $result = scalar(<>);
1022 return $default if !defined $result; # got eof
1024 $result =~ s/^\s*(.*?)\s*$/$1/s;
1025 if ($default && $result eq '') {
1036 for my $header (keys %attr) {
1037 $head .= "$header: ".$attr{$header}."\n";
1042 sub _message_headers {
1043 my %headers = ( To => $address || 'perl5-porters@perl.org', Subject => $subject );
1044 $headers{'Cc'} = $cc if ($cc);
1045 $headers{'Message-Id'} = $messageid if ($messageid);
1046 $headers{'Reply-To'} = $from if ($from);
1047 $headers{'From'} = $from if ($from);
1048 if ($have_attachment) {
1049 $headers{'MIME-Version'} = '1.0';
1050 $headers{'Content-Type'} = qq{multipart/mixed; boundary=\"$mime_boundary\"};
1055 sub _add_body_start {
1056 my $body_start = <<"BODY_START";
1057 This is a multi-part message in MIME format.
1059 Content-Type: text/plain; format=fixed
1060 Content-Transfer-Encoding: 8bit
1066 sub _add_attachments {
1068 for my $attachment (split /\s*,\s*/, $attachments) {
1069 my $attach_file = basename($attachment);
1070 $attach .= <<"ATTACHMENT";
1073 Content-Type: text/x-patch; name="$attach_file"
1074 Content-Transfer-Encoding: 8bit
1075 Content-Disposition: attachment; filename="$attach_file"
1079 open my $attach_fh, '<:raw', $attachment
1080 or die "Couldn't open attachment '$attachment': $!\n";
1081 while (<$attach_fh>) { $attach .= $_; }
1082 close($attach_fh) or die "Error closing attachment '$attachment': $!";
1085 $attach .= "\n--$mime_boundary--\n";
1092 open( REP, "<:raw", $fname ) or die "Couldn't open file '$fname': $!\n";
1093 binmode(REP, ':raw :crlf') if $Is_MSWin32;
1094 # wrap long lines to make sure the report gets delivered
1095 local $Text::Wrap::columns = 900;
1096 local $Text::Wrap::huge = 'overflow';
1098 if ($::HaveWrap && /\S/) { # wrap() would remove empty lines
1099 $content .= Text::Wrap::wrap(undef, undef, $_);
1104 close(REP) or die "Error closing report file '$fname': $!";
1108 sub build_complete_message {
1109 my $content = _build_header(%{_message_headers()}) . "\n\n";
1110 $content .= _add_body_start() if $have_attachment;
1111 $content .= _read_report($filename);
1112 $content .= _add_attachments() if $have_attachment;
1116 sub save_message_to_disk {
1120 my $response = _prompt( '', "Overwrite existing '$file'", 'n' );
1121 return undef unless $response =~ / yes | y /xi;
1123 open OUTFILE, '>:raw', $file or do { warn "Couldn't open '$file': $!\n"; return undef};
1124 binmode(OUTFILE, ':raw :crlf') if $Is_MSWin32;
1126 print OUTFILE build_complete_message();
1127 close(OUTFILE) or do { warn "Error closing $file: $!"; return undef };
1128 print "\nReport saved to '$file'. Please submit it to https://github.com/Perl/perl5/issues\n";
1132 sub _send_message_vms {
1134 my $mail_from = $from;
1135 my $rcpt_to_to = $address;
1136 my $rcpt_to_cc = $cc;
1138 map { $_ =~ s/^[^<]*<//;
1139 $_ =~ s/>[^>]*//; } ($mail_from, $rcpt_to_to, $rcpt_to_cc);
1141 if ( open my $sff_fh, '|-:raw', 'MCR TCPIP$SYSTEM:TCPIP$SMTP_SFF.EXE SYS$INPUT:' ) {
1142 print $sff_fh "MAIL FROM:<$mail_from>\n";
1143 print $sff_fh "RCPT TO:<$rcpt_to_to>\n";
1144 print $sff_fh "RCPT TO:<$rcpt_to_cc>\n" if $rcpt_to_cc;
1145 print $sff_fh "DATA\n";
1146 print $sff_fh build_complete_message();
1147 my $success = close $sff_fh;
1149 print "\nMessage sent\n";
1153 die "Mail transport failed (leaving bug report in $filename): $^E\n";
1156 sub _send_message_mailsend {
1157 my $msg = Mail::Send->new();
1158 my %headers = %{_message_headers()};
1159 for my $key ( keys %headers) {
1160 $msg->add($key => $headers{$key});
1164 binmode($fh, ':raw');
1165 print $fh _add_body_start() if $have_attachment;
1166 print $fh _read_report($filename);
1167 print $fh _add_attachments() if $have_attachment;
1168 $fh->close or die "Error sending mail: $!";
1170 print "\nMessage sent.\n";
1173 sub _probe_for_sendmail {
1175 for (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail)) {
1176 $sendmail = $_, last if -e $_;
1178 if ( $^O eq 'os2' and $sendmail eq "" ) {
1179 my $path = $ENV{PATH};
1181 my @path = split /$Config{'path_sep'}/, $path;
1183 $sendmail = "$_/sendmail", last if -e "$_/sendmail";
1184 $sendmail = "$_/sendmail.exe", last if -e "$_/sendmail.exe";
1190 sub _send_message_sendmail {
1191 my $sendmail = _probe_for_sendmail();
1192 unless ($sendmail) {
1193 my $message_start = !$Is_Linux && !$Is_OpenBSD ? <<'EOT' : <<'EOT';
1194 It appears that there is no program which looks like "sendmail" on
1195 your system and that the Mail::Send library from CPAN isn't available.
1197 It appears that there is no program which looks like "sendmail" on
1200 paraprint(<<"EOF"), die "\n";
1202 Because of this, there's no easy way to automatically send your
1205 A copy of your report has been saved in '$filename' for you to
1206 send to '$address' with your normal mail client.
1210 open( SENDMAIL, "|-:raw", $sendmail, "-t", "-oi", "-f", $from )
1211 || die "'|$sendmail -t -oi -f $from' failed: $!";
1212 print SENDMAIL build_complete_message();
1213 if ( close(SENDMAIL) ) {
1214 print "\nMessage sent\n";
1216 warn "\nSendmail returned status '", $? >> 8, "'\n";
1222 # a strange way to check whether any significant editing
1223 # has been done: check whether any new non-empty lines
1226 sub _fingerprint_lines_in_report {
1228 # read in the report template once so that
1229 # we can track whether the user does any editing.
1230 # yes, *all* whitespace is ignored.
1232 open(REP, '<:raw', $filename) or die "Unable to open report file '$filename': $!\n";
1233 binmode(REP, ':raw :crlf') if $Is_MSWin32;
1234 while (my $line = <REP>) {
1236 $new_lines++ if (!$REP{$line});
1239 close(REP) or die "Error closing report file '$filename': $!";
1240 # returns the number of lines with content that wasn't there when last we looked
1247 ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
1255 perlbug - how to submit bug reports on Perl
1261 B<perlbug> S<[ B<-v> ]> S<[ B<-a> I<address> ]> S<[ B<-s> I<subject> ]>
1262 S<[ B<-b> I<body> | B<-f> I<inputfile> ]> S<[ B<-F> I<outputfile> ]>
1263 S<[ B<-r> I<returnaddress> ]>
1264 S<[ B<-e> I<editor> ]> S<[ B<-c> I<adminaddress> | B<-C> ]>
1265 S<[ B<-S> ]> S<[ B<-t> ]> S<[ B<-d> ]> S<[ B<-h> ]> S<[ B<-T> ]>
1267 B<perlbug> S<[ B<-v> ]> S<[ B<-r> I<returnaddress> ]>
1268 S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]>
1275 This program is designed to help you generate bug reports
1276 (and thank-you notes) about perl5 and the modules which ship with it.
1278 In most cases, you can just run it interactively from a command
1279 line without any special arguments and follow the prompts.
1281 If you have found a bug with a non-standard port (one that was not
1282 part of the I<standard distribution>), a binary distribution, or a
1283 non-core module (such as Tk, DBI, etc), then please see the
1284 documentation that came with that distribution to determine the
1285 correct place to report bugs.
1287 Bug reports should be submitted to the GitHub issue tracker at
1288 L<https://github.com/Perl/perl5/issues>. The B<perlbug@perl.org>
1289 address no longer automatically opens tickets. You can use this tool
1290 to compose your report and save it to a file which you can then submit
1291 to the issue tracker.
1293 In extreme cases, B<perlbug> may not work well enough on your system
1294 to guide you through composing a bug report. In those cases, you
1295 may be able to use B<perlbug -d> or B<perl -V> to get system
1296 configuration information to include in your issue report.
1299 When reporting a bug, please run through this checklist:
1303 =item What version of Perl you are running?
1305 Type C<perl -v> at the command line to find out.
1307 =item Are you running the latest released version of perl?
1309 Look at L<http://www.perl.org/> to find out. If you are not using the
1310 latest released version, please try to replicate your bug on the
1311 latest stable release.
1313 Note that reports about bugs in old versions of Perl, especially
1314 those which indicate you haven't also tested the current stable
1315 release of Perl, are likely to receive less attention from the
1316 volunteers who build and maintain Perl than reports about bugs in
1317 the current release.
1319 =item Are you sure what you have is a bug?
1321 A significant number of the bug reports we get turn out to be
1322 documented features in Perl. Make sure the issue you've run into
1323 isn't intentional by glancing through the documentation that comes
1324 with the Perl distribution.
1326 Given the sheer volume of Perl documentation, this isn't a trivial
1327 undertaking, but if you can point to documentation that suggests
1328 the behaviour you're seeing is I<wrong>, your issue is likely to
1329 receive more attention. You may want to start with B<perldoc>
1330 L<perltrap> for pointers to common traps that new (and experienced)
1331 Perl programmers run into.
1333 If you're unsure of the meaning of an error message you've run
1334 across, B<perldoc> L<perldiag> for an explanation. If the message
1335 isn't in perldiag, it probably isn't generated by Perl. You may
1336 have luck consulting your operating system documentation instead.
1338 If you are on a non-UNIX platform B<perldoc> L<perlport>, as some
1339 features may be unimplemented or work differently.
1341 You may be able to figure out what's going wrong using the Perl
1342 debugger. For information about how to use the debugger B<perldoc>
1345 =item Do you have a proper test case?
1347 The easier it is to reproduce your bug, the more likely it will be
1348 fixed -- if nobody can duplicate your problem, it probably won't be
1351 A good test case has most of these attributes: short, simple code;
1352 few dependencies on external commands, modules, or libraries; no
1353 platform-dependent code (unless it's a platform-specific bug);
1354 clear, simple documentation.
1356 A good test case is almost always a good candidate to be included in
1357 Perl's test suite. If you have the time, consider writing your test case so
1358 that it can be easily included into the standard test suite.
1360 =item Have you included all relevant information?
1362 Be sure to include the B<exact> error messages, if any.
1363 "Perl gave an error" is not an exact error message.
1365 If you get a core dump (or equivalent), you may use a debugger
1366 (B<dbx>, B<gdb>, etc) to produce a stack trace to include in the bug
1369 NOTE: unless your Perl has been compiled with debug info
1370 (often B<-g>), the stack trace is likely to be somewhat hard to use
1371 because it will most probably contain only the function names and not
1372 their arguments. If possible, recompile your Perl with debug info and
1373 reproduce the crash and the stack trace.
1375 =item Can you describe the bug in plain English?
1377 The easier it is to understand a reproducible bug, the more likely
1378 it will be fixed. Any insight you can provide into the problem
1379 will help a great deal. In other words, try to analyze the problem
1380 (to the extent you can) and report your discoveries.
1382 =item Can you fix the bug yourself?
1384 If so, that's great news; bug reports with patches are likely to
1385 receive significantly more attention and interest than those without
1386 patches. Please submit your patch via the GitHub Pull Request workflow
1387 as described in B<perldoc> L<perlhack>. You may also send patches to
1388 B<perl5-porters@perl.org>. When sending a patch, create it using
1389 C<git format-patch> if possible, though a unified diff created with
1390 C<diff -pu> will do nearly as well.
1392 Your patch may be returned with requests for changes, or requests for more
1393 detailed explanations about your fix.
1395 Here are a few hints for creating high-quality patches:
1397 Make sure the patch is not reversed (the first argument to diff is
1398 typically the original file, the second argument your changed file).
1399 Make sure you test your patch by applying it with C<git am> or the
1400 C<patch> program before you send it on its way. Try to follow the
1401 same style as the code you are trying to patch. Make sure your patch
1402 really does work (C<make test>, if the thing you're patching is covered
1403 by Perl's test suite).
1405 =item Can you use C<perlbug> to submit a thank-you note?
1407 Yes, you can do this by either using the C<-T> option, or by invoking
1408 the program as C<perlthanks>. Thank-you notes are good. It makes people
1413 Please make your issue title informative. "a bug" is not informative.
1414 Neither is "perl crashes" nor is "HELP!!!". These don't help. A compact
1415 description of what's wrong is fine.
1417 Having done your bit, please be prepared to wait, to be told the
1418 bug is in your code, or possibly to get no reply at all. The
1419 volunteers who maintain Perl are busy folks, so if your problem is
1420 an obvious bug in your own code, is difficult to understand or is
1421 a duplicate of an existing report, you may not receive a personal
1424 If it is important to you that your bug be fixed, do monitor the
1425 issue tracker (you will be subscribed to notifications for issues you
1426 submit or comment on) and the commit logs to development
1427 versions of Perl, and encourage the maintainers with kind words or
1428 offers of frosty beverages. (Please do be kind to the maintainers.
1429 Harassing or flaming them is likely to have the opposite effect of the
1432 Feel free to update the ticket about your bug on
1433 L<https://github.com/Perl/perl5/issues>
1434 if a new version of Perl is released and your bug is still present.
1442 Address to send the report to instead of saving to a file.
1446 Body of the report. If not included on the command line, or
1447 in a file with B<-f>, you will get a chance to edit the report.
1451 Don't send copy to administrator when sending report by mail.
1455 Address to send copy of report to when sending report by mail.
1456 Defaults to the address of the
1457 local perl administrator (recorded when perl was built).
1461 Data mode (the default if you redirect or pipe output). This prints out
1462 your configuration data, without saving or mailing anything. You can use
1463 this with B<-v> to get more complete data.
1471 File containing the body of the report. Use this to quickly send a
1476 File to output the results to. Defaults to B<perlbug.rep>.
1480 Prints a brief summary of the options.
1484 Report successful build on this system to perl porters. Forces B<-S>
1485 and B<-C>. Forces and supplies values for B<-s> and B<-b>. Only
1486 prompts for a return address if it cannot guess it (for use with
1487 B<make>). Honors return address specified with B<-r>. You can use this
1488 with B<-v> to get more complete data. Only makes a report if this
1489 system is less than 60 days old.
1493 As B<-ok> except it will report on older systems.
1497 Report unsuccessful build on this system. Forces B<-C>. Forces and
1498 supplies a value for B<-s>, then requires you to edit the report
1499 and say what went wrong. Alternatively, a prepared report may be
1500 supplied using B<-f>. Only prompts for a return address if it
1501 cannot guess it (for use with B<make>). Honors return address
1502 specified with B<-r>. You can use this with B<-v> to get more
1503 complete data. Only makes a report if this system is less than 60
1508 As B<-nok> except it will report on older systems.
1512 The names of one or more patch files or other text attachments to be
1513 included with the report. Multiple files must be separated with commas.
1517 Your return address. The program will ask you to confirm its default
1518 if you don't use this option.
1522 Save or send the report without asking for confirmation.
1526 Subject to include with the report. You will be prompted if you don't
1527 supply one on the command line.
1531 Test mode. Makes it possible to command perlbug from a pipe or file, for
1536 Send a thank-you note instead of a bug report.
1540 Include verbose configuration data in the report.
1546 Kenneth Albanowski (E<lt>kjahds@kjahds.comE<gt>), subsequently
1547 I<doc>tored by Gurusamy Sarathy (E<lt>gsar@activestate.comE<gt>),
1548 Tom Christiansen (E<lt>tchrist@perl.comE<gt>), Nathan Torkington
1549 (E<lt>gnat@frii.comE<gt>), Charles F. Randall (E<lt>cfr@pobox.comE<gt>),
1550 Mike Guy (E<lt>mjtg@cam.ac.ukE<gt>), Dominic Dunlop
1551 (E<lt>domo@computer.orgE<gt>), Hugo van der Sanden (E<lt>hv@crypt.orgE<gt>),
1552 Jarkko Hietaniemi (E<lt>jhi@iki.fiE<gt>), Chris Nandor
1553 (E<lt>pudge@pobox.comE<gt>), Jon Orwant (E<lt>orwant@media.mit.eduE<gt>,
1554 Richard Foley (E<lt>richard.foley@rfi.netE<gt>), Jesse Vincent
1555 (E<lt>jesse@bestpractical.comE<gt>), and Craig A. Berry (E<lt>craigberry@mac.comE<gt>).
1559 perl(1), perldebug(1), perldiag(1), perlport(1), perltrap(1),
1560 diff(1), patch(1), dbx(1), gdb(1)
1564 None known (guess what must have been used to report them?)
1570 close OUT or die "Can't close $file: $!";
1571 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1572 exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';