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