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