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