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