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