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+(?:const\s+)?char.*?local_patches\[\]\s*=\s*{\s*$/; 34} 35 36if (! defined($_)) { 37 warn "Warning: local_patches section not found in patchlevel.h\n"; 38} 39 40my @patches; 41while (<PATCH_LEVEL>) { 42 last if /^\s*}/; 43 next if /^\s*#/; # preprocessor stuff 44 next if /PERL_GIT_UNPUSHED_COMMITS/; # XXX expand instead 45 next if /"uncommitted-changes"/; # XXX determine if active instead 46 chomp; 47 s/^\s+,?\s*"?//; 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("%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 warnings; 88no warnings 'once'; # Eventually, the $::opt_ stuff should get cleaned up 89use strict; 90use Config; 91use File::Spec; # keep perlbug Perl 5.005 compatible 92use Getopt::Std; 93use File::Basename 'basename'; 94 95sub paraprint; 96 97BEGIN { 98 eval { require Mail::Send;}; 99 $::HaveSend = ($@ eq ""); 100 eval { require Mail::Util; } ; 101 $::HaveUtil = ($@ eq ""); 102 # use secure tempfiles wherever possible 103 eval { require File::Temp; }; 104 $::HaveTemp = ($@ eq ""); 105 eval { require Module::CoreList; }; 106 $::HaveCoreList = ($@ eq ""); 107}; 108 109my $Version = "1.39"; 110 111# Changed in 1.06 to skip Mail::Send and Mail::Util if not available. 112# Changed in 1.07 to see more sendmail execs, and added pipe output. 113# Changed in 1.08 to use correct address for sendmail. 114# Changed in 1.09 to close the REP file before calling it up in the editor. 115# Also removed some old comments duplicated elsewhere. 116# Changed in 1.10 to run under VMS without Mail::Send; also fixed 117# temp filename generation. 118# Changed in 1.11 to clean up some text and removed Mail::Send deactivator. 119# Changed in 1.12 to check for editor errors, make save/send distinction 120# clearer and add $ENV{REPLYTO}. 121# Changed in 1.13 to hopefully make it more difficult to accidentally 122# send mail 123# Changed in 1.14 to make the prompts a little more clear on providing 124# helpful information. Also let file read fail gracefully. 125# Changed in 1.15 to add warnings to stop people using perlbug for non-bugs. 126# Also report selected environment variables. 127# Changed in 1.16 to include @INC, and allow user to re-edit if no changes. 128# Changed in 1.17 Win32 support added. GSAR 97-04-12 129# Changed in 1.18 add '-ok' option for reporting build success. CFR 97-06-18 130# Changed in 1.19 '-ok' default not '-v' 131# add local patch information 132# warn on '-ok' if this is an old system; add '-okay' 133# Changed in 1.20 Added patchlevel.h reading and version/config checks 134# Changed in 1.21 Added '-nok' for reporting build failure DFD 98-05-05 135# Changed in 1.22 Heavy reformatting & minor bugfixes HVDS 98-05-10 136# Changed in 1.23 Restore -ok(ay): say 'success'; don't prompt 137# Changed in 1.24 Added '-F<file>' to save report HVDS 98-07-01 138# Changed in 1.25 Warn on failure to open save file. HVDS 98-07-12 139# Changed in 1.26 Don't require -t STDIN for -ok. HVDS 98-07-15 140# Changed in 1.27 Added Mac OS and File::Spec support CNANDOR 99-07-27 141# Changed in 1.28 Additional questions for Perlbugtron RFOLEY 20.03.2000 142# Changed in 1.29 Perlbug(tron): auto(-ok), short prompts RFOLEY 05-05-2000 143# Changed in 1.30 Added warnings on failure to open files MSTEVENS 13-07-2000 144# Changed in 1.31 Add checks on close().Fix my $var unless. TJENNESS 26-07-2000 145# Changed in 1.32 Use File::Spec->tmpdir TJENNESS 20-08-2000 146# Changed in 1.33 Don't require -t STDOUT for -ok. 147# Changed in 1.34 Added Message-Id RFOLEY 18-06-2002 148# Changed in 1.35 Use File::Temp (patch from Solar Designer) NWCLARK 28-02-2004 149# Changed in 1.36 Initial Module::CoreList support Alexandr Ciornii 11-07-2007 150# Changed in 1.37 Killed some string evals, rewrote most prose JESSE 2008-06-08 151# Changed in 1.38 Actually enforce the CoreList check, 152# Record the module the user enters if they do so 153# Refactor prompts to use common code JESSE 2008-06-08 154# Changed in 1.39 Trap mail sending failures (simple ones) so JESSE 2008-06-08 155# users might be able to recover their bug reports 156# Refactor mail sending routines 157# Unify message building code 158# Unify message header building 159# Fix "module" prompting to not squish "category" prompting 160# use warnings; (except 'once' warnings) 161# Unified report fingerprint/change detection code 162# Removed some labeled 'gotos' 163#TODO: 164# make sure failure (transmission-wise) of Mail::Send is accounted for. 165# (This may work now. Unsure of the original author's issue -JESSE 2008-06-08) 166# - Test -b option 167 168my( $file, $usefile, $cc, $address, $bugaddress, $testaddress, $thanksaddress, 169 $filename, $messageid, $domain, $subject, $from, $verbose, $ed, $outfile, 170 $fh, $me, $body, $andcc, %REP, $ok, $thanks, $progname, 171 $Is_MacOS, $Is_MSWin32, $Is_Linux, $Is_VMS, $Is_OpenBSD, 172 $report_about_module, $category, $severity, 173 174); 175 176my $perl_version = $^V ? sprintf("%vd", $^V) : $]; 177 178my $config_tag2 = "$perl_version - $Config{cf_time}"; 179 180Init(); 181 182if ($::opt_h) { Help(); exit; } 183if ($::opt_d) { Dump(*STDOUT); exit; } 184if (!-t STDIN && !($ok and not $::opt_n)) { 185 paraprint <<"EOF"; 186Please use $progname interactively. If you want to 187include a file, you can use the -f switch. 188EOF 189 die "\n"; 190} 191 192Query(); 193Edit() unless $usefile || ($ok and not $::opt_n); 194NowWhat(); 195if ($outfile) { 196 save_message_to_disk($outfile); 197} else { 198 Send(); 199 if ($thanks) { 200 print "\nThank you for taking the time to send a thank-you message!\n\n"; 201 } else { 202 print "\nThank you for taking the time to file a bug report!\n\n"; 203 } 204} 205 206exit; 207 208sub ask_for_alternatives { # (category|severity) 209 my $name = shift; 210 my %alts = ( 211 'category' => { 212 'default' => 'core', 213 'ok' => 'install', 214 # Inevitably some of these will end up in RT whatever we do: 215 'thanks' => 'thanks', 216 'opts' => [qw(core docs install library utilities)], # patch, notabug 217 }, 218 'severity' => { 219 'default' => 'low', 220 'ok' => 'none', 221 'thanks' => 'none', 222 'opts' => [qw(critical high medium low wishlist none)], # zero 223 }, 224 ); 225 die "Invalid alternative ($name) requested\n" unless grep(/^$name$/, keys %alts); 226 my $alt = ""; 227 my $what = $ok || $thanks; 228 if ($what) { 229 $alt = $alts{$name}{$what}; 230 } else { 231 my @alts = @{$alts{$name}{'opts'}}; 232 print "\n\n"; 233 paraprint <<EOF; 234Please pick a $name from the following list: 235 236 @alts 237EOF 238 my $err = 0; 239 do { 240 if ($err++ > 5) { 241 die "Invalid $name: aborting.\n"; 242 } 243 $alt = _prompt('', "\u$name", $alts{$name}{'default'}); 244 $alt ||= $alts{$name}{'default'}; 245 } while !((($alt) = grep(/^$alt/i, @alts))); 246 } 247 lc $alt; 248} 249 250sub Init { 251 # -------- Setup -------- 252 253 $Is_MSWin32 = $^O eq 'MSWin32'; 254 $Is_VMS = $^O eq 'VMS'; 255 $Is_Linux = lc($^O) eq 'linux'; 256 $Is_OpenBSD = lc($^O) eq 'openbsd'; 257 $Is_MacOS = $^O eq 'MacOS'; 258 259 @ARGV = split m/\s+/, 260 MacPerl::Ask('Provide command line args here (-h for help):') 261 if $Is_MacOS && $MacPerl::Version =~ /App/; 262 263 if (!getopts("Adhva:s:b:f:F:r:e:SCc:to:n:T")) { Help(); exit; }; 264 265 # This comment is needed to notify metaconfig that we are 266 # using the $perladmin, $cf_by, and $cf_time definitions. 267 268 # -------- Configuration --------- 269 270 # perlbug address 271 $bugaddress = 'perlbug@perl.org'; 272 273 # Test address 274 $testaddress = 'perlbug-test@perl.org'; 275 276 # Thanks address 277 $thanksaddress = 'perl-thanks@perl.org'; 278 279 if (basename ($0) =~ /^perlthanks/i) { 280 # invoked as perlthanks 281 $::opt_T = 1; 282 $::opt_C = 1; # don't send a copy to the local admin 283 } 284 285 if ($::opt_T) { 286 $thanks = 'thanks'; 287 } 288 289 $progname = $thanks ? 'perlthanks' : 'perlbug'; 290 # Target address 291 $address = $::opt_a || ($::opt_t ? $testaddress 292 : $thanks ? $thanksaddress : $bugaddress); 293 294 # Users address, used in message and in Reply-To header 295 $from = $::opt_r || ""; 296 297 # Include verbose configuration information 298 $verbose = $::opt_v || 0; 299 300 # Subject of bug-report message 301 $subject = $::opt_s || ""; 302 303 # Send a file 304 $usefile = ($::opt_f || 0); 305 306 # File to send as report 307 $file = $::opt_f || ""; 308 309 # File to output to 310 $outfile = $::opt_F || ""; 311 312 # Body of report 313 $body = $::opt_b || ""; 314 315 # Editor 316 $ed = $::opt_e || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT} 317 || ($Is_VMS && "edit/tpu") 318 || ($Is_MSWin32 && "notepad") 319 || ($Is_MacOS && '') 320 || "vi"; 321 322 # Not OK - provide build failure template by finessing OK report 323 if ($::opt_n) { 324 if (substr($::opt_n, 0, 2) eq 'ok' ) { 325 $::opt_o = substr($::opt_n, 1); 326 } else { 327 Help(); 328 exit(); 329 } 330 } 331 332 # OK - send "OK" report for build on this system 333 $ok = ''; 334 if ($::opt_o) { 335 if ($::opt_o eq 'k' or $::opt_o eq 'kay') { 336 my $age = time - $patchlevel_date; 337 if ($::opt_o eq 'k' and $age > 60 * 24 * 60 * 60 ) { 338 my $date = localtime $patchlevel_date; 339 print <<"EOF"; 340"perlbug -ok" and "perlbug -nok" do not report on Perl versions which 341are more than 60 days old. This Perl version was constructed on 342$date. If you really want to report this, use 343"perlbug -okay" or "perlbug -nokay". 344EOF 345 exit(); 346 } 347 # force these options 348 unless ($::opt_n) { 349 $::opt_S = 1; # don't prompt for send 350 $::opt_b = 1; # we have a body 351 $body = "Perl reported to build OK on this system.\n"; 352 } 353 $::opt_C = 1; # don't send a copy to the local admin 354 $::opt_s = 1; # we have a subject line 355 $subject = ($::opt_n ? 'Not ' : '') 356 . "OK: perl $perl_version ${patch_tags}on" 357 ." $::Config{'archname'} $::Config{'osvers'} $subject"; 358 $ok = 'ok'; 359 } else { 360 Help(); 361 exit(); 362 } 363 } 364 365 # Possible administrator addresses, in order of confidence 366 # (Note that cf_email is not mentioned to metaconfig, since 367 # we don't really want it. We'll just take it if we have to.) 368 # 369 # This has to be after the $ok stuff above because of the way 370 # that $::opt_C is forced. 371 $cc = $::opt_C ? "" : ( 372 $::opt_c || $::Config{'perladmin'} 373 || $::Config{'cf_email'} || $::Config{'cf_by'} 374 ); 375 376 if ($::HaveUtil) { 377 $domain = Mail::Util::maildomain(); 378 } elsif ($Is_MSWin32) { 379 $domain = $ENV{'USERDOMAIN'}; 380 } else { 381 require Sys::Hostname; 382 $domain = Sys::Hostname::hostname(); 383 } 384 385 # Message-Id - rjsf 386 $messageid = "<$::Config{'version'}_${$}_".time."\@$domain>"; 387 388 # My username 389 $me = $Is_MSWin32 ? $ENV{'USERNAME'} 390 : $^O eq 'os2' ? $ENV{'USER'} || $ENV{'LOGNAME'} 391 : $Is_MacOS ? $ENV{'USER'} 392 : eval { getpwuid($<) }; # May be missing 393 394 $from = $::Config{'cf_email'} 395 if !$from && $::Config{'cf_email'} && $::Config{'cf_by'} && $me && 396 ($me eq $::Config{'cf_by'}); 397} # sub Init 398 399sub Query { 400 # Explain what perlbug is 401 unless ($ok) { 402 if ($thanks) { 403 paraprint <<'EOF'; 404This program provides an easy way to send a thank-you message back to the 405authors and maintainers of perl. 406 407If you wish to submit a bug report, please run it without the -T flag. 408EOF 409 } else { 410 paraprint <<"EOF"; 411This program provides an easy way to create a message reporting a 412bug in the core perl distribution (along with tests or patches) 413to the volunteers who maintain perl at $address. To send a thank-you 414note to $thanksaddress instead of a bug report, please use the -T flag. 415 416Please do not use $0 to send test messages, test whether perl 417works, or to report bugs in perl modules from CPAN. 418 419For help using perl, try posting to the Usenet newsgroup 420comp.lang.perl.misc. 421EOF 422 } 423 } 424 425 # Prompt for subject of message, if needed 426 427 if ($subject && TrivialSubject($subject)) { 428 $subject = ''; 429 } 430 431 unless ($subject) { 432 print 433"First of all, please provide a subject for the message.\n"; 434 if ( not $thanks) { 435 paraprint <<EOF; 436This should be a concise description of your bug or problem 437which will help the volunteers working to improve perl to categorize 438and resolve the issue. Be as specific and descriptive as 439you can. A subject like "perl bug" or "perl problem" will make it 440much less likely that your issue gets the attention it deserves. 441EOF 442 } 443 444 my $err = 0; 445 do { 446 $subject = _prompt('','Subject'); 447 if ($err++ == 5) { 448 if ($thanks) { 449 $subject = 'Thanks for Perl'; 450 } else { 451 die "Aborting.\n"; 452 } 453 } 454 } while (TrivialSubject($subject)); 455 } 456 457 # Prompt for return address, if needed 458 unless ($::opt_r) { 459 # Try and guess return address 460 my $guess; 461 462 $guess = $ENV{'REPLY-TO'} || $ENV{'REPLYTO'} || $from || ''; 463 if ($Is_MacOS) { 464 require Mac::InternetConfig; 465 $guess = $Mac::InternetConfig::InternetConfig{ 466 Mac::InternetConfig::kICEmail() 467 }; 468 } 469 470 unless ($guess) { 471 # move $domain to where we can use it elsewhere 472 if ($domain) { 473 if ($Is_VMS && !$::Config{'d_socket'}) { 474 $guess = "$domain\:\:$me"; 475 } else { 476 $guess = "$me\@$domain" if $domain; 477 } 478 } 479 } 480 481 if ($guess) { 482 unless ($ok) { 483 paraprint <<EOF; 484Perl's developers may need your email address to contact you for 485further information about your issue or to inform you when it is 486resolved. If the default shown is not your email address, please 487correct it. 488EOF 489 } 490 } else { 491 paraprint <<EOF; 492Please enter your full internet email address so that Perl's 493developers can contact you with questions about your issue or to 494inform you that it has been resolved. 495EOF 496 } 497 498 if ($ok && $guess) { 499 # use it 500 $from = $guess; 501 } else { 502 # verify it 503 $from = _prompt('','Your address',$guess); 504 $from = $guess if $from eq ''; 505 } 506 } 507 508 if ($from eq $cc or $me eq $cc) { 509 # Try not to copy ourselves 510 $cc = "yourself"; 511 } 512 513 # Prompt for administrator address, unless an override was given 514 if( !$::opt_C and !$::opt_c ) { 515 my $description = <<EOF; 516$0 can send a copy of this report to your local perl 517administrator. If the address below is wrong, please correct it, 518or enter 'none' or 'yourself' to not send a copy. 519EOF 520 my $entry = _prompt($description, "Local perl administrator", $cc); 521 522 if ($entry ne "") { 523 $cc = $entry; 524 $cc = '' if $me eq $cc; 525 } 526 } 527 528 $cc = '' if $cc =~ /^(none|yourself|me|myself|ourselves)$/i; 529 if ($cc) { 530 $andcc = " and $cc" 531 } else { 532 $andcc = '' 533 } 534 535 # Prompt for editor, if no override is given 536editor: 537 unless ($::opt_e || $::opt_f || $::opt_b) { 538 539 my $description; 540 541 chomp (my $common_end = <<"EOF"); 542You will probably want to use a text editor to enter the body of 543your report. If "$ed" is the editor you want to use, then just press 544Enter, otherwise type in the name of the editor you would like to 545use. 546 547If you have already composed the body of your report, you may enter 548"file", and $0 will prompt you to enter the name of the file 549containing your report. 550EOF 551 552 if ($thanks) { 553 $description = <<"EOF"; 554It's now time to compose your thank-you message. 555 556Some information about your local perl configuration will automatically 557be included at the end of your message, because we're curious about 558the different ways that people build and use perl. If you'd rather 559not share this information, you're welcome to delete it. 560 561$common_end 562EOF 563 } else { 564 $description = <<"EOF"; 565It's now time to compose your bug report. Try to make the report 566concise but descriptive. Please include any detail which you think 567might be relevant or might help the volunteers working to improve 568perl. If you are reporting something that does not work as you think 569it should, please try to include examples of the actual result and of 570what you expected. 571 572Some information about your local perl configuration will automatically 573be included at the end of your report. If you are using an unusual 574version of perl, it would be useful if you could confirm that you 575can replicate the problem on a standard build of perl as well. 576 577$common_end 578EOF 579 } 580 581 my $entry = _prompt($description, "Editor", $ed); 582 $usefile = 0; 583 if ($entry eq "file") { 584 $usefile = 1; 585 } elsif ($entry ne "") { 586 $ed = $entry; 587 } 588 } 589 if ($::HaveCoreList && !$ok && !$thanks) { 590 my $description = <<EOF; 591If your bug is about a Perl module rather than a core language 592feature, please enter its name here. If it's not, just hit Enter 593to skip this question. 594EOF 595 596 my $entry = ''; 597 while ($entry eq '') { 598 $entry = _prompt($description, 'Module'); 599 my $first_release = Module::CoreList->first_release($entry); 600 if ($entry and not $first_release) { 601 paraprint <<EOF; 602$entry is not a "core" Perl module. Please check that you entered 603its name correctly. If it is correct, quit this program, try searching 604for $entry on http://rt.cpan.org, and report your issue there. 605EOF 606 607 $entry = ''; 608 } elsif (my $bug_tracker = $Module::CoreList::bug_tracker{$entry}) { 609 paraprint <<"EOF"; 610$entry included with core Perl is copied directly from the CPAN distribution. 611Please report bugs in $entry directly to its maintainers using $bug_tracker 612EOF 613 $entry = ''; 614 } elsif ($entry) { 615 $category ||= 'library'; 616 $report_about_module = $entry; 617 last; 618 } else { 619 last; 620 } 621 } 622 } 623 624 # Prompt for category of bug 625 $category ||= ask_for_alternatives('category'); 626 627 # Prompt for severity of bug 628 $severity ||= ask_for_alternatives('severity'); 629 630 # Generate scratch file to edit report in 631 $filename = filename(); 632 633 # Prompt for file to read report from, if needed 634 if ($usefile and !$file) { 635filename: 636 my $description = <<EOF; 637What is the name of the file that contains your report? 638EOF 639 my $entry = _prompt($description, "Filename"); 640 641 if ($entry eq "") { 642 paraprint <<EOF; 643It seems you didn't enter a filename. Please choose to use a text 644editor or enter a filename. 645EOF 646 goto editor; 647 } 648 649 unless (-f $entry and -r $entry) { 650 paraprint <<EOF; 651'$entry' doesn't seem to be a readable file. You may have mistyped 652its name or may not have permission to read it. 653 654If you don't want to use a file as the content of your report, just 655hit Enter and you'll be able to select a text editor instead. 656EOF 657 goto filename; 658 } 659 $file = $entry; 660 } 661 662 # Generate report 663 open(REP,">$filename") or die "Unable to create report file '$filename': $!\n"; 664 my $reptype = !$ok ? ($thanks ? 'thank-you' : 'bug') 665 : $::opt_n ? "build failure" : "success"; 666 667 print REP <<EOF; 668This is a $reptype report for perl from $from, 669generated with the help of perlbug $Version running under perl $perl_version. 670 671EOF 672 673 if ($body) { 674 print REP $body; 675 } elsif ($usefile) { 676 open(F, "<$file") 677 or die "Unable to read report file from '$file': $!\n"; 678 while (<F>) { 679 print REP $_ 680 } 681 close(F) or die "Error closing '$file': $!"; 682 } else { 683 if ($thanks) { 684 print REP <<'EOF'; 685 686----------------------------------------------------------------- 687[Please enter your thank-you message here] 688 689 690 691[You're welcome to delete anything below this line] 692----------------------------------------------------------------- 693EOF 694 } else { 695 print REP <<'EOF'; 696 697----------------------------------------------------------------- 698[Please describe your issue here] 699 700 701 702[Please do not change anything below this line] 703----------------------------------------------------------------- 704EOF 705 } 706 } 707 Dump(*REP); 708 close(REP) or die "Error closing report file: $!"; 709 710 # Set up an initial report fingerprint so we can compare it later 711 _fingerprint_lines_in_report(); 712 713} # sub Query 714 715sub Dump { 716 local(*OUT) = @_; 717 718 # these won't have been set if run with -d 719 $category ||= 'core'; 720 $severity ||= 'low'; 721 722 print OUT <<EFF; 723--- 724Flags: 725 category=$category 726 severity=$severity 727EFF 728 729 if ($report_about_module ) { 730 print OUT <<EFF; 731 module=$report_about_module 732EFF 733 } 734 if ($::opt_A) { 735 print OUT <<EFF; 736 ack=no 737EFF 738 } 739 print OUT <<EFF; 740--- 741EFF 742 print OUT "This perlbug was built using Perl $config_tag1\n", 743 "It is being executed now by Perl $config_tag2.\n\n" 744 if $config_tag2 ne $config_tag1; 745 746 print OUT <<EOF; 747Site configuration information for perl $perl_version: 748 749EOF 750 if ($::Config{cf_by} and $::Config{cf_time}) { 751 print OUT "Configured by $::Config{cf_by} at $::Config{cf_time}.\n\n"; 752 } 753 print OUT Config::myconfig; 754 755 if (@patches) { 756 print OUT join "\n ", "Locally applied patches:", @patches; 757 print OUT "\n"; 758 }; 759 760 print OUT <<EOF; 761 762--- 763\@INC for perl $perl_version: 764EOF 765 for my $i (@INC) { 766 print OUT " $i\n"; 767 } 768 769 print OUT <<EOF; 770 771--- 772Environment for perl $perl_version: 773EOF 774 my @env = 775 qw(PATH LD_LIBRARY_PATH LANG PERL_BADLANG SHELL HOME LOGDIR LANGUAGE); 776 push @env, $Config{ldlibpthname} if $Config{ldlibpthname} ne ''; 777 push @env, grep /^(?:PERL|LC_|LANG|CYGWIN)/, keys %ENV; 778 my %env; 779 @env{@env} = @env; 780 for my $env (sort keys %env) { 781 print OUT " $env", 782 exists $ENV{$env} ? "=$ENV{$env}" : ' (unset)', 783 "\n"; 784 } 785 if ($verbose) { 786 print OUT "\nComplete configuration data for perl $perl_version:\n\n"; 787 my $value; 788 foreach (sort keys %::Config) { 789 $value = $::Config{$_}; 790 $value = '' unless defined $value; 791 $value =~ s/'/\\'/g; 792 print OUT "$_='$value'\n"; 793 } 794 } 795} # sub Dump 796 797sub Edit { 798 # Edit the report 799 if ($usefile || $body) { 800 my $description = "Please make sure that the name of the editor you want to use is correct."; 801 my $entry = _prompt($description, 'Editor', $ed); 802 $ed = $entry unless $entry eq ''; 803 } 804 805 _edit_file($ed); 806} 807 808sub _edit_file { 809 my $editor = shift; 810 811 my $report_written = 0; 812 813 while ( !$report_written ) { 814 if ($Is_MacOS) { 815 require ExtUtils::MakeMaker; 816 ExtUtils::MM_MacOS::launch_file($filename); 817 _prompt('', "Press Enter when done." ); 818 } else { # we're not on oldschool mac os 819 my $exit_status = system("$editor $filename"); 820 if ($exit_status) { 821 my $desc = <<EOF; 822The editor you chose ('$editor') could not be run! 823 824If you mistyped its name, please enter it now, otherwise just press Enter. 825EOF 826 my $entry = _prompt( $desc, 'Editor', $editor ); 827 if ( $entry ne "" ) { 828 $editor = $entry; 829 next; 830 } else { 831 paraprint <<EOF; 832You may want to save your report to a file, so you can edit and 833mail it later. 834EOF 835 return; 836 } 837 } 838 } 839 return if ( $ok and not $::opt_n ) || $body; 840 841 # Check that we have a report that has some, eh, report in it. 842 843 unless ( _fingerprint_lines_in_report() ) { 844 my $description = <<EOF; 845It looks like you didn't enter a report. You may [r]etry your edit 846or [c]ancel this report. 847EOF 848 my $action = _prompt( $description, "Action (Retry/Cancel) " ); 849 if ( $action =~ /^[re]/i ) { # <R>etry <E>dit 850 next; 851 } elsif ( $action =~ /^[cq]/i ) { # <C>ancel, <Q>uit 852 Cancel(); # cancel exits 853 } 854 } 855 # Ok. the user did what they needed to; 856 return; 857 858 } 859} 860 861 862sub Cancel { 863 1 while unlink($filename); # remove all versions under VMS 864 print "\nQuitting without sending your message.\n"; 865 exit(0); 866} 867 868sub NowWhat { 869 # Report is done, prompt for further action 870 if( !$::opt_S ) { 871 while(1) { 872 my $menu = <<EOF; 873 874 875You have finished composing your message. At this point, you have 876a few options. You can: 877 878 * [Se]nd the message to $address$andcc, 879 * [D]isplay the message on the screen, 880 * [R]e-edit the message 881 * Display or change the message's [su]bject 882 * Save the message to a [f]ile to mail at another time 883 * [Q]uit without sending a message 884 885EOF 886 retry: 887 print $menu; 888 my $action = _prompt('', "Action (Send/Display/Edit/Subject/Save to File)");; 889 print "\n"; 890 if ($action =~ /^(f|sa)/i) { # <F>ile/<Sa>ve 891 if ( SaveMessage() ) { exit } 892 } elsif ($action =~ /^(d|l|sh)/i ) { # <D>isplay, <L>ist, <Sh>ow 893 # Display the message 894 open(REP, "<$filename") or die "Couldn't open file '$filename': $!\n"; 895 while (<REP>) { print $_ } 896 close(REP) or die "Error closing report file '$filename': $!"; 897 } elsif ($action =~ /^su/i) { # <Su>bject 898 my $reply = _prompt( "Subject: $subject", "If the above subject is fine, press Enter. Otherwise, type a replacement now\nSubject"); 899 if ($reply ne '') { 900 unless (TrivialSubject($reply)) { 901 $subject = $reply; 902 print "Subject: $subject\n"; 903 } 904 } 905 } elsif ($action =~ /^se/i) { # <S>end 906 # Send the message 907 my $reply = _prompt( "Are you certain you want to send this message?", 'Please type "yes" if you are','no'); 908 if ($reply =~ /^yes$/) { 909 last; 910 } else { 911 paraprint <<EOF; 912You didn't type "yes", so your message has not yet been sent. 913EOF 914 } 915 } elsif ($action =~ /^[er]/i) { # <E>dit, <R>e-edit 916 # edit the message 917 Edit(); 918 } elsif ($action =~ /^[qc]/i) { # <C>ancel, <Q>uit 919 Cancel(); 920 } elsif ($action =~ /^s/i) { 921 paraprint <<EOF; 922The command you entered was ambiguous. Please type "send", "save" or "subject". 923EOF 924 } 925 } 926 } 927} # sub NowWhat 928 929sub TrivialSubject { 930 my $subject = shift; 931 if ($subject =~ 932 /^(y(es)?|no?|help|perl( (bug|problem))?|bug|problem)$/i || 933 length($subject) < 4 || 934 $subject !~ /\s/) { 935 print "\nThe subject you entered wasn't very descriptive. Please try again.\n\n"; 936 return 1; 937 } else { 938 return 0; 939 } 940} 941 942sub SaveMessage { 943 my $file_save = $outfile || "$progname.rep"; 944 my $file = _prompt( '', "Name of file to save message in", $file_save ); 945 save_message_to_disk($file) || return undef; 946 print "\n"; 947 paraprint <<EOF; 948A copy of your message has been saved in '$file' for you to 949send to '$address' with your normal mail client. 950EOF 951} 952 953sub Send { 954 955 # Message has been accepted for transmission -- Send the message 956 957 # on linux certain "mail" implementations won't accept the subject 958 # as "~s subject" and thus the Subject header will be corrupted 959 # so don't use Mail::Send to be safe 960 eval { 961 if ( $::HaveSend && !$Is_Linux && !$Is_OpenBSD ) { 962 _send_message_mailsend(); 963 } elsif ($Is_VMS) { 964 _send_message_vms(); 965 } else { 966 _send_message_sendmail(); 967 } 968 }; 969 970 if ( my $error = $@ ) { 971 paraprint <<EOF; 972$0 has detected an error while trying to send your message: $error. 973 974Your message may not have been sent. You will now have a chance to save a copy to disk. 975EOF 976 SaveMessage(); 977 return; 978 } 979 980 1 while unlink($filename); # remove all versions under VMS 981} # sub Send 982 983sub Help { 984 print <<EOF; 985 986This program is designed to help you generate and send bug reports 987(and thank-you notes) about perl5 and the modules which ship with it. 988 989In most cases, you can just run "$0" interactively from a command 990line without any special arguments and follow the prompts. 991 992Advanced usage: 993 994$0 [-v] [-a address] [-s subject] [-b body | -f inpufile ] [ -F outputfile ] 995 [-r returnaddress] [-e editor] [-c adminaddress | -C] [-S] [-t] [-h] 996$0 [-v] [-r returnaddress] [-A] [-ok | -okay | -nok | -nokay] 997 998 999Options: 1000 1001 -v Include Verbose configuration data in the report 1002 -f File containing the body of the report. Use this to 1003 quickly send a prepared message. 1004 -F File to output the resulting mail message to, instead of mailing. 1005 -S Send without asking for confirmation. 1006 -a Address to send the report to. Defaults to '$address'. 1007 -c Address to send copy of report to. Defaults to '$cc'. 1008 -C Don't send copy to administrator. 1009 -s Subject to include with the message. You will be prompted 1010 if you don't supply one on the command line. 1011 -b Body of the report. If not included on the command line, or 1012 in a file with -f, you will get a chance to edit the message. 1013 -r Your return address. The program will ask you to confirm 1014 this if you don't give it here. 1015 -e Editor to use. 1016 -t Test mode. The target address defaults to '$testaddress'. 1017 -T Thank-you mode. The target address defaults to '$thanksaddress'. 1018 -d Data mode. This prints out your configuration data, without mailing 1019 anything. You can use this with -v to get more complete data. 1020 -A Don't send a bug received acknowledgement to the return address. 1021 -ok Report successful build on this system to perl porters 1022 (use alone or with -v). Only use -ok if *everything* was ok: 1023 if there were *any* problems at all, use -nok. 1024 -okay As -ok but allow report from old builds. 1025 -nok Report unsuccessful build on this system to perl porters 1026 (use alone or with -v). You must describe what went wrong 1027 in the body of the report which you will be asked to edit. 1028 -nokay As -nok but allow report from old builds. 1029 -h Print this help message. 1030 1031EOF 1032} 1033 1034sub filename { 1035 if ($::HaveTemp) { 1036 # Good. Use a secure temp file 1037 my ($fh, $filename) = File::Temp::tempfile(UNLINK => 1); 1038 close($fh); 1039 return $filename; 1040 } else { 1041 # Bah. Fall back to doing things less securely. 1042 my $dir = File::Spec->tmpdir(); 1043 $filename = "bugrep0$$"; 1044 $filename++ while -e File::Spec->catfile($dir, $filename); 1045 $filename = File::Spec->catfile($dir, $filename); 1046 } 1047} 1048 1049sub paraprint { 1050 my @paragraphs = split /\n{2,}/, "@_"; 1051 for (@paragraphs) { # implicit local $_ 1052 s/(\S)\s*\n/$1 /g; 1053 write; 1054 print "\n"; 1055 } 1056} 1057 1058sub _prompt { 1059 my ($explanation, $prompt, $default) = (@_); 1060 if ($explanation) { 1061 print "\n\n"; 1062 paraprint $explanation; 1063 } 1064 print $prompt. ($default ? " [$default]" :''). ": "; 1065 my $result = scalar(<>); 1066 chomp($result); 1067 $result =~ s/^\s*(.*?)\s*$/$1/s; 1068 if ($default && $result eq '') { 1069 return $default; 1070 } else { 1071 return $result; 1072 } 1073} 1074 1075sub _build_header { 1076 my %attr = (@_); 1077 1078 my $head = ''; 1079 for my $header (keys %attr) { 1080 $head .= "$header: ".$attr{$header}."\n"; 1081 } 1082 return $head; 1083} 1084 1085sub _message_headers { 1086 my %headers = ( To => $address, Subject => $subject ); 1087 $headers{'Cc'} = $cc if ($cc); 1088 $headers{'Message-Id'} = $messageid if ($messageid); 1089 $headers{'Reply-To'} = $from if ($from); 1090 return \%headers; 1091} 1092 1093sub build_complete_message { 1094 my $content = _build_header(%{_message_headers()}) . "\n\n"; 1095 open( REP, "<$filename" ) or die "Couldn't open file '$filename': $!\n"; 1096 while (<REP>) { $content .= $_; } 1097 close(REP) or die "Error closing report file '$filename': $!"; 1098 return $content; 1099} 1100 1101sub save_message_to_disk { 1102 my $file = shift; 1103 1104 open OUTFILE, ">$file" or do { warn "Couldn't open '$file': $!\n"; return undef}; 1105 print OUTFILE build_complete_message(); 1106 close(OUTFILE) or do { warn "Error closing $file: $!"; return undef }; 1107 print "\nMessage saved.\n"; 1108 return 1; 1109} 1110 1111sub _send_message_vms { 1112 if ( ( $address =~ /@/ and $address !~ /^\w+%"/ ) 1113 or ( $cc =~ /@/ and $cc !~ /^\w+%"/ ) ) { 1114 my $prefix; 1115 foreach ( qw[ IN MX SMTP UCX PONY WINS ], '' ) { 1116 $prefix = "$_%", last if $ENV{"MAIL\$PROTOCOL_$_"}; 1117 } 1118 $address = qq[${prefix}"$address"] unless $address =~ /^\w+%"/; 1119 $cc = qq[${prefix}"$cc"] unless !$cc || $cc =~ /^\w+%"/; 1120 } 1121 $subject =~ s/"/""/g; 1122 $address =~ s/"/""/g; 1123 $cc =~ s/"/""/g; 1124 my $sts = system(qq[mail/Subject="$subject" $filename. "$address","$cc"]); 1125 if ($sts) { 1126 die "Can't spawn off mail (leaving bug report in $filename): $sts"; 1127 } 1128} 1129 1130sub _send_message_mailsend { 1131 my $msg = Mail::Send->new(); 1132 my %headers = %{_message_headers()}; 1133 for my $key ( keys %headers) { 1134 $msg->add($key => $headers{$key}); 1135 } 1136 1137 $fh = $msg->open; 1138 open(REP, "<$filename") or die "Couldn't open '$filename': $!\n"; 1139 while (<REP>) { print $fh $_ } 1140 close(REP) or die "Error closing $filename: $!"; 1141 $fh->close or die "Error sending mail: $!"; 1142 1143 print "\nMessage sent.\n"; 1144} 1145 1146sub _probe_for_sendmail { 1147 my $sendmail = ""; 1148 for (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail)) { 1149 $sendmail = $_, last if -e $_; 1150 } 1151 if ( $^O eq 'os2' and $sendmail eq "" ) { 1152 my $path = $ENV{PATH}; 1153 $path =~ s:\\:/:; 1154 my @path = split /$Config{'path_sep'}/, $path; 1155 for (@path) { 1156 $sendmail = "$_/sendmail", last if -e "$_/sendmail"; 1157 $sendmail = "$_/sendmail.exe", last if -e "$_/sendmail.exe"; 1158 } 1159 } 1160 return $sendmail; 1161} 1162 1163sub _send_message_sendmail { 1164 my $sendmail = _probe_for_sendmail(); 1165 unless ($sendmail) { 1166 my $message_start = !$Is_Linux && !$Is_OpenBSD ? <<'EOT' : <<'EOT'; 1167It appears that there is no program which looks like "sendmail" on 1168your system and that the Mail::Send library from CPAN isn't available. 1169EOT 1170It appears that there is no program which looks like "sendmail" on 1171your system. 1172EOT 1173 paraprint(<<"EOF"), die "\n"; 1174$message_start 1175Because of this, there's no easy way to automatically send your 1176message. 1177 1178A copy of your message has been saved in '$filename' for you to 1179send to '$address' with your normal mail client. 1180EOF 1181 } 1182 1183 open( SENDMAIL, "|$sendmail -t -oi" ) 1184 || die "'|$sendmail -t -oi' failed: $!"; 1185 print SENDMAIL build_complete_message(); 1186 if ( close(SENDMAIL) ) { 1187 print "\nMessage sent\n"; 1188 } else { 1189 warn "\nSendmail returned status '", $? >> 8, "'\n"; 1190 } 1191} 1192 1193 1194 1195# a strange way to check whether any significant editing 1196# has been done: check whether any new non-empty lines 1197# have been added. 1198 1199sub _fingerprint_lines_in_report { 1200 my $new_lines = 0; 1201 # read in the report template once so that 1202 # we can track whether the user does any editing. 1203 # yes, *all* whitespace is ignored. 1204 1205 open(REP, "<$filename") or die "Unable to open report file '$filename': $!\n"; 1206 while (my $line = <REP>) { 1207 $line =~ s/\s+//g; 1208 $new_lines++ if (!$REP{$line}); 1209 1210 } 1211 close(REP) or die "Error closing report file '$filename': $!"; 1212 # returns the number of lines with content that wasn't there when last we looked 1213 return $new_lines; 1214} 1215 1216 1217 1218format STDOUT = 1219^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~ 1220$_ 1221. 1222 1223__END__ 1224 1225=head1 NAME 1226 1227perlbug - how to submit bug reports on Perl 1228 1229=head1 SYNOPSIS 1230 1231B<perlbug> 1232 1233B<perlbug> S<[ B<-v> ]> S<[ B<-a> I<address> ]> S<[ B<-s> I<subject> ]> 1234S<[ B<-b> I<body> | B<-f> I<inputfile> ]> S<[ B<-F> I<outputfile> ]> 1235S<[ B<-r> I<returnaddress> ]> 1236S<[ B<-e> I<editor> ]> S<[ B<-c> I<adminaddress> | B<-C> ]> 1237S<[ B<-S> ]> S<[ B<-t> ]> S<[ B<-d> ]> S<[ B<-A> ]> S<[ B<-h> ]> S<[ B<-T> ]> 1238 1239B<perlbug> S<[ B<-v> ]> S<[ B<-r> I<returnaddress> ]> 1240 S<[ B<-A> ]> S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]> 1241 1242=head1 DESCRIPTION 1243 1244 1245This program is designed to help you generate and send bug reports 1246(and thank-you notes) about perl5 and the modules which ship with it. 1247 1248In most cases, you can just run it interactively from a command 1249line without any special arguments and follow the prompts. 1250 1251If you have found a bug with a non-standard port (one that was not 1252part of the I<standard distribution>), a binary distribution, or a 1253non-core module (such as Tk, DBI, etc), then please see the 1254documentation that came with that distribution to determine the 1255correct place to report bugs. 1256 1257If you are unable to send your report using B<perlbug> (most likely 1258because your system doesn't have a way to send mail that perlbug 1259recognizes), you may be able to use this tool to compose your report 1260and save it to a file which you can then send to B<perlbug@perl.org> 1261using your regular mail client. 1262 1263In extreme cases, B<perlbug> may not work well enough on your system 1264to guide you through composing a bug report. In those cases, you 1265may be able to use B<perlbug -d> to get system configuration 1266information to include in a manually composed bug report to 1267B<perlbug@perl.org>. 1268 1269 1270When reporting a bug, please run through this checklist: 1271 1272=over 4 1273 1274=item What version of Perl you are running? 1275 1276Type C<perl -v> at the command line to find out. 1277 1278=item Are you running the latest released version of perl? 1279 1280Look at http://www.perl.org/ to find out. If you are not using the 1281latest released version, please try to replicate your bug on the 1282latest stable release. 1283 1284Note that reports about bugs in old versions of Perl, especially 1285those which indicate you haven't also tested the current stable 1286release of Perl, are likely to receive less attention from the 1287volunteers who build and maintain Perl than reports about bugs in 1288the current release. 1289 1290This tool isn't apropriate for reporting bugs in any version 1291prior to Perl 5.0. 1292 1293=item Are you sure what you have is a bug? 1294 1295A significant number of the bug reports we get turn out to be 1296documented features in Perl. Make sure the issue you've run into 1297isn't intentional by glancing through the documentation that comes 1298with the Perl distribution. 1299 1300Given the sheer volume of Perl documentation, this isn't a trivial 1301undertaking, but if you can point to documentation that suggests 1302the behaviour you're seeing is I<wrong>, your issue is likely to 1303receive more attention. You may want to start with B<perldoc> 1304L<perltrap> for pointers to common traps that new (and experienced) 1305Perl programmers run into. 1306 1307If you're unsure of the meaning of an error message you've run 1308across, B<perldoc> L<perldiag> for an explanation. If the message 1309isn't in perldiag, it probably isn't generated by Perl. You may 1310have luck consulting your operating system documentation instead. 1311 1312If you are on a non-UNIX platform B<perldoc> L<perlport>, as some 1313features may be unimplemented or work differently. 1314 1315You may be able to figure out what's going wrong using the Perl 1316debugger. For information about how to use the debugger B<perldoc> 1317L<perldebug>. 1318 1319=item Do you have a proper test case? 1320 1321The easier it is to reproduce your bug, the more likely it will be 1322fixed -- if nobody can duplicate your problem, it probably won't be 1323addressed. 1324 1325A good test case has most of these attributes: short, simple code; 1326few dependencies on external commands, modules, or libraries; no 1327platform-dependent code (unless it's a platform-specific bug); 1328clear, simple documentation. 1329 1330A good test case is almost always a good candidate to be included in 1331Perl's test suite. If you have the time, consider writing your test case so 1332that it can be easily included into the standard test suite. 1333 1334=item Have you included all relevant information? 1335 1336Be sure to include the B<exact> error messages, if any. 1337"Perl gave an error" is not an exact error message. 1338 1339If you get a core dump (or equivalent), you may use a debugger 1340(B<dbx>, B<gdb>, etc) to produce a stack trace to include in the bug 1341report. 1342 1343NOTE: unless your Perl has been compiled with debug info 1344(often B<-g>), the stack trace is likely to be somewhat hard to use 1345because it will most probably contain only the function names and not 1346their arguments. If possible, recompile your Perl with debug info and 1347reproduce the crash and the stack trace. 1348 1349=item Can you describe the bug in plain English? 1350 1351The easier it is to understand a reproducible bug, the more likely 1352it will be fixed. Any insight you can provide into the problem 1353will help a great deal. In other words, try to analyze the problem 1354(to the extent you can) and report your discoveries. 1355 1356=item Can you fix the bug yourself? 1357 1358A bug report which I<includes a patch to fix it> will almost 1359definitely be fixed. When sending a patch, please use the C<diff> 1360program with the C<-u> option to generate "unified" diff files. 1361Bug reports with patches are likely to receive significantly more 1362attention and interest than those without patches. 1363 1364Your patch may be returned with requests for changes, or requests for more 1365detailed explanations about your fix. 1366 1367Here are a few hints for creating high-quality patches: 1368 1369Make sure the patch is not reversed (the first argument to diff is 1370typically the original file, the second argument your changed file). 1371Make sure you test your patch by applying it with the C<patch> 1372program before you send it on its way. Try to follow the same style 1373as the code you are trying to patch. Make sure your patch really 1374does work (C<make test>, if the thing you're patching is covered 1375by Perl's test suite). 1376 1377=item Can you use C<perlbug> to submit the report? 1378 1379B<perlbug> will, amongst other things, ensure your report includes 1380crucial information about your version of perl. If C<perlbug> is 1381unable to mail your report after you have typed it in, you may have 1382to compose the message yourself, add the output produced by C<perlbug 1383-d> and email it to B<perlbug@perl.org>. If, for some reason, you 1384cannot run C<perlbug> at all on your system, be sure to include the 1385entire output produced by running C<perl -V> (note the uppercase V). 1386 1387Whether you use C<perlbug> or send the email manually, please make 1388your Subject line informative. "a bug" is not informative. Neither 1389is "perl crashes" nor is "HELP!!!". These don't help. A compact 1390description of what's wrong is fine. 1391 1392=item Can you use C<perlbug> to submit a thank-you note? 1393 1394Yes, you can do this by either using the C<-T> option. 1395Thank-you notes are good. It makes people 1396smile. 1397 1398=back 1399 1400Having done your bit, please be prepared to wait, to be told the 1401bug is in your code, or possibly to get no reply at all. The 1402volunteers who maintain Perl are busy folks, so if your problem is 1403an obvious bug in your own code, is difficult to understand or is 1404a duplicate of an existing report, you may not receive a personal 1405reply. 1406 1407If it is important to you that your bug be fixed, do monitor the 1408perl5-porters@perl.org mailing list and the commit logs to development 1409versions of Perl, and encourage the maintainers with kind words or 1410offers of frosty beverages. (Please do be kind to the maintainers. 1411Harassing or flaming them is likely to have the opposite effect of 1412the one you want.) 1413 1414Feel free to update the ticket about your bug on http://rt.perl.org 1415if a new version of Perl is released and your bug is still present. 1416 1417=head1 OPTIONS 1418 1419=over 8 1420 1421=item B<-a> 1422 1423Address to send the report to. Defaults to B<perlbug@perl.org>. 1424 1425=item B<-A> 1426 1427Don't send a bug received acknowledgement to the reply address. 1428Generally it is only a sensible to use this option if you are a 1429perl maintainer actively watching perl porters for your message to 1430arrive. 1431 1432=item B<-b> 1433 1434Body of the report. If not included on the command line, or 1435in a file with B<-f>, you will get a chance to edit the message. 1436 1437=item B<-C> 1438 1439Don't send copy to administrator. 1440 1441=item B<-c> 1442 1443Address to send copy of report to. Defaults to the address of the 1444local perl administrator (recorded when perl was built). 1445 1446=item B<-d> 1447 1448Data mode (the default if you redirect or pipe output). This prints out 1449your configuration data, without mailing anything. You can use this 1450with B<-v> to get more complete data. 1451 1452=item B<-e> 1453 1454Editor to use. 1455 1456=item B<-f> 1457 1458File containing the body of the report. Use this to quickly send a 1459prepared message. 1460 1461=item B<-F> 1462 1463File to output the results to instead of sending as an email. Useful 1464particularly when running perlbug on a machine with no direct internet 1465connection. 1466 1467=item B<-h> 1468 1469Prints a brief summary of the options. 1470 1471=item B<-ok> 1472 1473Report successful build on this system to perl porters. Forces B<-S> 1474and B<-C>. Forces and supplies values for B<-s> and B<-b>. Only 1475prompts for a return address if it cannot guess it (for use with 1476B<make>). Honors return address specified with B<-r>. You can use this 1477with B<-v> to get more complete data. Only makes a report if this 1478system is less than 60 days old. 1479 1480=item B<-okay> 1481 1482As B<-ok> except it will report on older systems. 1483 1484=item B<-nok> 1485 1486Report unsuccessful build on this system. Forces B<-C>. Forces and 1487supplies a value for B<-s>, then requires you to edit the report 1488and say what went wrong. Alternatively, a prepared report may be 1489supplied using B<-f>. Only prompts for a return address if it 1490cannot guess it (for use with B<make>). Honors return address 1491specified with B<-r>. You can use this with B<-v> to get more 1492complete data. Only makes a report if this system is less than 60 1493days old. 1494 1495=item B<-nokay> 1496 1497As B<-nok> except it will report on older systems. 1498 1499=item B<-r> 1500 1501Your return address. The program will ask you to confirm its default 1502if you don't use this option. 1503 1504=item B<-S> 1505 1506Send without asking for confirmation. 1507 1508=item B<-s> 1509 1510Subject to include with the message. You will be prompted if you don't 1511supply one on the command line. 1512 1513=item B<-t> 1514 1515Test mode. The target address defaults to B<perlbug-test@perl.org>. 1516 1517=item B<-T> 1518 1519Send a thank-you note instead of a bug report. 1520 1521=item B<-v> 1522 1523Include verbose configuration data in the report. 1524 1525=back 1526 1527=head1 AUTHORS 1528 1529Kenneth Albanowski (E<lt>kjahds@kjahds.comE<gt>), subsequently 1530I<doc>tored by Gurusamy Sarathy (E<lt>gsar@activestate.comE<gt>), 1531Tom Christiansen (E<lt>tchrist@perl.comE<gt>), Nathan Torkington 1532(E<lt>gnat@frii.comE<gt>), Charles F. Randall (E<lt>cfr@pobox.comE<gt>), 1533Mike Guy (E<lt>mjtg@cam.a.ukE<gt>), Dominic Dunlop 1534(E<lt>domo@computer.orgE<gt>), Hugo van der Sanden (E<lt>hv@crypt.org<gt>), 1535Jarkko Hietaniemi (E<lt>jhi@iki.fiE<gt>), Chris Nandor 1536(E<lt>pudge@pobox.comE<gt>), Jon Orwant (E<lt>orwant@media.mit.eduE<gt>, 1537Richard Foley (E<lt>richard.foley@rfi.netE<gt>), and Jesse Vincent 1538(E<lt>jesse@bestpractical.com<gt>). 1539 1540=head1 SEE ALSO 1541 1542perl(1), perldebug(1), perldiag(1), perlport(1), perltrap(1), 1543diff(1), patch(1), dbx(1), gdb(1) 1544 1545=head1 BUGS 1546 1547None known (guess what must have been used to report them?) 1548 1549=cut 1550 1551!NO!SUBS! 1552 1553close OUT or die "Can't close $file: $!"; 1554chmod 0755, $file or die "Can't reset permissions for $file: $!\n"; 1555exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':'; 1556chdir $origdir; 1557