From: Perl 5 Porters Date: Sat, 18 Nov 1995 03:15:13 +0000 (+0000) Subject: New utility. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=37fa004cecfa8362891b79aa03bec5e0ec865ef4;p=p5sagit%2Fp5-mst-13.2.git New utility. --- diff --git a/utils/perlbug.PL b/utils/perlbug.PL new file mode 100644 index 0000000..e877707 --- /dev/null +++ b/utils/perlbug.PL @@ -0,0 +1,499 @@ +#!/usr/local/bin/perl + +use Config; +use File::Basename qw(&basename &dirname); + +# List explicitly here the variables you want Configure to +# generate. Metaconfig only looks for shell variables, so you +# have to mention them as if they were shell variables, not +# %Config entries. Thus you write +# $startperl +# to ensure Configure will look for $Config{startperl}. + +# This forces PL files to create target in same directory as PL file. +# This is so that make depend always knows where to find PL derivatives. +chdir(dirname($0)); +($file = basename($0)) =~ s/\.PL$//; +$file =~ s/\.pl$// + if ($Config{'osname'} eq 'VMS' or + $Config{'osname'} eq 'OS2'); # "case-forgiving" + +open OUT,">$file" or die "Can't create $file: $!"; + +print "Extracting $file (with variable substitutions)\n"; + +# In this section, perl variables will be expanded during extraction. +# You can use $Config{...} to use Configure variables. + +print OUT <<"!GROK!THIS!"; +$Config{'startperl'} + eval 'exec perl -S \$0 "\$@"' + if 0; +!GROK!THIS! + +# In the following, perl variables are not expanded during extraction. + +print OUT <<'!NO!SUBS!'; + +use Config; +use Mail::Send; +use Mail::Util; +use Getopt::Std; + +use strict; + +sub paraprint; + +my($Version) = "1.06"; + +my( $file, $cc, $address, $perlbug, $testaddress, $filename, + $subject, $from, $verbose, $ed, + $fh, $me, $Is_VMS, $msg, $body, $andcc ); + +Init(); + +if($::opt_h) { Help(); exit; } + +Query(); +Edit(); +NowWhat(); +Send(); + +exit; + +sub Init { + + # -------- Setup -------- + + $Is_VMS = $::Config{'osname'} eq 'VMS'; + + getopts("hva:s:b:f:r:e:SCc:t"); + + + # This comment is needed to notify metaconfig that we are + # using the $perladmin, $cf_by, and $cf_time definitions. + + + # -------- Configuration --------- + + # perlbug address + $perlbug = 'perlbug@perl.com'; + + # Test address + $testaddress = 'perlbug-test@perl.com'; + + # Target address + $address = $::opt_a || ($::opt_t ? $testaddress : $perlbug); + + # Possible administrator addresses, in order of confidence + # (Note that cf_email is not mentioned to metaconfig, since + # we don't really want it. We'll just take it if we have to.) + $cc = ($::opt_C ? "" : ( + $::opt_c || $::Config{perladmin} || $::Config{cf_email} || $::Config{cf_by} + )); + + # Users address, used in message and in Reply-To header + $from = $::opt_r || ""; + + # Include verbose configuration information + $verbose = $::opt_v || 0; + + # Subject of bug-report message + $subject = $::opt_s || ""; + + # File to send as report + $file = $::opt_f || ""; + + # Body of report + $body = $::opt_b || ""; + + # Editor + $ed = ($::opt_f ? "file" : ( + $::opt_e || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT} || + ($Is_VMS ? "edit/tpu" : "vi") + )); + + # My username + $me = getpwuid($<); + +} + + +sub Query { + + # Explain what perlbug is + + paraprint <; + chop $subject; + + my($err)=0; + while( $subject =~ /^\s*$/ ) { + print "\nPlease enter a subject: "; + $subject = <>; + chop $subject; + if($err++>5) { + die "Aborting.\n"; + } + } + } + + + # Prompt for return address, if needed + if( !$from) { + + # Try and guess return address + my($domain) = Mail::Util::maildomain(); + + my($guess); + + if( !$domain) { + $guess = ""; + } elsif ($Is_VMS && !$::Config{'d_has_sockets'}) { + $guess = "$domain$me"; + } else { + $guess = "$me\@$domain" if $domain; + $guess = "$me\@unknown.addresss" unless $domain; + } + + if( $guess ) { + paraprint <; + chop $from; + + if($from eq "") { $from = $guess } + + } + + #if( $from =~ /^(.*)\@(.*)$/ ) { + # $mailname = $1; + # $maildomain = $2; + #} + + if( $from eq $cc or $me eq $cc ) { + # Try not to copy ourselves + $cc = "none"; + } + + + # Prompt for administrator address, unless an override was given + if( !$::opt_C and !$::opt_c ) { + paraprint <); + chop $entry; + + if($entry ne "") { + $cc = $entry; + if($me eq $cc) { $cc = "" } + } + + } + + if($cc eq "none") { $cc = "" } + + $andcc = " and $cc" if $cc; + + + # Prompt for editor, if no override is given + if(! $::opt_e and ! $::opt_f and ! $::opt_b) { + paraprint <); + chop $entry; + + if($entry ne "") { + $ed = $entry; + } + } + + + # Generate scratch file to edit report in + + $filename = ($Is_VMS ? 'sys$scratch:' : '/tmp/') . "bugrep0$$"; + $filename++ while -e $filename; + + + # Prompt for file to read report from, if needed + + if( $ed eq "file" and ! $file) { + paraprint <); + chop($entry); + + if(!-f $entry or !-r $entry) { + print "\n\nUnable to read `$entry'.\nExiting.\n"; + exit; + } + $file = $entry; + + } + + + # Generate report + + open(REP,">$filename"); + + print REP <) { + print REP $_ + } + close(F); + } else { + print REP "[Please enter your report here]\n"; + } + + print REP <); + chop $action; + + if($action =~ /^s/i) { # Send + # Send the message + last; + } elsif($action =~ /^f/i) { # File + print "\n\nName of file to save message in [perlbug.rep]: "; + my($file) = scalar(<>); + chop $file; + if($file eq "") { $file = "perlbug.rep" } + + open(FILE,">$file"); + open(REP,"<$filename"); + print FILE "To: $address\nSubject: $subject\n"; + print FILE "Cc: $cc\n" if $cc; + print FILE "Reply-To: $from\n" if $from; + print FILE "\n"; + while() { print FILE } + close(REP); + close(FILE); + + print "\nMessage saved in `$file'.\n"; + exit; + + } elsif($action =~ /^[drl]/i) { # Display, Redisplay, List + # Display the message + open(REP,"<$filename"); + while() { print $_ } + close(REP); + } elsif($action =~ /^e/i) { # Edit + # edit the message + system("$ed $filename"); + } elsif($action =~ /^[qc]/i) { # Cancel, Quit + 1 while unlink($filename); # remove all versions under VMS + print "\nCancelling.\n"; + exit(0); + } + + } + } +} + + +sub Send { + + # Message has been accepted for transmission -- Send the message + + $msg = new Mail::Send Subject => $subject, To => $address; + + $msg->cc($cc) if $cc; + $msg->add("Reply-To",$from) if $from; + + $fh = $msg->open; + + open(REP,"<$filename"); + while() { print $fh $_ } + close(REP); + + $fh->close; + + print "\nMessage sent.\n"; + + 1 while unlink($filename); # remove all versions under VMS + +} + +sub Help { + print <