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