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