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