band-aid for perldoc -t broken-ness (the new Pod::Text
[p5sagit/p5-mst-13.2.git] / utils / perlbug.PL
CommitLineData
37fa004c 1#!/usr/local/bin/perl
2
3use Config;
4use File::Basename qw(&basename &dirname);
8a5546a1 5use Cwd;
37fa004c 6
7# List explicitly here the variables you want Configure to
8# generate. Metaconfig only looks for shell variables, so you
9# have to mention them as if they were shell variables, not
10# %Config entries. Thus you write
11# $startperl
12# to ensure Configure will look for $Config{startperl}.
84902520 13# $perlpath
37fa004c 14
15# This forces PL files to create target in same directory as PL file.
16# This is so that make depend always knows where to find PL derivatives.
8a5546a1 17$origdir = cwd;
44a8e56a 18chdir dirname($0);
19$file = basename($0, '.PL');
774d564b 20$file .= '.com' if $^O eq 'VMS';
37fa004c 21
55d729e4 22open OUT, ">$file" or die "Can't create $file: $!";
37fa004c 23
84902520 24# extract patchlevel.h information
25
26open PATCH_LEVEL, "<../patchlevel.h" or die "Can't open patchlevel.h: $!";
27
28my $patchlevel_date = (stat PATCH_LEVEL)[9];
29
30while (<PATCH_LEVEL>) {
fb73857a 31 last if $_ =~ /^\s*static\s+char.*?local_patches\[\]\s*=\s*{\s*$/;
55d729e4 32}
84902520 33
fb73857a 34my @patches;
84902520 35while (<PATCH_LEVEL>) {
fb73857a 36 last if /^\s*}/;
84902520 37 chomp;
38 s/^\s+,?"?//;
39 s/"?,?$//;
40 s/(['\\])/\\$1/g;
fb73857a 41 push @patches, $_ unless $_ eq 'NULL';
55d729e4 42}
43my $patch_desc = "'" . join("',\n '", @patches) . "'";
44my $patch_tags = join "", map /(\S+)/ ? "+$1 " : (), @patches;
84902520 45
46close PATCH_LEVEL;
47
5edeba26 48# TO DO (prehaps): store/embed $Config::config_sh into perlbug. When perlbug is
49# used, compare $Config::config_sh with the stored version. If they differ then
50# append a list of individual differences to the bug report.
51
84902520 52
37fa004c 53print "Extracting $file (with variable substitutions)\n";
54
55# In this section, perl variables will be expanded during extraction.
56# You can use $Config{...} to use Configure variables.
57
58print OUT <<"!GROK!THIS!";
5f05dabc 59$Config{startperl}
60 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
61 if \$running_under_some_shell;
84902520 62
fb73857a 63my \$config_tag1 = '$] - $Config{cf_time}';
64
84902520 65my \$patchlevel_date = $patchlevel_date;
fb73857a 66my \$patch_tags = '$patch_tags';
67my \@patches = (
55d729e4 68 $patch_desc
fb73857a 69);
37fa004c 70!GROK!THIS!
71
72# In the following, perl variables are not expanded during extraction.
73
74print OUT <<'!NO!SUBS!';
75
76use Config;
37fa004c 77use Getopt::Std;
37fa004c 78use strict;
79
80sub paraprint;
81
55d729e4 82BEGIN {
83 eval "use Mail::Send;";
84 $::HaveSend = ($@ eq "");
85 eval "use Mail::Util;";
86 $::HaveUtil = ($@ eq "");
87};
c07a80fd 88
eedd3c36 89my $Version = "1.26";
c07a80fd 90
91# Changed in 1.06 to skip Mail::Send and Mail::Util if not available.
a5f75d66 92# Changed in 1.07 to see more sendmail execs, and added pipe output.
93# Changed in 1.08 to use correct address for sendmail.
c07a80fd 94# Changed in 1.09 to close the REP file before calling it up in the editor.
95# Also removed some old comments duplicated elsewhere.
96# Changed in 1.10 to run under VMS without Mail::Send; also fixed
a5f75d66 97# temp filename generation.
c07a80fd 98# Changed in 1.11 to clean up some text and removed Mail::Send deactivator.
a5f75d66 99# Changed in 1.12 to check for editor errors, make save/send distinction
100# clearer and add $ENV{REPLYTO}.
84478119 101# Changed in 1.13 to hopefully make it more difficult to accidentally
102# send mail
ab3ef367 103# Changed in 1.14 to make the prompts a little more clear on providing
104# helpful information. Also let file read fail gracefully.
8ecf1a0c 105# Changed in 1.15 to add warnings to stop people using perlbug for non-bugs.
106# Also report selected environment variables.
774d564b 107# Changed in 1.16 to include @INC, and allow user to re-edit if no changes.
137443ea 108# Changed in 1.17 Win32 support added. GSAR 97-04-12
1b0e3b9e 109# Changed in 1.18 add '-ok' option for reporting build success. CFR 97-06-18
84902520 110# Changed in 1.19 '-ok' default not '-v'
111# add local patch information
112# warn on '-ok' if this is an old system; add '-okay'
fb73857a 113# Changed in 1.20 Added patchlevel.h reading and version/config checks
55d729e4 114# Changed in 1.21 Added '-nok' for reporting build failure DFD 98-05-05
115# Changed in 1.22 Heavy reformatting & minor bugfixes HVDS 98-05-10
cca87523 116# Changed in 1.23 Restore -ok(ay): say 'success'; don't prompt
105f9295 117# Changed in 1.24 Added '-F<file>' to save report HVDS 98-07-01
8b49bb9a 118# Changed in 1.25 Warn on failure to open save file. HVDS 98-07-12
eedd3c36 119# Changed in 1.26 Don't require -t STDIN for -ok. HVDS 98-07-15
c07a80fd 120
1b0e3b9e 121# TODO: - Allow the user to re-name the file on mail failure, and
55d729e4 122# make sure failure (transmission-wise) of Mail::Send is
c07a80fd 123# accounted for.
1b0e3b9e 124# - Test -b option
37fa004c 125
ab3ef367 126my( $file, $usefile, $cc, $address, $perlbug, $testaddress, $filename,
105f9295 127 $subject, $from, $verbose, $ed, $outfile,
1b0e3b9e 128 $fh, $me, $Is_MSWin32, $Is_VMS, $msg, $body, $andcc, %REP, $ok);
37fa004c 129
fb73857a 130my $config_tag2 = "$] - $Config{cf_time}";
131
37fa004c 132Init();
133
55d729e4 134if ($::opt_h) { Help(); exit; }
135if ($::opt_d) { Dump(*STDOUT); exit; }
eedd3c36 136if (!-t STDIN && !($ok and not $::opt_n)) {
55d729e4 137 paraprint <<EOF;
138Please use perlbug interactively. If you want to
84478119 139include a file, you can use the -f switch.
140EOF
55d729e4 141 die "\n";
84478119 142}
105f9295 143if (!-t STDOUT && !$outfile) { Dump(*STDOUT); exit; }
c07a80fd 144
37fa004c 145Query();
cca87523 146Edit() unless $usefile || ($ok and not $::opt_n);
37fa004c 147NowWhat();
148Send();
149
150exit;
151
152sub Init {
55d729e4 153 # -------- Setup --------
154
155 $Is_MSWin32 = $^O eq 'MSWin32';
156 $Is_VMS = $^O eq 'VMS';
157
f3260bf1 158 if (!getopts("dhva:s:b:f:F:r:e:SCc:to:n:")) { Help(); exit; };
55d729e4 159
160 # This comment is needed to notify metaconfig that we are
161 # using the $perladmin, $cf_by, and $cf_time definitions.
162
163 # -------- Configuration ---------
164
165 # perlbug address
166 $perlbug = 'perlbug@perl.com';
167
168 # Test address
169 $testaddress = 'perlbug-test@perl.com';
170
171 # Target address
172 $address = $::opt_a || ($::opt_t ? $testaddress : $perlbug);
173
174 # Users address, used in message and in Reply-To header
175 $from = $::opt_r || "";
176
177 # Include verbose configuration information
178 $verbose = $::opt_v || 0;
179
180 # Subject of bug-report message
181 $subject = $::opt_s || "";
182
183 # Send a file
184 $usefile = ($::opt_f || 0);
185
186 # File to send as report
187 $file = $::opt_f || "";
188
105f9295 189 # File to output to
190 $outfile = $::opt_F || "";
191
55d729e4 192 # Body of report
193 $body = $::opt_b || "";
194
195 # Editor
196 $ed = $::opt_e || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT}
197 || ($Is_VMS && "edit/tpu")
198 || ($Is_MSWin32 && "notepad")
199 || "vi";
200
201 # Not OK - provide build failure template by finessing OK report
202 if ($::opt_n) {
203 if (substr($::opt_n, 0, 2) eq 'ok' ) {
204 $::opt_o = substr($::opt_n, 1);
205 } else {
206 Help();
207 exit();
208 }
209 }
210
211 # OK - send "OK" report for build on this system
212 $ok = 0;
213 if ($::opt_o) {
214 if ($::opt_o eq 'k' or $::opt_o eq 'kay') {
215 my $age = time - $patchlevel_date;
216 if ($::opt_o eq 'k' and $age > 60 * 24 * 60 * 60 ) {
217 my $date = localtime $patchlevel_date;
218 print <<"EOF";
219"perlbug -ok" and "perlbug -nok" do not report on Perl versions which
220are more than 60 days old. This Perl version was constructed on
221$date. If you really want to report this, use
222"perlbug -okay" or "perlbug -nokay".
84902520 223EOF
1b0e3b9e 224 exit();
225 }
55d729e4 226 # force these options
227 unless ($::opt_n) {
228 $::opt_S = 1; # don't prompt for send
229 $::opt_b = 1; # we have a body
230 $body = "Perl reported to build OK on this system.\n";
231 }
232 $::opt_C = 1; # don't send a copy to the local admin
233 $::opt_s = 1; # we have a subject line
234 $subject = ($::opt_n ? 'Not ' : '')
235 . "OK: perl $] ${patch_tags}on"
236 ." $::Config{'archname'} $::Config{'osvers'} $subject";
237 $ok = 1;
238 } else {
239 Help();
240 exit();
1b0e3b9e 241 }
55d729e4 242 }
37fa004c 243
55d729e4 244 # Possible administrator addresses, in order of confidence
245 # (Note that cf_email is not mentioned to metaconfig, since
246 # we don't really want it. We'll just take it if we have to.)
247 #
248 # This has to be after the $ok stuff above because of the way
249 # that $::opt_C is forced.
250 $cc = $::opt_C ? "" : (
251 $::opt_c || $::Config{'perladmin'}
252 || $::Config{'cf_email'} || $::Config{'cf_by'}
253 );
254
255 # My username
256 $me = $Is_MSWin32 ? $ENV{'USERNAME'}
257 : $^O eq 'os2' ? $ENV{'USER'} || $ENV{'LOGNAME'}
258 : eval { getpwuid($<) }; # May be missing
c0830f08 259
260 $from = $::Config{'cf_email'}
261 if !$from && $::Config{'cf_email'} && $::Config{'cf_by'} && $me &&
262 ($me eq $::Config{'cf_by'});
55d729e4 263} # sub Init
37fa004c 264
265sub Query {
55d729e4 266 # Explain what perlbug is
267 unless ($ok) {
37fa004c 268 paraprint <<EOF;
8ecf1a0c 269This program provides an easy way to create a message reporting a bug
270in perl, and e-mail it to $address. It is *NOT* intended for
54310121 271sending test messages or simply verifying that perl works, *NOR* is it
272intended for reporting bugs in third-party perl modules. It is *ONLY*
273a means of reporting verifiable problems with the core perl distribution,
274and any solutions to such problems, to the people who maintain perl.
275
276If you're just looking for help with perl, try posting to the Usenet
277newsgroup comp.lang.perl.misc. If you're looking for help with using
278perl with CGI, try posting to comp.infosystems.www.programming.cgi.
37fa004c 279EOF
1b0e3b9e 280 }
37fa004c 281
55d729e4 282 # Prompt for subject of message, if needed
283 unless ($subject) {
284 paraprint <<EOF;
285First of all, please provide a subject for the
286message. It should be a concise description of
774d564b 287the bug or problem. "perl bug" or "perl problem"
288is not a concise description.
37fa004c 289EOF
55d729e4 290 print "Subject: ";
291 $subject = <>;
292
293 my $err = 0;
294 while ($subject !~ /\S/) {
295 print "\nPlease enter a subject: ";
296 $subject = <>;
297 if ($err++ > 5) {
298 die "Aborting.\n";
299 }
37fa004c 300 }
55d729e4 301 chop $subject;
302 }
303
304 # Prompt for return address, if needed
305 unless ($from) {
306 # Try and guess return address
307 my $guess;
308
309 $guess = $ENV{'REPLY-TO'} || $ENV{'REPLYTO'} || '';
310 unless ($guess) {
311 my $domain;
312 if ($::HaveUtil) {
313 $domain = Mail::Util::maildomain();
314 } elsif ($Is_MSWin32) {
315 $domain = $ENV{'USERDOMAIN'};
316 } else {
317 require Sys::Hostname;
318 $domain = Sys::Hostname::hostname();
319 }
320 if ($domain) {
321 if ($Is_VMS && !$::Config{'d_socket'}) {
322 $guess = "$domain\:\:$me";
41f926b8 323 } else {
55d729e4 324 $guess = "$me\@$domain" if $domain;
c07a80fd 325 }
55d729e4 326 }
327 }
37fa004c 328
55d729e4 329 if ($guess) {
330 unless ($ok) {
331 paraprint <<EOF;
a5f75d66 332Your e-mail address will be useful if you need to be contacted. If the
333default shown is not your full internet e-mail address, please correct it.
37fa004c 334EOF
55d729e4 335 }
336 } else {
337 paraprint <<EOF;
338So that you may be contacted if necessary, please enter
a5f75d66 339your full internet e-mail address here.
37fa004c 340EOF
37fa004c 341 }
37fa004c 342
55d729e4 343 if ($ok && $guess) {
344 # use it
345 $from = $guess;
346 } else {
347 # verify it
348 print "Your address [$guess]: ";
349 $from = <>;
350 chop $from;
351 $from = $guess if $from eq '';
352 }
353 }
37fa004c 354
55d729e4 355 if ($from eq $cc or $me eq $cc) {
356 # Try not to copy ourselves
357 $cc = "yourself";
358 }
37fa004c 359
55d729e4 360 # Prompt for administrator address, unless an override was given
361 if( !$::opt_C and !$::opt_c ) {
362 paraprint <<EOF;
37fa004c 363A copy of this report can be sent to your local
55d729e4 364perl administrator. If the address is wrong, please
c07a80fd 365correct it, or enter 'none' or 'yourself' to not send
366a copy.
37fa004c 367EOF
55d729e4 368 print "Local perl administrator [$cc]: ";
369 my $entry = scalar <>;
370 chop $entry;
37fa004c 371
55d729e4 372 if ($entry ne "") {
373 $cc = $entry;
374 $cc = '' if $me eq $cc;
37fa004c 375 }
55d729e4 376 }
37fa004c 377
55d729e4 378 $cc = '' if $cc =~ /^(none|yourself|me|myself|ourselves)$/i;
379 $andcc = " and $cc" if $cc;
37fa004c 380
55d729e4 381 # Prompt for editor, if no override is given
ab3ef367 382editor:
55d729e4 383 unless ($::opt_e || $::opt_f || $::opt_b) {
384 paraprint <<EOF;
c07a80fd 385Now you need to supply the bug report. Try to make
55d729e4 386the report concise but descriptive. Include any
ab3ef367 387relevant detail. If you are reporting something
388that does not work as you think it should, please
55d729e4 389try to include example of both the actual
ab3ef367 390result, and what you expected.
391
392Some information about your local
55d729e4 393perl configuration will automatically be included
ab3ef367 394at the end of the report. If you are using any
395unusual version of perl, please try and confirm
396exactly which versions are relevant.
37fa004c 397
398You will probably want to use an editor to enter
399the report. If "$ed" is the editor you want
400to use, then just press Enter, otherwise type in
401the name of the editor you would like to use.
402
c07a80fd 403If you would like to use a prepared file, type
37fa004c 404"file", and you will be asked for the filename.
37fa004c 405EOF
55d729e4 406 print "Editor [$ed]: ";
407 my $entry =scalar <>;
408 chop $entry;
409
410 $usefile = 0;
411 if ($entry eq "file") {
412 $usefile = 1;
413 } elsif ($entry ne "") {
414 $ed = $entry;
37fa004c 415 }
55d729e4 416 }
37fa004c 417
55d729e4 418 # Generate scratch file to edit report in
419 $filename = filename();
37fa004c 420
55d729e4 421 # Prompt for file to read report from, if needed
422 if ($usefile and !$file) {
ab3ef367 423filename:
55d729e4 424 paraprint <<EOF;
37fa004c 425What is the name of the file that contains your report?
37fa004c 426EOF
55d729e4 427 print "Filename: ";
428 my $entry = scalar <>;
429 chop $entry;
37fa004c 430
55d729e4 431 if ($entry eq "") {
432 paraprint <<EOF;
433No filename? I'll let you go back and choose an editor again.
ab3ef367 434EOF
55d729e4 435 goto editor;
436 }
437
438 unless (-f $entry and -r $entry) {
439 paraprint <<EOF;
ab3ef367 440I'm sorry, but I can't read from `$entry'. Maybe you mistyped the name of
441the file? If you don't want to send a file, just enter a blank line and you
442can get back to the editor selection.
ab3ef367 443EOF
55d729e4 444 goto filename;
37fa004c 445 }
55d729e4 446 $file = $entry;
447 }
37fa004c 448
55d729e4 449 # Generate report
450 open(REP,">$filename");
cca87523 451 my $reptype = !$ok ? "bug" : $::opt_n ? "build failure" : "success";
37fa004c 452
55d729e4 453 print REP <<EOF;
84902520 454This is a $reptype report for perl from $from,
37fa004c 455generated with the help of perlbug $Version running under perl $].
456
457EOF
458
55d729e4 459 if ($body) {
460 print REP $body;
461 } elsif ($usefile) {
462 open(F, "<$file")
463 or die "Unable to read report file from `$file': $!\n";
464 while (<F>) {
465 print REP $_
466 }
467 close(F);
468 } else {
469 print REP <<EOF;
774d564b 470
471-----------------------------------------------------------------
472[Please enter your report here]
473
474
475
476[Please do not change anything below this line]
477-----------------------------------------------------------------
478EOF
55d729e4 479 }
480 Dump(*REP);
481 close(REP);
482
483 # read in the report template once so that
484 # we can track whether the user does any editing.
485 # yes, *all* whitespace is ignored.
486 open(REP, "<$filename");
487 while (<REP>) {
488 s/\s+//g;
489 $REP{$_}++;
490 }
491 close(REP);
492} # sub Query
c07a80fd 493
494sub Dump {
55d729e4 495 local(*OUT) = @_;
37fa004c 496
55d729e4 497 print REP "\n---\n";
b5fea04c 498 print REP "This perlbug was built using Perl $config_tag2\n",
499 "It is being executed now by Perl $config_tag1.\n\n"
55d729e4 500 if $config_tag2 ne $config_tag1;
fb73857a 501
55d729e4 502 print OUT <<EOF;
37fa004c 503Site configuration information for perl $]:
504
505EOF
55d729e4 506 if ($::Config{cf_by} and $::Config{cf_time}) {
507 print OUT "Configured by $::Config{cf_by} at $::Config{cf_time}.\n\n";
508 }
509 print OUT Config::myconfig;
37fa004c 510
55d729e4 511 if (@patches) {
512 print OUT join "\n ", "Locally applied patches:", @patches;
513 print OUT "\n";
514 };
84902520 515
55d729e4 516 print OUT <<EOF;
8ecf1a0c 517
774d564b 518---
519\@INC for perl $]:
520EOF
55d729e4 521 for my $i (@INC) {
522 print OUT " $i\n";
523 }
774d564b 524
55d729e4 525 print OUT <<EOF;
8ecf1a0c 526
774d564b 527---
8ecf1a0c 528Environment for perl $]:
529EOF
5cf1d1f1 530 my @env =
531 qw(PATH LD_LIBRARY_PATH LANG PERL_BADLANG SHELL HOME LOGDIR LANGUAGE);
532 push @env, $Config{ldlibpthname} if $Config{ldlibpthname} ne '';
8876aa85 533 push @env, grep /^(?:PERL|LC_|LANG)/, keys %ENV;
534 my %env;
535 @env{@env} = @env;
536 for my $env (sort keys %env) {
55d729e4 537 print OUT " $env",
538 exists $ENV{$env} ? "=$ENV{$env}" : ' (unset)',
539 "\n";
540 }
541 if ($verbose) {
542 print OUT "\nComplete configuration data for perl $]:\n\n";
543 my $value;
544 foreach (sort keys %::Config) {
545 $value = $::Config{$_};
546 $value =~ s/'/\\'/g;
547 print OUT "$_='$value'\n";
84902520 548 }
55d729e4 549 }
550} # sub Dump
37fa004c 551
552sub Edit {
55d729e4 553 # Edit the report
554 if ($usefile || $body) {
555 paraprint <<EOF;
ab3ef367 556Please make sure that the name of the editor you want to use is correct.
ab3ef367 557EOF
55d729e4 558 print "Editor [$ed]: ";
559 my $entry =scalar <>;
560 chop $entry;
561 $ed = $entry unless $entry eq '';
562 }
a5f75d66 563
55d729e4 564tryagain:
565 my $sts = system("$ed $filename");
566 if ($sts) {
567 paraprint <<EOF;
a5f75d66 568The editor you chose (`$ed') could apparently not be run!
569Did you mistype the name of your editor? If so, please
55d729e4 570correct it here, otherwise just press Enter.
a5f75d66 571EOF
55d729e4 572 print "Editor [$ed]: ";
573 my $entry =scalar <>;
574 chop $entry;
a5f75d66 575
55d729e4 576 if ($entry ne "") {
577 $ed = $entry;
578 goto tryagain;
579 } else {
580 paraprint <<EOF;
a5f75d66 581You may want to save your report to a file, so you can edit and mail it
582yourself.
583EOF
774d564b 584 }
55d729e4 585 }
774d564b 586
55d729e4 587 return if ($ok and not $::opt_n) || $body;
588 # Check that we have a report that has some, eh, report in it.
589 my $unseen = 0;
590
591 open(REP, "<$filename");
592 # a strange way to check whether any significant editing
593 # have been done: check whether any new non-empty lines
594 # have been added. Yes, the below code ignores *any* space
595 # in *any* line.
596 while (<REP>) {
597 s/\s+//g;
598 $unseen++ if $_ ne '' and not exists $REP{$_};
599 }
774d564b 600
55d729e4 601 while ($unseen == 0) {
602 paraprint <<EOF;
774d564b 603I am sorry but it looks like you did not report anything.
774d564b 604EOF
55d729e4 605 print "Action (Retry Edit/Cancel) ";
606 my ($action) = scalar(<>);
607 if ($action =~ /^[re]/i) { # <R>etry <E>dit
608 goto tryagain;
609 } elsif ($action =~ /^[cq]/i) { # <C>ancel, <Q>uit
610 Cancel();
611 }
612 }
613} # sub Edit
774d564b 614
615sub Cancel {
616 1 while unlink($filename); # remove all versions under VMS
617 print "\nCancelling.\n";
618 exit(0);
37fa004c 619}
620
621sub NowWhat {
55d729e4 622 # Report is done, prompt for further action
623 if( !$::opt_S ) {
624 while(1) {
625 paraprint <<EOF;
626Now that you have completed your report, would you like to send
627the message to $address$andcc, display the message on
37fa004c 628the screen, re-edit it, or cancel without sending anything?
629You may also save the message as a file to mail at another time.
37fa004c 630EOF
8b49bb9a 631 retry:
55d729e4 632 print "Action (Send/Display/Edit/Cancel/Save to File): ";
633 my $action = scalar <>;
634 chop $action;
635
636 if ($action =~ /^(f|sa)/i) { # <F>ile/<Sa>ve
637 print "\n\nName of file to save message in [perlbug.rep]: ";
638 my $file = scalar <>;
639 chop $file;
640 $file = "perlbug.rep" if $file eq "";
641
8b49bb9a 642 unless (open(FILE, ">$file")) {
643 print "\nError opening $file: $!\n\n";
644 goto retry;
645 }
55d729e4 646 open(REP, "<$filename");
647 print FILE "To: $address\nSubject: $subject\n";
648 print FILE "Cc: $cc\n" if $cc;
649 print FILE "Reply-To: $from\n" if $from;
650 print FILE "\n";
651 while (<REP>) { print FILE }
652 close(REP);
653 close(FILE);
654
655 print "\nMessage saved in `$file'.\n";
656 exit;
657 } elsif ($action =~ /^(d|l|sh)/i ) { # <D>isplay, <L>ist, <Sh>ow
658 # Display the message
659 open(REP, "<$filename");
660 while (<REP>) { print $_ }
661 close(REP);
662 } elsif ($action =~ /^se/i) { # <S>end
663 # Send the message
664 print "Are you certain you want to send this message?\n"
665 . 'Please type "yes" if you are: ';
666 my $reply = scalar <STDIN>;
667 chop $reply;
668 if ($reply eq "yes") {
669 last;
670 } else {
671 paraprint <<EOF;
ab3ef367 672That wasn't a clear "yes", so I won't send your message. If you are sure
673your message should be sent, type in "yes" (without the quotes) at the
674confirmation prompt.
ab3ef367 675EOF
55d729e4 676 }
677 } elsif ($action =~ /^[er]/i) { # <E>dit, <R>e-edit
678 # edit the message
679 Edit();
680 } elsif ($action =~ /^[qc]/i) { # <C>ancel, <Q>uit
681 Cancel();
682 } elsif ($action =~ /^s/) {
683 paraprint <<EOF;
84478119 684I'm sorry, but I didn't understand that. Please type "send" or "save".
685EOF
55d729e4 686 }
37fa004c 687 }
55d729e4 688 }
689} # sub NowWhat
37fa004c 690
691sub Send {
55d729e4 692 # Message has been accepted for transmission -- Send the message
105f9295 693 if ($outfile) {
694 open SENDMAIL, ">$outfile" or die "Couldn't open '$outfile': $!\n";
695 goto sendout;
696 }
55d729e4 697 if ($::HaveSend) {
698 $msg = new Mail::Send Subject => $subject, To => $address;
699 $msg->cc($cc) if $cc;
700 $msg->add("Reply-To",$from) if $from;
701
702 $fh = $msg->open;
703 open(REP, "<$filename");
704 while (<REP>) { print $fh $_ }
705 close(REP);
706 $fh->close;
707
708 print "\nMessage sent.\n";
709 } elsif ($Is_VMS) {
710 if ( ($address =~ /@/ and $address !~ /^\w+%"/) or
711 ($cc =~ /@/ and $cc !~ /^\w+%"/) ) {
712 my $prefix;
713 foreach (qw[ IN MX SMTP UCX PONY WINS ], '') {
714 $prefix = "$_%", last if $ENV{"MAIL\$PROTOCOL_$_"};
715 }
716 $address = qq[${prefix}"$address"] unless $address =~ /^\w+%"/;
717 $cc = qq[${prefix}"$cc"] unless !$cc || $cc =~ /^\w+%"/;
718 }
719 $subject =~ s/"/""/g; $address =~ s/"/""/g; $cc =~ s/"/""/g;
720 my $sts = system(qq[mail/Subject="$subject" $filename. "$address","$cc"]);
721 if ($sts) {
722 die <<EOF;
723Can't spawn off mail
724 (leaving bug report in $filename): $sts
725EOF
726 }
727 } else {
728 my $sendmail = "";
729 for (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail)) {
730 $sendmail = $_, last if -e $_;
731 }
732 if ($^O eq 'os2' and $sendmail eq "") {
733 my $path = $ENV{PATH};
734 $path =~ s:\\:/: ;
735 my @path = split /$Config{'path_sep'}/, $path;
736 for (@path) {
737 $sendmail = "$_/sendmail", last if -e "$_/sendmail";
738 $sendmail = "$_/sendmail.exe", last if -e "$_/sendmail.exe";
739 }
740 }
37fa004c 741
55d729e4 742 paraprint(<<"EOF"), die "\n" if $sendmail eq "";
c07a80fd 743I am terribly sorry, but I cannot find sendmail, or a close equivalent, and
744the perl package Mail::Send has not been installed, so I can't send your bug
d121ca8c 745report. We apologize for the inconvenience.
c07a80fd 746
747So you may attempt to find some way of sending your message, it has
748been left in the file `$filename'.
c07a80fd 749EOF
55d729e4 750 open(SENDMAIL, "|$sendmail -t") || die "'|$sendmail -t' failed: $!";
105f9295 751sendout:
55d729e4 752 print SENDMAIL "To: $address\n";
753 print SENDMAIL "Subject: $subject\n";
754 print SENDMAIL "Cc: $cc\n" if $cc;
755 print SENDMAIL "Reply-To: $from\n" if $from;
756 print SENDMAIL "\n\n";
757 open(REP, "<$filename");
758 while (<REP>) { print SENDMAIL $_ }
759 close(REP);
37fa004c 760
55d729e4 761 if (close(SENDMAIL)) {
105f9295 762 printf "\nMessage %s.\n", $outfile ? "saved" : "sent";
55d729e4 763 } else {
764 warn "\nSendmail returned status '", $? >> 8, "'\n";
765 }
766 }
767 1 while unlink($filename); # remove all versions under VMS
768} # sub Send
37fa004c 769
770sub Help {
55d729e4 771 print <<EOF;
37fa004c 772
55d729e4 773A program to help generate bug reports about perl5, and mail them.
37fa004c 774It is designed to be used interactively. Normally no arguments will
775be needed.
55d729e4 776
37fa004c 777Usage:
105f9295 778$0 [-v] [-a address] [-s subject] [-b body | -f inpufile ] [ -F outputfile ]
d121ca8c 779 [-r returnaddress] [-e editor] [-c adminaddress | -C] [-S] [-t] [-h]
55d729e4 780$0 [-v] [-r returnaddress] [-ok | -okay | -nok | -nokay]
781
c07a80fd 782Simplest usage: run "$0", and follow the prompts.
37fa004c 783
784Options:
785
786 -v Include Verbose configuration data in the report
55d729e4 787 -f File containing the body of the report. Use this to
37fa004c 788 quickly send a prepared message.
105f9295 789 -F File to output the resulting mail message to, instead of mailing.
37fa004c 790 -S Send without asking for confirmation.
791 -a Address to send the report to. Defaults to `$address'.
792 -c Address to send copy of report to. Defaults to `$cc'.
793 -C Don't send copy to administrator.
55d729e4 794 -s Subject to include with the message. You will be prompted
37fa004c 795 if you don't supply one on the command line.
796 -b Body of the report. If not included on the command line, or
797 in a file with -f, you will get a chance to edit the message.
798 -r Your return address. The program will ask you to confirm
799 this if you don't give it here.
55d729e4 800 -e Editor to use.
37fa004c 801 -t Test mode. The target address defaults to `$testaddress'.
55d729e4 802 -d Data mode (the default if you redirect or pipe output.)
c07a80fd 803 This prints out your configuration data, without mailing
804 anything. You can use this with -v to get more complete data.
84902520 805 -ok Report successful build on this system to perl porters
55d729e4 806 (use alone or with -v). Only use -ok if *everything* was ok:
807 if there were *any* problems at all, use -nok.
fb73857a 808 -okay As -ok but allow report from old builds.
55d729e4 809 -nok Report unsuccessful build on this system to perl porters
810 (use alone or with -v). You must describe what went wrong
811 in the body of the report which you will be asked to edit.
812 -nokay As -nok but allow report from old builds.
813 -h Print this help message.
814
37fa004c 815EOF
816}
817
55d729e4 818sub filename {
819 my $dir = $Is_VMS ? 'sys$scratch:'
820 : ($Is_MSWin32 && $ENV{'TEMP'}) ? $ENV{'TEMP'}
821 : '/tmp/';
822 $filename = "bugrep0$$";
823 $dir .= "\\" if $Is_MSWin32 and $dir !~ m|[\\/]$|;
824 $filename++ while -e "$dir$filename";
825 $filename = "$dir$filename";
826}
827
37fa004c 828sub paraprint {
829 my @paragraphs = split /\n{2,}/, "@_";
c07a80fd 830 print "\n\n";
37fa004c 831 for (@paragraphs) { # implicit local $_
55d729e4 832 s/(\S)\s*\n/$1 /g;
833 write;
834 print "\n";
37fa004c 835 }
37fa004c 836}
37fa004c 837
838format STDOUT =
839^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
840$_
841.
d121ca8c 842
843__END__
844
845=head1 NAME
846
847perlbug - how to submit bug reports on Perl
848
849=head1 SYNOPSIS
850
851B<perlbug> S<[ B<-v> ]> S<[ B<-a> I<address> ]> S<[ B<-s> I<subject> ]>
105f9295 852S<[ B<-b> I<body> | B<-f> I<inputfile> ]> S<[ B<-F> I<outputfile> ]>
853S<[ B<-r> I<returnaddress> ]>
d121ca8c 854S<[ B<-e> I<editor> ]> S<[ B<-c> I<adminaddress> | B<-C> ]>
855S<[ B<-S> ]> S<[ B<-t> ]> S<[ B<-d> ]> S<[ B<-h> ]>
856
55d729e4 857B<perlbug> S<[ B<-v> ]> S<[ B<-r> I<returnaddress> ]>
858S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]>
1b0e3b9e 859
d121ca8c 860=head1 DESCRIPTION
861
862A program to help generate bug reports about perl or the modules that
55d729e4 863come with it, and mail them.
d121ca8c 864
865If you have found a bug with a non-standard port (one that was not part
866of the I<standard distribution>), a binary distribution, or a
867non-standard module (such as Tk, CGI, etc), then please see the
868documentation that came with that distribution to determine the correct
869place to report bugs.
870
871C<perlbug> is designed to be used interactively. Normally no arguments
872will be needed. Simply run it, and follow the prompts.
873
874If you are unable to run B<perlbug> (most likely because you don't have
875a working setup to send mail that perlbug recognizes), you may have to
876compose your own report, and email it to B<perlbug@perl.com>. You might
877find the B<-d> option useful to get summary information in that case.
878
879In any case, when reporting a bug, please make sure you have run through
880this checklist:
881
882=over 4
883
884=item What version of perl you are running?
885
886Type C<perl -v> at the command line to find out.
887
888=item Are you running the latest released version of perl?
889
890Look at http://www.perl.com/ to find out. If it is not the latest
891released version, get that one and see whether your bug has been
892fixed. Note that bug reports about old versions of perl, especially
893those prior to the 5.0 release, are likely to fall upon deaf ears.
894You are on your own if you continue to use perl1 .. perl4.
895
896=item Are you sure what you have is a bug?
897
898A significant number of the bug reports we get turn out to be documented
899features in perl. Make sure the behavior you are witnessing doesn't fall
900under that category, by glancing through the documentation that comes
901with perl (we'll admit this is no mean task, given the sheer volume of
902it all, but at least have a look at the sections that I<seem> relevant).
903
904Be aware of the familiar traps that perl programmers of various hues
905fall into. See L<perltrap>.
906
f27fa58d 907Check in L<perldiag> to see what any Perl error message(s) mean.
908If message isn't in perldiag, it probably isn't generated by Perl.
909Consult your operating system documentation instead.
bdcdfa19 910
911If you are on a non-UNIX platform check also L<perlport>, some
912features may not be implemented or work differently.
913
d121ca8c 914Try to study the problem under the perl debugger, if necessary.
915See L<perldebug>.
916
917=item Do you have a proper test case?
918
919The easier it is to reproduce your bug, the more likely it will be
920fixed, because if no one can duplicate the problem, no one can fix it.
921A good test case has most of these attributes: fewest possible number
922of lines; few dependencies on external commands, modules, or
923libraries; runs on most platforms unimpeded; and is self-documenting.
924
925A good test case is almost always a good candidate to be on the perl
926test suite. If you have the time, consider making your test case so
927that it will readily fit into the standard test suite.
928
bdcdfa19 929Remember also to include the B<exact> error messages, if any.
930"Perl complained something" is not an exact error message.
931
932If you get a core dump (or equivalent), you may use a debugger
933(B<dbx>, B<gdb>, etc) to produce a stack trace to include in the bug
934report. NOTE: unless your Perl has been compiled with debug info
935(often B<-g>), the stack trace is likely to be somewhat hard to use
936because it will most probably contain only the function names, not
937their arguments. If possible, recompile your Perl with debug info and
938reproduce the dump and the stack trace.
939
d121ca8c 940=item Can you describe the bug in plain English?
941
942The easier it is to understand a reproducible bug, the more likely it
943will be fixed. Anything you can provide by way of insight into the
944problem helps a great deal. In other words, try to analyse the
945problem to the extent you feel qualified and report your discoveries.
946
947=item Can you fix the bug yourself?
948
949A bug report which I<includes a patch to fix it> will almost
950definitely be fixed. Use the C<diff> program to generate your patches
951(C<diff> is being maintained by the GNU folks as part of the B<diffutils>
952package, so you should be able to get it from any of the GNU software
953repositories). If you do submit a patch, the cool-dude counter at
954perlbug@perl.com will register you as a savior of the world. Your
955patch may be returned with requests for changes, or requests for more
956detailed explanations about your fix.
957
958Here are some clues for creating quality patches: Use the B<-c> or
959B<-u> switches to the diff program (to create a so-called context or
960unified diff). Make sure the patch is not reversed (the first
961argument to diff is typically the original file, the second argument
962your changed file). Make sure you test your patch by applying it with
963the C<patch> program before you send it on its way. Try to follow the
964same style as the code you are trying to patch. Make sure your patch
965really does work (C<make test>, if the thing you're patching supports
966it).
967
968=item Can you use C<perlbug> to submit the report?
969
970B<perlbug> will, amongst other things, ensure your report includes
971crucial information about your version of perl. If C<perlbug> is unable
972to mail your report after you have typed it in, you may have to compose
973the message yourself, add the output produced by C<perlbug -d> and email
974it to B<perlbug@perl.com>. If, for some reason, you cannot run
975C<perlbug> at all on your system, be sure to include the entire output
976produced by running C<perl -V> (note the uppercase V).
977
bdcdfa19 978Whether you use C<perlbug> or send the email manually, please make
979your subject informative. "a bug" not informative. Neither is "perl
980crashes" nor "HELP!!!", these all are null information. A compact
981description of what's wrong is fine.
982
d121ca8c 983=back
984
985Having done your bit, please be prepared to wait, to be told the bug
986is in your code, or even to get no reply at all. The perl maintainers
84902520 987are busy folks, so if your problem is a small one or if it is difficult
988to understand or already known, they may not respond with a personal reply.
d121ca8c 989If it is important to you that your bug be fixed, do monitor the
990C<Changes> file in any development releases since the time you submitted
991the bug, and encourage the maintainers with kind words (but never any
992flames!). Feel free to resend your bug report if the next released
993version of perl comes out and your bug is still present.
994
995=head1 OPTIONS
996
997=over 8
998
999=item B<-a>
1000
1001Address to send the report to. Defaults to `perlbug@perl.com'.
1002
1003=item B<-b>
1004
1005Body of the report. If not included on the command line, or
1006in a file with B<-f>, you will get a chance to edit the message.
1007
1008=item B<-C>
1009
1010Don't send copy to administrator.
1011
1012=item B<-c>
1013
1014Address to send copy of report to. Defaults to the address of the
1015local perl administrator (recorded when perl was built).
1016
1017=item B<-d>
1018
1019Data mode (the default if you redirect or pipe output). This prints out
1020your configuration data, without mailing anything. You can use this
1021with B<-v> to get more complete data.
1022
1023=item B<-e>
1024
55d729e4 1025Editor to use.
d121ca8c 1026
1027=item B<-f>
1028
1029File containing the body of the report. Use this to quickly send a
1030prepared message.
1031
105f9295 1032=item B<-F>
1033
1034File to output the results to instead of sending as an email. Useful
1035particularly when running perlbug on a machine with no direct internet
1036connection.
1037
d121ca8c 1038=item B<-h>
1039
1040Prints a brief summary of the options.
1041
1b0e3b9e 1042=item B<-ok>
1043
84902520 1044Report successful build on this system to perl porters. Forces B<-S>
1045and B<-C>. Forces and supplies values for B<-s> and B<-b>. Only
1b0e3b9e 1046prompts for a return address if it cannot guess it (for use with
84902520 1047B<make>). Honors return address specified with B<-r>. You can use this
1048with B<-v> to get more complete data. Only makes a report if this
1049system is less than 60 days old.
1050
1051=item B<-okay>
1052
1053As B<-ok> except it will report on older systems.
1b0e3b9e 1054
55d729e4 1055=item B<-nok>
1056
1057Report unsuccessful build on this system. Forces B<-C>. Forces and
1058supplies a value for B<-s>, then requires you to edit the report
1059and say what went wrong. Alternatively, a prepared report may be
1060supplied using B<-f>. Only prompts for a return address if it
1061cannot guess it (for use with B<make>). Honors return address
1062specified with B<-r>. You can use this with B<-v> to get more
1063complete data. Only makes a report if this system is less than 60
1064days old.
1065
1066=item B<-nokay>
1067
1068As B<-nok> except it will report on older systems.
1069
d121ca8c 1070=item B<-r>
1071
1072Your return address. The program will ask you to confirm its default
1073if you don't use this option.
1074
1075=item B<-S>
1076
1077Send without asking for confirmation.
1078
1079=item B<-s>
1080
1081Subject to include with the message. You will be prompted if you don't
1082supply one on the command line.
1083
1084=item B<-t>
1085
1086Test mode. The target address defaults to `perlbug-test@perl.com'.
1087
1088=item B<-v>
1089
1090Include verbose configuration data in the report.
1091
1092=back
1093
1094=head1 AUTHORS
1095
1096Kenneth Albanowski (E<lt>kjahds@kjahds.comE<gt>), subsequently I<doc>tored
1097by Gurusamy Sarathy (E<lt>gsar@umich.eduE<gt>), Tom Christiansen
1b0e3b9e 1098(E<lt>tchrist@perl.comE<gt>), Nathan Torkington (E<lt>gnat@frii.comE<gt>),
55d729e4 1099Charles F. Randall (E<lt>cfr@pobox.comE<gt>), Mike Guy
bdcdfa19 1100(E<lt>mjtg@cam.a.ukE<gt>), Dominic Dunlop (E<lt>domo@computer.orgE<gt>),
1101Hugo van der Sanden (E<lt>hv@crypt0.demon.co.ukE<gt>), and
1102Jarkko Hietaniemi (E<lt>jhi@iki.fiE<gt>).
d121ca8c 1103
1104=head1 SEE ALSO
1105
bdcdfa19 1106perl(1), perldebug(1), perldiag(1), perlport(1), perltrap(1),
1107diff(1), patch(1), dbx(1), gdb(1)
d121ca8c 1108
1109=head1 BUGS
1110
1111None known (guess what must have been used to report them?)
1112
1113=cut
1114
37fa004c 1115!NO!SUBS!
1116
1117close OUT or die "Can't close $file: $!";
1118chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1119exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
8a5546a1 1120chdir $origdir;