This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
h2ph
[perl5.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
TB
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
TB
37 chomp;
38 s/^\s+,?"?//;
39 s/"?,?$//;
40 s/(['\\])/\\$1/g;
fb73857a 41 push @patches, $_ unless $_ eq 'NULL';
55d729e4
GS
42}
43my $patch_desc = "'" . join("',\n '", @patches) . "'";
44my $patch_tags = join "", map /(\S+)/ ? "+$1 " : (), @patches;
84902520
TB
45
46close PATCH_LEVEL;
47
5edeba26
TB
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
GS
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
AD
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
AD
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
KA
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
TB
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
GS
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
GS
134if ($::opt_h) { Help(); exit; }
135if ($::opt_d) { Dump(*STDOUT); exit; }
eedd3c36 136if (!-t STDIN && !($ok and not $::opt_n)) {
55d729e4
GS
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
GS
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
GS
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
HS
189 # File to output to
190 $outfile = $::opt_F || "";
191
55d729e4
GS
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
CR
224 exit();
225 }
55d729e4
GS
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
GS
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
RB
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
GS
266 # Explain what perlbug is
267 unless ($ok) {
37fa004c 268 paraprint <<EOF;
8ecf1a0c
KA
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
GS
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
GS
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
GS
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
GS
326 }
327 }
37fa004c 328
55d729e4
GS
329 if ($guess) {
330 unless ($ok) {
331 paraprint <<EOF;
a5f75d66
AD
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
GS
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
GS
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
GS
355 if ($from eq $cc or $me eq $cc) {
356 # Try not to copy ourselves
357 $cc = "yourself";
358 }
37fa004c 359
55d729e4
GS
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
GS
368 print "Local perl administrator [$cc]: ";
369 my $entry = scalar <>;
370 chop $entry;
37fa004c 371
55d729e4
GS
372 if ($entry ne "") {
373 $cc = $entry;
374 $cc = '' if $me eq $cc;
37fa004c 375 }
55d729e4 376 }
37fa004c 377
55d729e4
GS
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
GS
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
GS
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
GS
418 # Generate scratch file to edit report in
419 $filename = filename();
37fa004c 420
55d729e4
GS
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
GS
427 print "Filename: ";
428 my $entry = scalar <>;
429 chop $entry;
37fa004c 430
55d729e4
GS
431 if ($entry eq "") {
432 paraprint <<EOF;
433No filename? I'll let you go back and choose an editor again.
ab3ef367 434EOF
55d729e4
GS
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
GS
446 $file = $entry;
447 }
37fa004c 448
55d729e4
GS
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
GS
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
GS
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
JA
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
GS
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
GS
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
GS
521 for my $i (@INC) {
522 print OUT " $i\n";
523 }
774d564b 524
55d729e4 525 print OUT <<EOF;
8ecf1a0c 526
774d564b 527---
8ecf1a0c
KA
528Environment for perl $]:
529EOF
55d729e4 530 for my $env (sort
3aeabbed 531 (qw(PATH LD_LIBRARY_PATH LANG PERL_BADLANG SHELL HOME LOGDIR LANGUAGE),
55d729e4
GS
532 grep /^(?:PERL|LC_)/, keys %ENV)
533 ) {
534 print OUT " $env",
535 exists $ENV{$env} ? "=$ENV{$env}" : ' (unset)',
536 "\n";
537 }
538 if ($verbose) {
539 print OUT "\nComplete configuration data for perl $]:\n\n";
540 my $value;
541 foreach (sort keys %::Config) {
542 $value = $::Config{$_};
543 $value =~ s/'/\\'/g;
544 print OUT "$_='$value'\n";
84902520 545 }
55d729e4
GS
546 }
547} # sub Dump
37fa004c 548
549sub Edit {
55d729e4
GS
550 # Edit the report
551 if ($usefile || $body) {
552 paraprint <<EOF;
ab3ef367 553Please make sure that the name of the editor you want to use is correct.
ab3ef367 554EOF
55d729e4
GS
555 print "Editor [$ed]: ";
556 my $entry =scalar <>;
557 chop $entry;
558 $ed = $entry unless $entry eq '';
559 }
a5f75d66 560
55d729e4
GS
561tryagain:
562 my $sts = system("$ed $filename");
563 if ($sts) {
564 paraprint <<EOF;
a5f75d66
AD
565The editor you chose (`$ed') could apparently not be run!
566Did you mistype the name of your editor? If so, please
55d729e4 567correct it here, otherwise just press Enter.
a5f75d66 568EOF
55d729e4
GS
569 print "Editor [$ed]: ";
570 my $entry =scalar <>;
571 chop $entry;
a5f75d66 572
55d729e4
GS
573 if ($entry ne "") {
574 $ed = $entry;
575 goto tryagain;
576 } else {
577 paraprint <<EOF;
a5f75d66
AD
578You may want to save your report to a file, so you can edit and mail it
579yourself.
580EOF
774d564b 581 }
55d729e4 582 }
774d564b 583
55d729e4
GS
584 return if ($ok and not $::opt_n) || $body;
585 # Check that we have a report that has some, eh, report in it.
586 my $unseen = 0;
587
588 open(REP, "<$filename");
589 # a strange way to check whether any significant editing
590 # have been done: check whether any new non-empty lines
591 # have been added. Yes, the below code ignores *any* space
592 # in *any* line.
593 while (<REP>) {
594 s/\s+//g;
595 $unseen++ if $_ ne '' and not exists $REP{$_};
596 }
774d564b 597
55d729e4
GS
598 while ($unseen == 0) {
599 paraprint <<EOF;
774d564b 600I am sorry but it looks like you did not report anything.
774d564b 601EOF
55d729e4
GS
602 print "Action (Retry Edit/Cancel) ";
603 my ($action) = scalar(<>);
604 if ($action =~ /^[re]/i) { # <R>etry <E>dit
605 goto tryagain;
606 } elsif ($action =~ /^[cq]/i) { # <C>ancel, <Q>uit
607 Cancel();
608 }
609 }
610} # sub Edit
774d564b 611
612sub Cancel {
613 1 while unlink($filename); # remove all versions under VMS
614 print "\nCancelling.\n";
615 exit(0);
37fa004c 616}
617
618sub NowWhat {
55d729e4
GS
619 # Report is done, prompt for further action
620 if( !$::opt_S ) {
621 while(1) {
622 paraprint <<EOF;
623Now that you have completed your report, would you like to send
624the message to $address$andcc, display the message on
37fa004c 625the screen, re-edit it, or cancel without sending anything?
626You may also save the message as a file to mail at another time.
37fa004c 627EOF
8b49bb9a 628 retry:
55d729e4
GS
629 print "Action (Send/Display/Edit/Cancel/Save to File): ";
630 my $action = scalar <>;
631 chop $action;
632
633 if ($action =~ /^(f|sa)/i) { # <F>ile/<Sa>ve
634 print "\n\nName of file to save message in [perlbug.rep]: ";
635 my $file = scalar <>;
636 chop $file;
637 $file = "perlbug.rep" if $file eq "";
638
8b49bb9a
HS
639 unless (open(FILE, ">$file")) {
640 print "\nError opening $file: $!\n\n";
641 goto retry;
642 }
55d729e4
GS
643 open(REP, "<$filename");
644 print FILE "To: $address\nSubject: $subject\n";
645 print FILE "Cc: $cc\n" if $cc;
646 print FILE "Reply-To: $from\n" if $from;
647 print FILE "\n";
648 while (<REP>) { print FILE }
649 close(REP);
650 close(FILE);
651
652 print "\nMessage saved in `$file'.\n";
653 exit;
654 } elsif ($action =~ /^(d|l|sh)/i ) { # <D>isplay, <L>ist, <Sh>ow
655 # Display the message
656 open(REP, "<$filename");
657 while (<REP>) { print $_ }
658 close(REP);
659 } elsif ($action =~ /^se/i) { # <S>end
660 # Send the message
661 print "Are you certain you want to send this message?\n"
662 . 'Please type "yes" if you are: ';
663 my $reply = scalar <STDIN>;
664 chop $reply;
665 if ($reply eq "yes") {
666 last;
667 } else {
668 paraprint <<EOF;
ab3ef367 669That wasn't a clear "yes", so I won't send your message. If you are sure
670your message should be sent, type in "yes" (without the quotes) at the
671confirmation prompt.
ab3ef367 672EOF
55d729e4
GS
673 }
674 } elsif ($action =~ /^[er]/i) { # <E>dit, <R>e-edit
675 # edit the message
676 Edit();
677 } elsif ($action =~ /^[qc]/i) { # <C>ancel, <Q>uit
678 Cancel();
679 } elsif ($action =~ /^s/) {
680 paraprint <<EOF;
84478119 681I'm sorry, but I didn't understand that. Please type "send" or "save".
682EOF
55d729e4 683 }
37fa004c 684 }
55d729e4
GS
685 }
686} # sub NowWhat
37fa004c 687
688sub Send {
55d729e4 689 # Message has been accepted for transmission -- Send the message
105f9295
HS
690 if ($outfile) {
691 open SENDMAIL, ">$outfile" or die "Couldn't open '$outfile': $!\n";
692 goto sendout;
693 }
55d729e4
GS
694 if ($::HaveSend) {
695 $msg = new Mail::Send Subject => $subject, To => $address;
696 $msg->cc($cc) if $cc;
697 $msg->add("Reply-To",$from) if $from;
698
699 $fh = $msg->open;
700 open(REP, "<$filename");
701 while (<REP>) { print $fh $_ }
702 close(REP);
703 $fh->close;
704
705 print "\nMessage sent.\n";
706 } elsif ($Is_VMS) {
707 if ( ($address =~ /@/ and $address !~ /^\w+%"/) or
708 ($cc =~ /@/ and $cc !~ /^\w+%"/) ) {
709 my $prefix;
710 foreach (qw[ IN MX SMTP UCX PONY WINS ], '') {
711 $prefix = "$_%", last if $ENV{"MAIL\$PROTOCOL_$_"};
712 }
713 $address = qq[${prefix}"$address"] unless $address =~ /^\w+%"/;
714 $cc = qq[${prefix}"$cc"] unless !$cc || $cc =~ /^\w+%"/;
715 }
716 $subject =~ s/"/""/g; $address =~ s/"/""/g; $cc =~ s/"/""/g;
717 my $sts = system(qq[mail/Subject="$subject" $filename. "$address","$cc"]);
718 if ($sts) {
719 die <<EOF;
720Can't spawn off mail
721 (leaving bug report in $filename): $sts
722EOF
723 }
724 } else {
725 my $sendmail = "";
726 for (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail)) {
727 $sendmail = $_, last if -e $_;
728 }
729 if ($^O eq 'os2' and $sendmail eq "") {
730 my $path = $ENV{PATH};
731 $path =~ s:\\:/: ;
732 my @path = split /$Config{'path_sep'}/, $path;
733 for (@path) {
734 $sendmail = "$_/sendmail", last if -e "$_/sendmail";
735 $sendmail = "$_/sendmail.exe", last if -e "$_/sendmail.exe";
736 }
737 }
37fa004c 738
55d729e4 739 paraprint(<<"EOF"), die "\n" if $sendmail eq "";
c07a80fd 740I am terribly sorry, but I cannot find sendmail, or a close equivalent, and
741the perl package Mail::Send has not been installed, so I can't send your bug
d121ca8c 742report. We apologize for the inconvenience.
c07a80fd 743
744So you may attempt to find some way of sending your message, it has
745been left in the file `$filename'.
c07a80fd 746EOF
55d729e4 747 open(SENDMAIL, "|$sendmail -t") || die "'|$sendmail -t' failed: $!";
105f9295 748sendout:
55d729e4
GS
749 print SENDMAIL "To: $address\n";
750 print SENDMAIL "Subject: $subject\n";
751 print SENDMAIL "Cc: $cc\n" if $cc;
752 print SENDMAIL "Reply-To: $from\n" if $from;
753 print SENDMAIL "\n\n";
754 open(REP, "<$filename");
755 while (<REP>) { print SENDMAIL $_ }
756 close(REP);
37fa004c 757
55d729e4 758 if (close(SENDMAIL)) {
105f9295 759 printf "\nMessage %s.\n", $outfile ? "saved" : "sent";
55d729e4
GS
760 } else {
761 warn "\nSendmail returned status '", $? >> 8, "'\n";
762 }
763 }
764 1 while unlink($filename); # remove all versions under VMS
765} # sub Send
37fa004c 766
767sub Help {
55d729e4 768 print <<EOF;
37fa004c 769
55d729e4 770A program to help generate bug reports about perl5, and mail them.
37fa004c 771It is designed to be used interactively. Normally no arguments will
772be needed.
55d729e4 773
37fa004c 774Usage:
105f9295 775$0 [-v] [-a address] [-s subject] [-b body | -f inpufile ] [ -F outputfile ]
d121ca8c 776 [-r returnaddress] [-e editor] [-c adminaddress | -C] [-S] [-t] [-h]
55d729e4
GS
777$0 [-v] [-r returnaddress] [-ok | -okay | -nok | -nokay]
778
c07a80fd 779Simplest usage: run "$0", and follow the prompts.
37fa004c 780
781Options:
782
783 -v Include Verbose configuration data in the report
55d729e4 784 -f File containing the body of the report. Use this to
37fa004c 785 quickly send a prepared message.
105f9295 786 -F File to output the resulting mail message to, instead of mailing.
37fa004c 787 -S Send without asking for confirmation.
788 -a Address to send the report to. Defaults to `$address'.
789 -c Address to send copy of report to. Defaults to `$cc'.
790 -C Don't send copy to administrator.
55d729e4 791 -s Subject to include with the message. You will be prompted
37fa004c 792 if you don't supply one on the command line.
793 -b Body of the report. If not included on the command line, or
794 in a file with -f, you will get a chance to edit the message.
795 -r Your return address. The program will ask you to confirm
796 this if you don't give it here.
55d729e4 797 -e Editor to use.
37fa004c 798 -t Test mode. The target address defaults to `$testaddress'.
55d729e4 799 -d Data mode (the default if you redirect or pipe output.)
c07a80fd 800 This prints out your configuration data, without mailing
801 anything. You can use this with -v to get more complete data.
84902520 802 -ok Report successful build on this system to perl porters
55d729e4
GS
803 (use alone or with -v). Only use -ok if *everything* was ok:
804 if there were *any* problems at all, use -nok.
fb73857a 805 -okay As -ok but allow report from old builds.
55d729e4
GS
806 -nok Report unsuccessful build on this system to perl porters
807 (use alone or with -v). You must describe what went wrong
808 in the body of the report which you will be asked to edit.
809 -nokay As -nok but allow report from old builds.
810 -h Print this help message.
811
37fa004c 812EOF
813}
814
55d729e4
GS
815sub filename {
816 my $dir = $Is_VMS ? 'sys$scratch:'
817 : ($Is_MSWin32 && $ENV{'TEMP'}) ? $ENV{'TEMP'}
818 : '/tmp/';
819 $filename = "bugrep0$$";
820 $dir .= "\\" if $Is_MSWin32 and $dir !~ m|[\\/]$|;
821 $filename++ while -e "$dir$filename";
822 $filename = "$dir$filename";
823}
824
37fa004c 825sub paraprint {
826 my @paragraphs = split /\n{2,}/, "@_";
c07a80fd 827 print "\n\n";
37fa004c 828 for (@paragraphs) { # implicit local $_
55d729e4
GS
829 s/(\S)\s*\n/$1 /g;
830 write;
831 print "\n";
37fa004c 832 }
37fa004c 833}
37fa004c 834
835format STDOUT =
836^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
837$_
838.
d121ca8c
CS
839
840__END__
841
842=head1 NAME
843
844perlbug - how to submit bug reports on Perl
845
846=head1 SYNOPSIS
847
848B<perlbug> S<[ B<-v> ]> S<[ B<-a> I<address> ]> S<[ B<-s> I<subject> ]>
105f9295
HS
849S<[ B<-b> I<body> | B<-f> I<inputfile> ]> S<[ B<-F> I<outputfile> ]>
850S<[ B<-r> I<returnaddress> ]>
d121ca8c
CS
851S<[ B<-e> I<editor> ]> S<[ B<-c> I<adminaddress> | B<-C> ]>
852S<[ B<-S> ]> S<[ B<-t> ]> S<[ B<-d> ]> S<[ B<-h> ]>
853
55d729e4
GS
854B<perlbug> S<[ B<-v> ]> S<[ B<-r> I<returnaddress> ]>
855S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]>
1b0e3b9e 856
d121ca8c
CS
857=head1 DESCRIPTION
858
859A program to help generate bug reports about perl or the modules that
55d729e4 860come with it, and mail them.
d121ca8c
CS
861
862If you have found a bug with a non-standard port (one that was not part
863of the I<standard distribution>), a binary distribution, or a
864non-standard module (such as Tk, CGI, etc), then please see the
865documentation that came with that distribution to determine the correct
866place to report bugs.
867
868C<perlbug> is designed to be used interactively. Normally no arguments
869will be needed. Simply run it, and follow the prompts.
870
871If you are unable to run B<perlbug> (most likely because you don't have
872a working setup to send mail that perlbug recognizes), you may have to
873compose your own report, and email it to B<perlbug@perl.com>. You might
874find the B<-d> option useful to get summary information in that case.
875
876In any case, when reporting a bug, please make sure you have run through
877this checklist:
878
879=over 4
880
881=item What version of perl you are running?
882
883Type C<perl -v> at the command line to find out.
884
885=item Are you running the latest released version of perl?
886
887Look at http://www.perl.com/ to find out. If it is not the latest
888released version, get that one and see whether your bug has been
889fixed. Note that bug reports about old versions of perl, especially
890those prior to the 5.0 release, are likely to fall upon deaf ears.
891You are on your own if you continue to use perl1 .. perl4.
892
893=item Are you sure what you have is a bug?
894
895A significant number of the bug reports we get turn out to be documented
896features in perl. Make sure the behavior you are witnessing doesn't fall
897under that category, by glancing through the documentation that comes
898with perl (we'll admit this is no mean task, given the sheer volume of
899it all, but at least have a look at the sections that I<seem> relevant).
900
901Be aware of the familiar traps that perl programmers of various hues
902fall into. See L<perltrap>.
903
f27fa58d
MG
904Check in L<perldiag> to see what any Perl error message(s) mean.
905If message isn't in perldiag, it probably isn't generated by Perl.
906Consult your operating system documentation instead.
bdcdfa19
JH
907
908If you are on a non-UNIX platform check also L<perlport>, some
909features may not be implemented or work differently.
910
d121ca8c
CS
911Try to study the problem under the perl debugger, if necessary.
912See L<perldebug>.
913
914=item Do you have a proper test case?
915
916The easier it is to reproduce your bug, the more likely it will be
917fixed, because if no one can duplicate the problem, no one can fix it.
918A good test case has most of these attributes: fewest possible number
919of lines; few dependencies on external commands, modules, or
920libraries; runs on most platforms unimpeded; and is self-documenting.
921
922A good test case is almost always a good candidate to be on the perl
923test suite. If you have the time, consider making your test case so
924that it will readily fit into the standard test suite.
925
bdcdfa19
JH
926Remember also to include the B<exact> error messages, if any.
927"Perl complained something" is not an exact error message.
928
929If you get a core dump (or equivalent), you may use a debugger
930(B<dbx>, B<gdb>, etc) to produce a stack trace to include in the bug
931report. NOTE: unless your Perl has been compiled with debug info
932(often B<-g>), the stack trace is likely to be somewhat hard to use
933because it will most probably contain only the function names, not
934their arguments. If possible, recompile your Perl with debug info and
935reproduce the dump and the stack trace.
936
d121ca8c
CS
937=item Can you describe the bug in plain English?
938
939The easier it is to understand a reproducible bug, the more likely it
940will be fixed. Anything you can provide by way of insight into the
941problem helps a great deal. In other words, try to analyse the
942problem to the extent you feel qualified and report your discoveries.
943
944=item Can you fix the bug yourself?
945
946A bug report which I<includes a patch to fix it> will almost
947definitely be fixed. Use the C<diff> program to generate your patches
948(C<diff> is being maintained by the GNU folks as part of the B<diffutils>
949package, so you should be able to get it from any of the GNU software
950repositories). If you do submit a patch, the cool-dude counter at
951perlbug@perl.com will register you as a savior of the world. Your
952patch may be returned with requests for changes, or requests for more
953detailed explanations about your fix.
954
955Here are some clues for creating quality patches: Use the B<-c> or
956B<-u> switches to the diff program (to create a so-called context or
957unified diff). Make sure the patch is not reversed (the first
958argument to diff is typically the original file, the second argument
959your changed file). Make sure you test your patch by applying it with
960the C<patch> program before you send it on its way. Try to follow the
961same style as the code you are trying to patch. Make sure your patch
962really does work (C<make test>, if the thing you're patching supports
963it).
964
965=item Can you use C<perlbug> to submit the report?
966
967B<perlbug> will, amongst other things, ensure your report includes
968crucial information about your version of perl. If C<perlbug> is unable
969to mail your report after you have typed it in, you may have to compose
970the message yourself, add the output produced by C<perlbug -d> and email
971it to B<perlbug@perl.com>. If, for some reason, you cannot run
972C<perlbug> at all on your system, be sure to include the entire output
973produced by running C<perl -V> (note the uppercase V).
974
bdcdfa19
JH
975Whether you use C<perlbug> or send the email manually, please make
976your subject informative. "a bug" not informative. Neither is "perl
977crashes" nor "HELP!!!", these all are null information. A compact
978description of what's wrong is fine.
979
d121ca8c
CS
980=back
981
982Having done your bit, please be prepared to wait, to be told the bug
983is in your code, or even to get no reply at all. The perl maintainers
84902520
TB
984are busy folks, so if your problem is a small one or if it is difficult
985to understand or already known, they may not respond with a personal reply.
d121ca8c
CS
986If it is important to you that your bug be fixed, do monitor the
987C<Changes> file in any development releases since the time you submitted
988the bug, and encourage the maintainers with kind words (but never any
989flames!). Feel free to resend your bug report if the next released
990version of perl comes out and your bug is still present.
991
992=head1 OPTIONS
993
994=over 8
995
996=item B<-a>
997
998Address to send the report to. Defaults to `perlbug@perl.com'.
999
1000=item B<-b>
1001
1002Body of the report. If not included on the command line, or
1003in a file with B<-f>, you will get a chance to edit the message.
1004
1005=item B<-C>
1006
1007Don't send copy to administrator.
1008
1009=item B<-c>
1010
1011Address to send copy of report to. Defaults to the address of the
1012local perl administrator (recorded when perl was built).
1013
1014=item B<-d>
1015
1016Data mode (the default if you redirect or pipe output). This prints out
1017your configuration data, without mailing anything. You can use this
1018with B<-v> to get more complete data.
1019
1020=item B<-e>
1021
55d729e4 1022Editor to use.
d121ca8c
CS
1023
1024=item B<-f>
1025
1026File containing the body of the report. Use this to quickly send a
1027prepared message.
1028
105f9295
HS
1029=item B<-F>
1030
1031File to output the results to instead of sending as an email. Useful
1032particularly when running perlbug on a machine with no direct internet
1033connection.
1034
d121ca8c
CS
1035=item B<-h>
1036
1037Prints a brief summary of the options.
1038
1b0e3b9e
CR
1039=item B<-ok>
1040
84902520
TB
1041Report successful build on this system to perl porters. Forces B<-S>
1042and B<-C>. Forces and supplies values for B<-s> and B<-b>. Only
1b0e3b9e 1043prompts for a return address if it cannot guess it (for use with
84902520
TB
1044B<make>). Honors return address specified with B<-r>. You can use this
1045with B<-v> to get more complete data. Only makes a report if this
1046system is less than 60 days old.
1047
1048=item B<-okay>
1049
1050As B<-ok> except it will report on older systems.
1b0e3b9e 1051
55d729e4
GS
1052=item B<-nok>
1053
1054Report unsuccessful build on this system. Forces B<-C>. Forces and
1055supplies a value for B<-s>, then requires you to edit the report
1056and say what went wrong. Alternatively, a prepared report may be
1057supplied using B<-f>. Only prompts for a return address if it
1058cannot guess it (for use with B<make>). Honors return address
1059specified with B<-r>. You can use this with B<-v> to get more
1060complete data. Only makes a report if this system is less than 60
1061days old.
1062
1063=item B<-nokay>
1064
1065As B<-nok> except it will report on older systems.
1066
d121ca8c
CS
1067=item B<-r>
1068
1069Your return address. The program will ask you to confirm its default
1070if you don't use this option.
1071
1072=item B<-S>
1073
1074Send without asking for confirmation.
1075
1076=item B<-s>
1077
1078Subject to include with the message. You will be prompted if you don't
1079supply one on the command line.
1080
1081=item B<-t>
1082
1083Test mode. The target address defaults to `perlbug-test@perl.com'.
1084
1085=item B<-v>
1086
1087Include verbose configuration data in the report.
1088
1089=back
1090
1091=head1 AUTHORS
1092
1093Kenneth Albanowski (E<lt>kjahds@kjahds.comE<gt>), subsequently I<doc>tored
1094by Gurusamy Sarathy (E<lt>gsar@umich.eduE<gt>), Tom Christiansen
1b0e3b9e 1095(E<lt>tchrist@perl.comE<gt>), Nathan Torkington (E<lt>gnat@frii.comE<gt>),
55d729e4 1096Charles F. Randall (E<lt>cfr@pobox.comE<gt>), Mike Guy
bdcdfa19
JH
1097(E<lt>mjtg@cam.a.ukE<gt>), Dominic Dunlop (E<lt>domo@computer.orgE<gt>),
1098Hugo van der Sanden (E<lt>hv@crypt0.demon.co.ukE<gt>), and
1099Jarkko Hietaniemi (E<lt>jhi@iki.fiE<gt>).
d121ca8c
CS
1100
1101=head1 SEE ALSO
1102
bdcdfa19
JH
1103perl(1), perldebug(1), perldiag(1), perlport(1), perltrap(1),
1104diff(1), patch(1), dbx(1), gdb(1)
d121ca8c
CS
1105
1106=head1 BUGS
1107
1108None known (guess what must have been used to report them?)
1109
1110=cut
1111
37fa004c 1112!NO!SUBS!
1113
1114close OUT or die "Can't close $file: $!";
1115chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1116exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
8a5546a1 1117chdir $origdir;