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