summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGurusamy Sarathy <gsar@cpan.org>1998-05-15 02:41:58 +0000
committerGurusamy Sarathy <gsar@cpan.org>1998-05-15 02:41:58 +0000
commit55d729e4e15089064cd25ed6dce2c105389f3837 (patch)
tree051c5ca4ce1910143237cc92caf129a28ce98436
parent6ff81951f79dec32e15a779d288c1047f0e4fefb (diff)
downloadperl-55d729e4e15089064cd25ed6dce2c105389f3837.tar.gz
[win32] merge changes#922,944,949,965,970 from maintbranch
p4raw-link: @970 on //depot/maint-5.004/perl: 5362f8886d6c3fb908c863d910b1a158479419e2 p4raw-link: @965 on //depot/maint-5.004/perl: 8472ac73d6d802946d766b5459d2d9c334889a3f p4raw-link: @949 on //depot/maint-5.004/perl: 4b161ae29769b4a3eb304314bbbfe5969417c8ec p4raw-link: @944 on //depot/maint-5.004/perl: fa366f5fbba3f21113f9677105663454a3e0b678 p4raw-link: @922 on //depot/maint-5.004/perl: 68daf0ababdc0e913335a90c4361b792b2715301 p4raw-id: //depot/win32/perl@978
-rw-r--r--MANIFEST2
-rw-r--r--Porting/makerel16
-rw-r--r--Porting/patching.pod275
-rw-r--r--ext/POSIX/POSIX.pod12
-rw-r--r--gv.c44
-rw-r--r--gv.h1
-rw-r--r--lib/File/Find.pm2
-rw-r--r--op.c59
-rw-r--r--pod/Makefile4
-rw-r--r--pod/perlfunc.pod9
-rw-r--r--pod/perlop.pod5
-rw-r--r--pod/pod2man.PL4
-rwxr-xr-xt/lib/filefind.t3
-rwxr-xr-xt/op/defins.t144
-rwxr-xr-xt/op/die_exit.t4
-rwxr-xr-xt/op/ipcmsg.t2
-rwxr-xr-xt/op/ipcsem.t2
-rw-r--r--utils/perlbug.PL1115
18 files changed, 1077 insertions, 626 deletions
diff --git a/MANIFEST b/MANIFEST
index e1365e3ffb..1bd0206e17 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -18,6 +18,7 @@ Porting/Glossary Glossary of config.sh variables
Porting/config.sh Sample config.sh
Porting/config_H Sample config.h
Porting/makerel Release making utility
+Porting/patching.pod How to report changes made to Perl
Porting/patchls Flexible patch file listing utility
Porting/pumpkin.pod Guidelines and hints for Perl maintainers
README The Instructions
@@ -825,6 +826,7 @@ t/op/chop.t See if chop works
t/op/closure.t See if closures work
t/op/cmp.t See if the various string and numeric compare work
t/op/cond.t See if conditional expressions work
+t/op/defins.t See if auto-insert of defined() works
t/op/delete.t See if delete works
t/op/die_exit.t See if die and exit status interaction works
t/op/do.t See if subroutines work
diff --git a/Porting/makerel b/Porting/makerel
index f719a5e936..d6582edba1 100644
--- a/Porting/makerel
+++ b/Porting/makerel
@@ -21,9 +21,15 @@ $patchlevel_h = `grep '#define ' patchlevel.h`;
print $patchlevel_h;
$patchlevel = $1 if $patchlevel_h =~ /PATCHLEVEL\s+(\d+)/;
$subversion = $1 if $patchlevel_h =~ /SUBVERSION\s+(\d+)/;
-die "Unable to parse patchlevel.h" unless $subversion > 0;
+die "Unable to parse patchlevel.h" unless $subversion >= 0;
$vers = sprintf("5.%03d", $patchlevel);
-$vers.= sprintf( "_%02d", $subversion) if $subversion;
+$vms_vers = sprintf("5_%03d", $patchlevel);
+if ($subversion) {
+ $vers.= sprintf( "_%02d", $subversion);
+ $vms_vers.= sprintf( "%02d", $subversion);
+} else {
+ $vms_vers.= " ";
+}
$perl = "perl$vers";
$reldir = "$relroot/$perl";
@@ -47,6 +53,10 @@ die "Aborted.\n" if @$missentry or @$missfile;
print "\n";
+print "Updating VMS version specific files with $vms_vers...\n";
+system("perl -pi -e 's/^\QPERL_VERSION = \E\d\_\d+(\s*\#)/PERL_VERSION = $vms_vers$1/' vms/descrip.mms");
+
+
print "Setting file permissions...\n";
system("find . -type f -print | xargs chmod -w");
system("find . -type d -print | xargs chmod g-s");
@@ -78,7 +88,7 @@ print "\n";
print "Creating $reldir release directory...\n";
-die "$reldir release directory already exists\n" if -e "../$perl";
+die "$reldir release directory already exists\n" if -e "../$reldir";
die "$reldir.tar.gz release file already exists\n" if -e "../$reldir.tar.gz";
mkdir($reldir, 0755) or die "mkdir $reldir: $!\n";
print "\n";
diff --git a/Porting/patching.pod b/Porting/patching.pod
new file mode 100644
index 0000000000..b2a86b6f34
--- /dev/null
+++ b/Porting/patching.pod
@@ -0,0 +1,275 @@
+=head1 Name
+
+patching.pod - Appropriate format for patches to the perl source tree
+
+=head2re to get this document
+
+The latest version of this document is available from
+ http://www.tdrenterprises.com/perl/perlpatch.html
+
+=head2 How to contribute to this document
+
+You may mail corrections, additions, and suggestions to me
+at dgris@tdrenterprises.com but the preferred method would be
+to follow the instructions set forth in this document and
+submit a patch 8-).
+
+=head1 Description
+
+=head2 Why this document exists
+
+As an open source project Perl relies on patches and contributions from
+its users to continue functioning properly and to root out the inevitable
+bugs. But, some users are unsure as to the I<right> way to prepare a patch
+and end up submitting seriously malformed patches. This makes it very
+difficult for the current maintainer to integrate said patches into their
+distribution. This document sets out usage guidelines for patches in an
+attempt to make everybody's life easier.
+
+=head2 Common problems
+
+The most common problems appear to be patches being mangled by certain
+mailers (I won't name names, but most of these seem to be originating on
+boxes running a certain popular commercial operating system). Other problems
+include patches not rooted in the appropriate place in the directory structure,
+and patches not produced using standard utilities (such as diff).
+
+=head1 Proper Patch Guidelines
+
+=head2 How to prepare your patch
+
+=over 4
+
+=item Creating your patch
+
+First, back up the original files. This can't be stressed enough,
+back everything up _first_.
+
+Also, please create patches against a clean distribution of the perl source.
+This insures that everyone else can apply your patch without clobbering their
+source tree.
+
+=item diff
+
+While individual tastes vary (and are not the point here) patches should
+be created using either C<-u> or C<-c> arguments to diff. These produce,
+respectively, unified diffs (where the changed line appears immediately next
+to the original) and context diffs (where several lines surrounding the changes
+are included). See the manpage for diff for more details.
+
+Also, the preferred method for patching is -
+
+C<diff [C<-c> | C<-u>] E<lt>old-fileE<gt> E<lt>new-fileE<gt>>
+
+Note the order of files.
+
+Also, if your patch is to the core (rather than to a module) it
+is better to create it as a context diff as some machines have
+broken patch utilities that choke on unified diffs.
+
+=item Directories
+
+Patches should be generated from the source root directory, not from the
+directory that the patched file resides in. This insures that the maintainer
+patches the proper file and avoids name collisions (especially common when trying
+to apply patches to files that appear in both $src_root/ext/* and $src_root/lib/*).
+It is better to diff the file in $src_root/ext than the file in $src_root/lib.
+
+=item Filenames
+
+The most usual convention when submitting patches for a single file is to make
+your changes to a copy of the file with the same name as the original. Rename
+the original file in such a way that it is obvious what is being patched ($file~ or
+$file.old seem to be popular).
+
+If you are submitting patches that affect multiple files then you should backup
+the entire directory tree (to $source_root.old/ for example). This will allow
+C<diff C<-c> E<lt>old-dirE<gt> E<lt>new-dirE<gt>> to create all the patches
+at once.
+
+=back
+
+=head2 What to include in your patch
+
+=over 4
+
+=item Description of problem
+
+The first thing you should include is a description of the problem that
+the patch corrects. If it is a code patch (rather than a documentation
+patch) you should also include a small test case that illustrates the
+bug.
+
+=item Direction for application
+
+You should include instructions on how to properly apply your patch.
+These should include the files affected, any shell scripts or commands
+that need to be run before or after application of the patch, and
+the command line necessary for application.
+
+=item If you have a code patch
+
+If you are submitting a code patch there are several other things that
+you need to do.
+
+=over 4
+
+=item Comments, Comments, Comments
+
+Be sure to adequately comment your code. While commenting every
+line is unnecessary, anything that takes advantage of side effects of
+operators, that creates changes that will be felt outside of the
+function being patched, or that others may find confusing should
+be documented. If you are going to err, it is better to err on the
+side of adding too many comments than too few.
+
+=item Style
+
+Please follow the indentation style and nesting style in use in the
+block of code that you are patching.
+
+=item Testsuite
+
+Also please include an addition to the regression tests to properly
+exercise your patch.
+
+=back
+
+=item Test your patch
+
+Apply your patch to a clean distribution, compile, and run the
+regression test suite (you did remember to add one for your
+patch, didn't you).
+
+=back
+
+=head2 An example patch creation
+
+This should work for most patches-
+
+ cp MANIFEST MANIFEST.old
+ emacs MANIFEST
+ (make changes)
+ cd ..
+ diff -c perl5.008_42/MANIFEST.old perl5.008_42/MANIFEST > mypatch
+ (testing the patch:)
+ mv perl5.008_42/MANIFEST perl5.008_42/MANIFEST.new
+ cp perl5.008_42/MANIFEST.old perl5.008_42/MANIFEST
+ patch -p < mypatch
+ (should succeed)
+ diff perl5.008_42/MANIFEST perl5.008_42/MANIFEST.new
+ (should produce no output)
+
+=head2 Submitting your patch
+
+=over 4
+
+=item Mailers
+
+Please, please, please (get the point? 8-) don't use a mailer that
+word wraps your patch or that MIME encodes it. Both of these leave
+the patch essentially worthless to the maintainer.
+
+If you have no choice in mailers and no way to get your hands on a
+better one there is, of course, a perl solution. Just do this-
+
+ perl -ne 'print pack("u*",$_)' patch > patch.uue
+
+and post patch.uue with a note saying to unpack it using
+
+ perl -ne 'print unpack("u*",$_)' patch.uue > patch
+
+=item Subject lines for patches
+
+The subject line on your patch should read
+
+[PATCH]5.xxx_xx (Area) Description
+
+where the x's are replaced by the appropriate version number,
+area is a short keyword identifying what area of perl you are
+patching, and description is a very brief summary of the
+problem (don't forget this is an email header).
+
+Examples-
+
+[PATCH]5.004_04 (DOC) fix minor typos
+
+[PATCH]5.004_99 (CORE) New warning for foo() when frobbing
+
+[PATCH]5.005_42 (CONFIG) Added support for fribnatz 1.5
+
+=item Where to send your patch
+
+If your patch is for the perl core it should be sent perlbug@perl.org.
+If it is a patch to a module that you downloaded from CPAN you should
+submit your patch to that module's author.
+
+=back
+
+=head2 Applying a patch
+
+=over 4
+
+=item General notes on applying patches
+
+The following are some general notes on applying a patch
+to your perl distribution.
+
+=over 4
+
+=item patch C<-p>
+
+It is generally easier to apply patches with the C<-p> argument to
+patch. This helps reconcile differing paths between the machine the
+patch was created on and the machine on which it is being applied.
+
+=item Cut and paste
+
+_Never_ cut and paste a patch into your editor. This usually clobbers
+the tabs and confuses patch.
+
+=item Hand editing patches
+
+Avoid hand editing patches as this frequently screws up the whitespace
+in the patch and confuses the patch program.
+
+=back
+
+=back
+
+=head2 Final notes
+
+If you follow these guidelines it will make everybody's life a little
+easier. You'll have the satisfaction of having contributed to perl,
+others will have an easy time using your work, and it should be easier
+for the maintainers to coordinate the occasionally large numbers of
+patches received.
+
+Also, just because you're not a brilliant coder doesn't mean that you can't
+contribute. As valuable as code patches are there is always a need for better
+documentation (especially considering the general level of joy that most
+programmers feel when forced to sit down and write docs). If all you do
+is patch the documentation you have still contributed more than the person
+who sent in an amazing new feature that noone can use because noone understands
+the code (what I'm getting at is that documentation is both the hardest part to
+do (because everyone hates doing it) and the most valuable).
+
+Mostly, when contributing patches, imagine that it is B<you> receiving hundreds
+of patches and that it is B<your> responsibility to integrate them into the source.
+Obviously you'd want the patches to be as easy to apply as possible. Keep that in
+mind. 8-)
+
+=head1 Last Modified
+
+Last modified 1 May 1998 by Daniel Grisinger <dgris@tdrenterprises.com>
+
+=head1 Author and Copyright Information
+
+Copyright (c) 1998 Daniel Grisinger
+
+Adapted from a posting to perl5-porters by Tim Bunce (Tim.Bunce@ig.co.uk).
+
+I'd like to thank the perl5-porters for their suggestions.
+
+
+
diff --git a/ext/POSIX/POSIX.pod b/ext/POSIX/POSIX.pod
index c781765a14..4726487b47 100644
--- a/ext/POSIX/POSIX.pod
+++ b/ext/POSIX/POSIX.pod
@@ -1392,7 +1392,9 @@ Tests the SigSet object to see if it contains a specific signal.
=item new
Create a new Termios object. This object will be destroyed automatically
-when it is no longer needed.
+when it is no longer needed. A Termios object corresponds to the termios
+C struct. new() mallocs a new one, getattr() fills it from a file descriptor,
+and setattr() sets a file descriptor's parameters to match Termios' contents.
$termios = POSIX::Termios->new;
@@ -1474,13 +1476,13 @@ array so an index must be specified.
Set the c_cflag field of a termios object.
- $termios->setcflag( &POSIX::CLOCAL );
+ $termios->setcflag( $c_cflag | &POSIX::CLOCAL );
=item setiflag
Set the c_iflag field of a termios object.
- $termios->setiflag( &POSIX::BRKINT );
+ $termios->setiflag( $c_iflag | &POSIX::BRKINT );
=item setispeed
@@ -1494,13 +1496,13 @@ Returns C<undef> on failure.
Set the c_lflag field of a termios object.
- $termios->setlflag( &POSIX::ECHO );
+ $termios->setlflag( $c_lflag | &POSIX::ECHO );
=item setoflag
Set the c_oflag field of a termios object.
- $termios->setoflag( &POSIX::OPOST );
+ $termios->setoflag( $c_oflag | &POSIX::OPOST );
=item setospeed
diff --git a/gv.c b/gv.c
index 34237510ff..94d4a7e6fe 100644
--- a/gv.c
+++ b/gv.c
@@ -86,10 +86,18 @@ gv_init(GV *gv, HV *stash, char *name, STRLEN len, int multi)
{
dTHR;
register GP *gp;
+ bool doproto = SvTYPE(gv) > SVt_NULL;
+ char *proto = (doproto && SvPOK(gv)) ? SvPVX(gv) : NULL;
sv_upgrade((SV*)gv, SVt_PVGV);
- if (SvLEN(gv))
- Safefree(SvPVX(gv));
+ if (SvLEN(gv)) {
+ if (proto) {
+ SvPVX(gv) = NULL;
+ SvLEN(gv) = 0;
+ SvPOK_off(gv);
+ } else
+ Safefree(SvPVX(gv));
+ }
Newz(602, gp, 1, GP);
GvGP(gv) = gp_ref(gp);
GvSV(gv) = NEWSV(72,0);
@@ -102,6 +110,27 @@ gv_init(GV *gv, HV *stash, char *name, STRLEN len, int multi)
GvNAMELEN(gv) = len;
if (multi)
GvMULTI_on(gv);
+ if (doproto) { /* Replicate part of newSUB here. */
+ ENTER;
+ start_subparse(0,0); /* Create CV in compcv. */
+ GvCV(gv) = compcv;
+ LEAVE;
+
+ GvCVGEN(gv) = 0;
+ sub_generation++;
+ CvGV(GvCV(gv)) = (GV*)SvREFCNT_inc(gv);
+ CvFILEGV(GvCV(gv)) = curcop->cop_filegv;
+ CvSTASH(GvCV(gv)) = curstash;
+#ifdef USE_THREADS
+ CvOWNER(GvCV(gv)) = 0;
+ New(666, CvMUTEXP(GvCV(gv)), 1, perl_mutex);
+ MUTEX_INIT(CvMUTEXP(GvCV(gv)));
+#endif /* USE_THREADS */
+ if (proto) {
+ sv_setpv((SV*)GvCV(gv), proto);
+ Safefree(proto);
+ }
+ }
}
static void
@@ -565,13 +594,15 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
gv_init_sv(gv, sv_type);
}
return gv;
+ } else if (add & GV_NOINIT) {
+ return gv;
}
/* Adding a new symbol */
- if (add & 4)
+ if (add & GV_ADDWARN)
warn("Had to create %s unexpectedly", nambeg);
- gv_init(gv, stash, name, len, add & 2);
+ gv_init(gv, stash, name, len, add & GV_ADDMULTI);
gv_init_sv(gv, sv_type);
GvFLAGS(gv) |= add_gvflags;
@@ -598,7 +629,8 @@ gv_fetchpv(char *nambeg, I32 add, I32 sv_type)
GvMULTI_on(gv);
sv_magic((SV*)av, (SV*)gv, 'I', Nullch, 0);
/* NOTE: No support for tied ISA */
- if (add & 2 && strEQ(nambeg,"AnyDBM_File::ISA") && AvFILLp(av) == -1)
+ if ((add & GV_ADDMULTI) && strEQ(nambeg,"AnyDBM_File::ISA")
+ && AvFILLp(av) == -1)
{
char *pname;
av_push(av, newSVpv(pname = "NDBM_File",0));
@@ -830,7 +862,7 @@ gv_check(HV *stash)
}
else if (isALPHA(*HeKEY(entry))) {
gv = (GV*)HeVAL(entry);
- if (GvMULTI(gv))
+ if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv))
continue;
curcop->cop_line = GvLINE(gv);
filegv = GvFILEGV(gv);
diff --git a/gv.h b/gv.h
index 804007519e..2cb24388e7 100644
--- a/gv.h
+++ b/gv.h
@@ -130,3 +130,4 @@ HV *GvHVn();
#define GV_ADD 0x01
#define GV_ADDMULTI 0x02
#define GV_ADDWARN 0x04
+#define GV_NOINIT 0x10 /* 8 is used without a symbolic constant */
diff --git a/lib/File/Find.pm b/lib/File/Find.pm
index 67abf6088b..1305d21e6b 100644
--- a/lib/File/Find.pm
+++ b/lib/File/Find.pm
@@ -202,7 +202,7 @@ sub find {
find_opt(wrap_wanted($wanted), @_);
}
-sub find_depth {
+sub finddepth {
my $wanted = wrap_wanted(shift);
$wanted->{bydepth} = 1;
find_opt($wanted, @_);
diff --git a/op.c b/op.c
index b86a27c456..532b0a731d 100644
--- a/op.c
+++ b/op.c
@@ -2672,7 +2672,7 @@ new_logop(I32 type, I32 flags, OP** firstp, OP** otherp)
case OP_NULL:
if (k2 && k2->op_type == OP_READLINE
&& (k2->op_flags & OPf_STACKED)
- && (k1->op_type == OP_RV2SV || k1->op_type == OP_PADSV))
+ && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
warnop = k2->op_type;
break;
@@ -2834,6 +2834,24 @@ newLOOPOP(I32 flags, I32 debuggable, OP *expr, OP *block)
|| (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
expr = newUNOP(OP_DEFINED, 0,
newASSIGNOP(0, newDEFSVOP(), 0, expr) );
+ } else if (expr->op_flags & OPf_KIDS) {
+ OP *k1 = ((UNOP*)expr)->op_first;
+ OP *k2 = (k1) ? k1->op_sibling : NULL;
+ switch (expr->op_type) {
+ case OP_NULL:
+ if (k2 && k2->op_type == OP_READLINE
+ && (k2->op_flags & OPf_STACKED)
+ && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
+ expr = newUNOP(OP_DEFINED, 0, expr);
+ break;
+
+ case OP_SASSIGN:
+ if (k1->op_type == OP_READDIR
+ || k1->op_type == OP_GLOB
+ || k1->op_type == OP_EACH)
+ expr = newUNOP(OP_DEFINED, 0, expr);
+ break;
+ }
}
}
@@ -2869,6 +2887,24 @@ newWHILEOP(I32 flags, I32 debuggable, LOOP *loop, I32 whileline, OP *expr, OP *b
|| (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB))) {
expr = newUNOP(OP_DEFINED, 0,
newASSIGNOP(0, newDEFSVOP(), 0, expr) );
+ } else if (expr && (expr->op_flags & OPf_KIDS)) {
+ OP *k1 = ((UNOP*)expr)->op_first;
+ OP *k2 = (k1) ? k1->op_sibling : NULL;
+ switch (expr->op_type) {
+ case OP_NULL:
+ if (k2 && k2->op_type == OP_READLINE
+ && (k2->op_flags & OPf_STACKED)
+ && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
+ expr = newUNOP(OP_DEFINED, 0, expr);
+ break;
+
+ case OP_SASSIGN:
+ if (k1->op_type == OP_READDIR
+ || k1->op_type == OP_GLOB
+ || k1->op_type == OP_EACH)
+ expr = newUNOP(OP_DEFINED, 0, expr);
+ break;
+ }
}
if (!block)
@@ -3310,7 +3346,8 @@ newSUB(I32 floor, OP *o, OP *proto, OP *block)
{
dTHR;
char *name = o ? SvPVx(cSVOPo->op_sv, na) : Nullch;
- GV *gv = gv_fetchpv(name ? name : "__ANON__", GV_ADDMULTI, SVt_PVCV);
+ GV *gv = gv_fetchpv(name ? name : "__ANON__",
+ GV_ADDMULTI | (block ? 0 : GV_NOINIT), SVt_PVCV);
char *ps = proto ? SvPVx(((SVOP*)proto)->op_sv, na) : Nullch;
register CV *cv;
I32 ix;
@@ -3320,6 +3357,23 @@ newSUB(I32 floor, OP *o, OP *proto, OP *block)
if (proto)
SAVEFREEOP(proto);
+ if (SvTYPE(gv) != SVt_PVGV) { /* Prototype now, and had
+ maximum a prototype before. */
+ if (SvTYPE(gv) > SVt_NULL) {
+ if (!SvPOK((SV*)gv) && !(SvIOK((SV*)gv) && SvIVX((SV*)gv) == -1))
+ warn("Runaway prototype");
+ cv_ckproto((CV*)gv, NULL, ps);
+ }
+ if (ps)
+ sv_setpv((SV*)gv, ps);
+ else
+ sv_setiv((SV*)gv, -1);
+ SvREFCNT_dec(compcv);
+ compcv = NULL;
+ sub_generation++;
+ goto noblock;
+ }
+
if (!name || GvCVGEN(gv))
cv = Nullcv;
else if (cv = GvCV(gv)) {
@@ -3401,6 +3455,7 @@ newSUB(I32 floor, OP *o, OP *proto, OP *block)
}
}
if (!block) {
+ noblock:
copline = NOLINE;
LEAVE_SCOPE(floor);
return cv;
diff --git a/pod/Makefile b/pod/Makefile
index e9623a62ff..16f90a1891 100644
--- a/pod/Makefile
+++ b/pod/Makefile
@@ -239,7 +239,9 @@ toc:
$(PERL) -I../lib pod2latex $*.pod
clean:
- rm -f $(MAN) $(HTML) $(TEX)
+ rm -f $(MAN)
+ rm -f $(HTML)
+ rm -f $(TEX)
rm -f pod2html-*cache
rm -f *.aux *.log *.exe
diff --git a/pod/perlfunc.pod b/pod/perlfunc.pod
index 8e95de592b..617879852c 100644
--- a/pod/perlfunc.pod
+++ b/pod/perlfunc.pod
@@ -1083,6 +1083,15 @@ use system() instead of exec() if you want it to return. It fails and
returns FALSE only if the command does not exist I<and> it is executed
directly instead of via your system's command shell (see below).
+Since it's a common mistake to use system() instead of exec(), Perl
+warns you if there is a following statement which isn't die(), warn()
+or exit() (if C<-w> is set - but you always do that). If you
+I<really> want to follow an exec() with some other statement, you
+can use one of these styles to avoid the warning:
+
+ exec ('foo') or print STDERR "couldn't exec foo";
+ { exec ('foo') }; print STDERR "couldn't exec foo";
+
If there is more than one argument in LIST, or if LIST is an array with
more than one value, calls execvp(3) with the arguments in LIST. If
there is only one scalar argument, the argument is checked for shell
diff --git a/pod/perlop.pod b/pod/perlop.pod
index e4088ec9c4..538745dd6a 100644
--- a/pod/perlop.pod
+++ b/pod/perlop.pod
@@ -186,6 +186,11 @@ C<$a>. If C<$b> is negative, then C<$a % $b> is C<$a> minus the
smallest multiple of C<$b> that is not less than C<$a> (i.e. the
result will be less than or equal to zero).
+Note than when C<use integer> is in scope "%" give you direct access
+to the modulus operator as implemented by your C compiler. This
+operator is not as well defined for negative operands, but it will
+execute faster.
+
Binary "x" is the repetition operator. In a scalar context, it
returns a string consisting of the left operand repeated the number of
times specified by the right operand. In a list context, if the left
diff --git a/pod/pod2man.PL b/pod/pod2man.PL
index 42ad9f917c..e7edf1f5e8 100644
--- a/pod/pod2man.PL
+++ b/pod/pod2man.PL
@@ -1050,10 +1050,6 @@ sub mkindex {
my ($entry) = @_;
my @entries = split m:\s*/\s*:, $entry;
push @Indices, ".IX Xref " . join ' ', map {qq("$_")} @entries;
- for $entry (@entries) {
- print qq("$entry" );
- }
- print "\n";
return '';
}
diff --git a/t/lib/filefind.t b/t/lib/filefind.t
index 21e29a2d7f..cd2e9771c7 100755
--- a/t/lib/filefind.t
+++ b/t/lib/filefind.t
@@ -5,9 +5,10 @@ BEGIN {
@INC = '../lib';
}
-print "1..1\n";
+print "1..2\n";
use File::Find;
# hope we will eventually find ourself
find(sub { print "ok 1\n" if $_ eq 'filefind.t'; }, ".");
+finddepth(sub { print "ok 2\n" if $_ eq 'filefind.t'; }, ".");
diff --git a/t/op/defins.t b/t/op/defins.t
new file mode 100755
index 0000000000..5dd614d4b8
--- /dev/null
+++ b/t/op/defins.t
@@ -0,0 +1,144 @@
+#!./perl -w
+
+#
+# test auto defined() test insertion
+#
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ $SIG{__WARN__} = sub { $warns++; warn $_[0] };
+ print "1..14\n";
+}
+
+print "not " if $warns;
+print "ok 1\n";
+
+open(FILE,">./0");
+print FILE "1\n";
+print FILE "0";
+close(FILE);
+
+open(FILE,"<./0");
+my $seen = 0;
+my $dummy;
+while (my $name = <FILE>)
+ {
+ $seen++ if $name eq '0';
+ }
+print "not " unless $seen;
+print "ok 2\n";
+
+seek(FILE,0,0);
+$seen = 0;
+my $line = '';
+do
+ {
+ $seen++ if $line eq '0';
+ } while ($line = <FILE>);
+
+print "not " unless $seen;
+print "ok 3\n";
+
+
+seek(FILE,0,0);
+$seen = 0;
+while (($seen ? $dummy : $name) = <FILE>)
+ {
+ $seen++ if $name eq '0';
+ }
+print "not " unless $seen;
+print "ok 4\n";
+
+seek(FILE,0,0);
+$seen = 0;
+my %where;
+while ($where{$seen} = <FILE>)
+ {
+ $seen++ if $where{$seen} eq '0';
+ }
+print "not " unless $seen;
+print "ok 5\n";
+
+opendir(DIR,'.');
+$seen = 0;
+while (my $name = readdir(DIR))
+ {
+ $seen++ if $name eq '0';
+ }
+print "not " unless $seen;
+print "ok 6\n";
+
+rewinddir(DIR);
+$seen = 0;
+$dummy = '';
+while (($seen ? $dummy : $name) = readdir(DIR))
+ {
+ $seen++ if $name eq '0';
+ }
+print "not " unless $seen;
+print "ok 7\n";
+
+rewinddir(DIR);
+$seen = 0;
+while ($where{$seen} = readdir(DIR))
+ {
+ $seen++ if $where{$seen} eq '0';
+ }
+print "not " unless $seen;
+print "ok 8\n";
+
+$seen = 0;
+while (my $name = glob('*'))
+ {
+ $seen++ if $name eq '0';
+ }
+print "not " unless $seen;
+print "ok 9\n";
+
+$seen = 0;
+$dummy = '';
+while (($seen ? $dummy : $name) = glob('*'))
+ {
+ $seen++ if $name eq '0';
+ }
+print "not " unless $seen;
+print "ok 10\n";
+
+$seen = 0;
+while ($where{$seen} = glob('*'))
+ {
+ $seen++ if $where{$seen} eq '0';
+ }
+print "not " unless $seen;
+print "ok 11\n";
+
+unlink("./0");
+
+my %hash = (0 => 1, 1 => 2);
+
+$seen = 0;
+while (my $name = each %hash)
+ {
+ $seen++ if $name eq '0';
+ }
+print "not " unless $seen;
+print "ok 12\n";
+
+$seen = 0;
+$dummy = '';
+while (($seen ? $dummy : $name) = each %hash)
+ {
+ $seen++ if $name eq '0';
+ }
+print "not " unless $seen;
+print "ok 13\n";
+
+$seen = 0;
+while ($where{$seen} = each %hash)
+ {
+ $seen++ if $where{$seen} eq '0';
+ }
+print "not " unless $seen;
+print "ok 14\n";
+
diff --git a/t/op/die_exit.t b/t/op/die_exit.t
index b01dd35a97..b5760d6fa0 100755
--- a/t/op/die_exit.t
+++ b/t/op/die_exit.t
@@ -39,7 +39,9 @@ print "1..$max\n";
foreach my $test (1 .. $max) {
my($bang, $query) = @{$tests{$test}};
my $exit =
- system qq($perl -e '\$! = $bang; \$? = $query; die;' 2> /dev/null);
+ ($^O eq 'MSWin32'
+ ? system qq($perl -e "\$! = $bang; \$? = $query; die;" 2> nul)
+ : system qq($perl -e '\$! = $bang; \$? = $query; die;' 2> /dev/null));
printf "# 0x%04x 0x%04x 0x%04x\nnot ", $exit, $bang, $query
unless $exit == (($bang || ($query >> 8) || 255) << 8);
diff --git a/t/op/ipcmsg.t b/t/op/ipcmsg.t
index 336d6d1253..98cf8bcaf6 100755
--- a/t/op/ipcmsg.t
+++ b/t/op/ipcmsg.t
@@ -27,7 +27,7 @@ BEGIN {
$Config{'d_msgctl'} eq 'define' &&
$Config{'d_msgsnd'} eq 'define' &&
$Config{'d_msgrcv'} eq 'define') {
- print "0..0\n";
+ print "1..0\n";
exit;
}
my @incpath = (split(/\s+/, $Config{usrinc}), split(/\s+/ ,$Config{locincpth}));
diff --git a/t/op/ipcsem.t b/t/op/ipcsem.t
index abe32fbf51..f3f6e3ce4c 100755
--- a/t/op/ipcsem.t
+++ b/t/op/ipcsem.t
@@ -27,7 +27,7 @@ use vars map { '$' . $_ } @define;
BEGIN {
unless($Config{'d_semget'} eq 'define' &&
$Config{'d_semctl'} eq 'define') {
- print "0..0\n";
+ print "1..0\n";
exit;
}
my @incpath = (split(/\s+/, $Config{usrinc}), split(/\s+/ ,$Config{locincpth}));
diff --git a/utils/perlbug.PL b/utils/perlbug.PL
index 724df6b449..68ff2901d5 100644
--- a/utils/perlbug.PL
+++ b/utils/perlbug.PL
@@ -17,7 +17,7 @@ chdir dirname($0);
$file = basename($0, '.PL');
$file .= '.com' if $^O eq 'VMS';
-open OUT,">$file" or die "Can't create $file: $!";
+open OUT, ">$file" or die "Can't create $file: $!";
# extract patchlevel.h information
@@ -27,7 +27,7 @@ my $patchlevel_date = (stat PATCH_LEVEL)[9];
while (<PATCH_LEVEL>) {
last if $_ =~ /^\s*static\s+char.*?local_patches\[\]\s*=\s*{\s*$/;
-};
+}
my @patches;
while (<PATCH_LEVEL>) {
@@ -37,11 +37,9 @@ while (<PATCH_LEVEL>) {
s/"?,?$//;
s/(['\\])/\\$1/g;
push @patches, $_ unless $_ eq 'NULL';
-};
-my $patch_desc = "'" . join("',\n\t'", @patches) . "'";
-my @patch_tags = map { my $p=$_; $p=~s/\s.*//; $p } @patches;
-my $patch_tags = join " ", map { "+$_" } @patch_tags;
-$patch_tags .= " " if $patch_tags;
+}
+my $patch_desc = "'" . join("',\n '", @patches) . "'";
+my $patch_tags = join "", map /(\S+)/ ? "+$1 " : (), @patches;
close PATCH_LEVEL;
@@ -65,7 +63,7 @@ my \$config_tag1 = '$] - $Config{cf_time}';
my \$patchlevel_date = $patchlevel_date;
my \$patch_tags = '$patch_tags';
my \@patches = (
- $patch_desc
+ $patch_desc
);
!GROK!THIS!
@@ -75,21 +73,18 @@ print OUT <<'!NO!SUBS!';
use Config;
use Getopt::Std;
-
-BEGIN {
- eval "use Mail::Send;";
- $::HaveSend = ($@ eq "");
- eval "use Mail::Util;";
- $::HaveUtil = ($@ eq "");
-};
-
-
use strict;
sub paraprint;
+BEGIN {
+ eval "use Mail::Send;";
+ $::HaveSend = ($@ eq "");
+ eval "use Mail::Util;";
+ $::HaveUtil = ($@ eq "");
+};
-my($Version) = "1.20";
+my $Version = "1.22";
# Changed in 1.06 to skip Mail::Send and Mail::Util if not available.
# Changed in 1.07 to see more sendmail execs, and added pipe output.
@@ -114,33 +109,32 @@ my($Version) = "1.20";
# add local patch information
# warn on '-ok' if this is an old system; add '-okay'
# Changed in 1.20 Added patchlevel.h reading and version/config checks
+# Changed in 1.21 Added '-nok' for reporting build failure DFD 98-05-05
+# Changed in 1.22 Heavy reformatting & minor bugfixes HVDS 98-05-10
# TODO: - Allow the user to re-name the file on mail failure, and
-# make sure failure (transmission-wise) of Mail::Send is
+# make sure failure (transmission-wise) of Mail::Send is
# accounted for.
# - Test -b option
my( $file, $usefile, $cc, $address, $perlbug, $testaddress, $filename,
- $subject, $from, $verbose, $ed,
+ $subject, $from, $verbose, $ed,
$fh, $me, $Is_MSWin32, $Is_VMS, $msg, $body, $andcc, %REP, $ok);
my $config_tag2 = "$] - $Config{cf_time}";
Init();
-if($::opt_h) { Help(); exit; }
-
-if($::opt_d) { Dump(*STDOUT); exit; }
-
-if(!-t STDIN) {
- paraprint <<EOF;
-Please use perlbug interactively. If you want to
+if ($::opt_h) { Help(); exit; }
+if ($::opt_d) { Dump(*STDOUT); exit; }
+if (!-t STDIN) {
+ paraprint <<EOF;
+Please use perlbug interactively. If you want to
include a file, you can use the -f switch.
EOF
- die "\n";
+ die "\n";
}
-
-if(!-t STDOUT) { Dump(*STDOUT); exit; }
+if (!-t STDOUT) { Dump(*STDOUT); exit; }
Query();
Edit() unless $usefile;
@@ -150,108 +144,114 @@ Send();
exit;
sub Init {
-
- # -------- Setup --------
-
- $Is_MSWin32 = $^O eq 'MSWin32';
- $Is_VMS = $^O eq 'VMS';
-
- getopts("dhva:s:b:f:r:e:SCc:to:");
-
-
- # 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);
-
- # 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 || "";
-
- # Send a file
- $usefile = ($::opt_f || 0);
-
- # File to send as report
- $file = $::opt_f || "";
-
- # Body of report
- $body = $::opt_b || "";
-
- # Editor
- $ed = ( $::opt_e || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT} ||
- ($Is_VMS ? "edit/tpu" : $Is_MSWin32 ? "notepad" : "vi")
- );
-
- # OK - send "OK" report for build on this system
- $ok = 0;
- if ( $::opt_o ) {
- if ( $::opt_o eq 'k' or $::opt_o eq 'kay' ) {
- my $age = time - $patchlevel_date;
- if ( $::opt_o eq 'k' and $age > 60 * 24 * 60 * 60 ) {
- my $date = localtime $patchlevel_date;
- print <<"EOF";
-\"perlbug -ok\" does not report on Perl versions which are more than
-60 days old. This Perl version was constructed on $date.
-If you really want to report this, use \"perlbug -okay\".
+ # -------- Setup --------
+
+ $Is_MSWin32 = $^O eq 'MSWin32';
+ $Is_VMS = $^O eq 'VMS';
+
+ getopts("dhva:s:b:f:r:e:SCc:to:n:");
+
+ # 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);
+
+ # 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 || "";
+
+ # Send a file
+ $usefile = ($::opt_f || 0);
+
+ # File to send as report
+ $file = $::opt_f || "";
+
+ # Body of report
+ $body = $::opt_b || "";
+
+ # Editor
+ $ed = $::opt_e || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT}
+ || ($Is_VMS && "edit/tpu")
+ || ($Is_MSWin32 && "notepad")
+ || "vi";
+
+ # Not OK - provide build failure template by finessing OK report
+ if ($::opt_n) {
+ if (substr($::opt_n, 0, 2) eq 'ok' ) {
+ $::opt_o = substr($::opt_n, 1);
+ } else {
+ Help();
+ exit();
+ }
+ }
+
+ # OK - send "OK" report for build on this system
+ $ok = 0;
+ if ($::opt_o) {
+ if ($::opt_o eq 'k' or $::opt_o eq 'kay') {
+ my $age = time - $patchlevel_date;
+ if ($::opt_o eq 'k' and $age > 60 * 24 * 60 * 60 ) {
+ my $date = localtime $patchlevel_date;
+ print <<"EOF";
+"perlbug -ok" and "perlbug -nok" do not report on Perl versions which
+are more than 60 days old. This Perl version was constructed on
+$date. If you really want to report this, use
+"perlbug -okay" or "perlbug -nokay".
EOF
- exit();
- };
- # force these options
- $::opt_S = 1; # don't prompt for send
- $::opt_C = 1; # don't send a copy to the local admin
- $::opt_s = 1;
- $subject = "OK: perl $] ${patch_tags}on"
- ." $::Config{'archname'} $::Config{'osvers'} $subject";
- $::opt_b = 1;
- $body = "Perl reported to build OK on this system.\n";
- $ok = 1;
- }
- else {
- Help();
exit();
}
+ # force these options
+ unless ($::opt_n) {
+ $::opt_S = 1; # don't prompt for send
+ $::opt_b = 1; # we have a body
+ $body = "Perl reported to build OK on this system.\n";
+ }
+ $::opt_C = 1; # don't send a copy to the local admin
+ $::opt_s = 1; # we have a subject line
+ $subject = ($::opt_n ? 'Not ' : '')
+ . "OK: perl $] ${patch_tags}on"
+ ." $::Config{'archname'} $::Config{'osvers'} $subject";
+ $ok = 1;
+ } else {
+ Help();
+ exit();
}
-
- # 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.)
- #
- # This has to be after the $ok stuff above because of the way
- # that $::opt_C is forced.
- $cc = ($::opt_C ? "" : (
- $::opt_c || $::Config{perladmin} || $::Config{cf_email} || $::Config{cf_by}
- ));
-
- # My username
- $me = ( $Is_MSWin32
- ? $ENV{'USERNAME'}
- : ( $^O eq 'os2'
- ? $ENV{'USER'} || $ENV{'LOGNAME'}
- : eval { getpwuid($<) }) ); # May be missing
-
-}
+ }
+ # 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.)
+ #
+ # This has to be after the $ok stuff above because of the way
+ # that $::opt_C is forced.
+ $cc = $::opt_C ? "" : (
+ $::opt_c || $::Config{'perladmin'}
+ || $::Config{'cf_email'} || $::Config{'cf_by'}
+ );
+
+ # My username
+ $me = $Is_MSWin32 ? $ENV{'USERNAME'}
+ : $^O eq 'os2' ? $ENV{'USER'} || $ENV{'LOGNAME'}
+ : eval { getpwuid($<) }; # May be missing
+} # sub Init
sub Query {
-
- # Explain what perlbug is
- if ( ! $ok ) {
+ # Explain what perlbug is
+ unless ($ok) {
paraprint <<EOF;
This program provides an easy way to create a message reporting a bug
in perl, and e-mail it to $address. It is *NOT* intended for
@@ -263,156 +263,121 @@ and any solutions to such problems, to the people who maintain perl.
If you're just looking for help with perl, try posting to the Usenet
newsgroup comp.lang.perl.misc. If you're looking for help with using
perl with CGI, try posting to comp.infosystems.www.programming.cgi.
-
EOF
}
-
- # Prompt for subject of message, if needed
- if(! $subject) {
- paraprint <<EOF;
-First of all, please provide a subject for the
-message. It should be a concise description of
+ # Prompt for subject of message, if needed
+ unless ($subject) {
+ paraprint <<EOF;
+First of all, please provide a subject for the
+message. It should be a concise description of
the bug or problem. "perl bug" or "perl problem"
is not a concise description.
-
EOF
- print "Subject: ";
-
- $subject = <>;
- chop $subject;
-
- my($err)=0;
- while( $subject =~ /^\s*$/ ) {
- print "\nPlease enter a subject: ";
- $subject = <>;
- chop $subject;
- if($err++>5) {
- die "Aborting.\n";
- }
- }
+ print "Subject: ";
+ $subject = <>;
+
+ my $err = 0;
+ while ($subject !~ /\S/) {
+ print "\nPlease enter a subject: ";
+ $subject = <>;
+ if ($err++ > 5) {
+ die "Aborting.\n";
+ }
}
-
-
- # Prompt for return address, if needed
- if( !$from) {
-
- # Try and guess return address
- my($domain);
-
- if($::HaveUtil) {
- $domain = Mail::Util::maildomain();
- } elsif ($Is_MSWin32) {
- $domain = $ENV{'USERDOMAIN'};
+ chop $subject;
+ }
+
+ # Prompt for return address, if needed
+ unless ($from) {
+ # Try and guess return address
+ my $guess;
+
+ $guess = $ENV{'REPLY-TO'} || $ENV{'REPLYTO'} || '';
+ unless ($guess) {
+ my $domain;
+ if ($::HaveUtil) {
+ $domain = Mail::Util::maildomain();
+ } elsif ($Is_MSWin32) {
+ $domain = $ENV{'USERDOMAIN'};
+ } else {
+ require Sys::Hostname;
+ $domain = Sys::Hostname::hostname();
+ }
+ if ($domain) {
+ if ($Is_VMS && !$::Config{'d_socket'}) {
+ $guess = "$domain\:\:$me";
} else {
- require Sys::Hostname;
- $domain = Sys::Hostname::hostname();
+ $guess = "$me\@$domain" if $domain;
}
-
- my($guess);
-
- if( !$domain) {
- $guess = "";
- } elsif ($Is_VMS && !$::Config{'d_socket'}) {
- $guess = "$domain\:\:$me";
- } else {
- $guess = "$me\@$domain" if $domain;
- $guess = "$me\@unknown.addresss" unless $domain;
- }
-
- $guess = $ENV{'REPLYTO'} if defined($ENV{'REPLYTO'});
- $guess = $ENV{"REPLY-TO"} if defined($ENV{'REPLY-TO'});
-
- if( $guess ) {
- if ( ! $ok ) {
- paraprint <<EOF;
-
+ }
+ }
+ if ($guess) {
+ unless ($ok) {
+ paraprint <<EOF;
Your e-mail address will be useful if you need to be contacted. If the
default shown is not your full internet e-mail address, please correct it.
-
EOF
- }
- } else {
- paraprint <<EOF;
-
-So that you may be contacted if necessary, please enter
+ }
+ } else {
+ paraprint <<EOF;
+So that you may be contacted if necessary, please enter
your full internet e-mail address here.
-
EOF
- }
-
- if ( $ok && $guess ne '' ) {
- # use it
- $from = $guess;
- }
- else {
- # verify it
- print "Your address [$guess]: ";
-
- $from = <>;
- 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 = "yourself";
- }
-
- # Prompt for administrator address, unless an override was given
- if( !$::opt_C and !$::opt_c ) {
- paraprint <<EOF;
+ if ($ok && $guess) {
+ # use it
+ $from = $guess;
+ } else {
+ # verify it
+ print "Your address [$guess]: ";
+ $from = <>;
+ chop $from;
+ $from = $guess if $from eq '';
+ }
+ }
+ if ($from eq $cc or $me eq $cc) {
+ # Try not to copy ourselves
+ $cc = "yourself";
+ }
+ # Prompt for administrator address, unless an override was given
+ if( !$::opt_C and !$::opt_c ) {
+ paraprint <<EOF;
A copy of this report can be sent to your local
-perl administrator. If the address is wrong, please
+perl administrator. If the address is wrong, please
correct it, or enter 'none' or 'yourself' to not send
a copy.
-
EOF
+ print "Local perl administrator [$cc]: ";
+ my $entry = scalar <>;
+ chop $entry;
- print "Local perl administrator [$cc]: ";
-
- my($entry) = scalar(<>);
- chop $entry;
-
- if($entry ne "") {
- $cc = $entry;
- if($me eq $cc) { $cc = "" }
- }
-
+ if ($entry ne "") {
+ $cc = $entry;
+ $cc = '' if $me eq $cc;
}
+ }
- if($cc =~ /^(none|yourself|me|myself|ourselves)$/i) { $cc = "" }
-
- $andcc = " and $cc" if $cc;
+ $cc = '' if $cc =~ /^(none|yourself|me|myself|ourselves)$/i;
+ $andcc = " and $cc" if $cc;
+ # Prompt for editor, if no override is given
editor:
-
- # Prompt for editor, if no override is given
- if(! $::opt_e and ! $::opt_f and ! $::opt_b) {
- paraprint <<EOF;
-
-
+ unless ($::opt_e || $::opt_f || $::opt_b) {
+ paraprint <<EOF;
Now you need to supply the bug report. Try to make
-the report concise but descriptive. Include any
+the report concise but descriptive. Include any
relevant detail. If you are reporting something
that does not work as you think it should, please
-try to include example of both the actual
+try to include example of both the actual
result, and what you expected.
Some information about your local
-perl configuration will automatically be included
+perl configuration will automatically be included
at the end of the report. If you are using any
unusual version of perl, please try and confirm
exactly which versions are relevant.
@@ -424,96 +389,71 @@ the name of the editor you would like to use.
If you would like to use a prepared file, type
"file", and you will be asked for the filename.
-
EOF
-
- print "Editor [$ed]: ";
-
- my($entry) =scalar(<>);
- chop $entry;
-
- $usefile = 0;
- if($entry eq "file") {
- $usefile = 1;
- } elsif($entry ne "") {
- $ed = $entry;
- }
+ print "Editor [$ed]: ";
+ my $entry =scalar <>;
+ chop $entry;
+
+ $usefile = 0;
+ if ($entry eq "file") {
+ $usefile = 1;
+ } elsif ($entry ne "") {
+ $ed = $entry;
}
+ }
+ # Generate scratch file to edit report in
+ $filename = filename();
- # Generate scratch file to edit report in
-
- {
- my($dir) = ($Is_VMS ? 'sys$scratch:' :
- (($Is_MSWin32 && $ENV{'TEMP'}) ? $ENV{'TEMP'} : '/tmp/'));
- $filename = "bugrep0$$";
- $dir .= "\\" if $Is_MSWin32 and $dir !~ m|[\\/]$|;
- $filename++ while -e "$dir$filename";
- $filename = "$dir$filename";
- }
-
-
- # Prompt for file to read report from, if needed
-
- if( $usefile and ! $file) {
+ # Prompt for file to read report from, if needed
+ if ($usefile and !$file) {
filename:
- paraprint <<EOF;
-
+ paraprint <<EOF;
What is the name of the file that contains your report?
-
EOF
+ print "Filename: ";
+ my $entry = scalar <>;
+ chop $entry;
- print "Filename: ";
-
- my($entry) = scalar(<>);
- chop($entry);
-
- if($entry eq "") {
- paraprint <<EOF;
-
-No filename? I'll let you go back and choose an editor again.
-
+ if ($entry eq "") {
+ paraprint <<EOF;
+No filename? I'll let you go back and choose an editor again.
EOF
- goto editor;
- }
-
- if(!-f $entry or !-r $entry) {
- paraprint <<EOF;
-
+ goto editor;
+ }
+
+ unless (-f $entry and -r $entry) {
+ paraprint <<EOF;
I'm sorry, but I can't read from `$entry'. Maybe you mistyped the name of
the file? If you don't want to send a file, just enter a blank line and you
can get back to the editor selection.
-
EOF
- goto filename;
- }
- $file = $entry;
-
+ goto filename;
}
+ $file = $entry;
+ }
+ # Generate report
+ open(REP,">$filename");
+ my $reptype = $ok ? "build failure" : "bug";
- # Generate report
-
- open(REP,">$filename");
-
- my $reptype = $ok ? "success" : "bug";
-
- print REP <<EOF;
+ print REP <<EOF;
This is a $reptype report for perl from $from,
generated with the help of perlbug $Version running under perl $].
EOF
- if($body) {
- print REP $body;
- } elsif($usefile) {
- open(F,"<$file") or die "Unable to read report file from `$file': $!\n";
- while(<F>) {
- print REP $_
- }
- close(F);
- } else {
- print REP <<EOF;
+ if ($body) {
+ print REP $body;
+ } elsif ($usefile) {
+ open(F, "<$file")
+ or die "Unable to read report file from `$file': $!\n";
+ while (<F>) {
+ print REP $_
+ }
+ close(F);
+ } else {
+ print REP <<EOF;
-----------------------------------------------------------------
[Please enter your report here]
@@ -523,164 +463,138 @@ EOF
[Please do not change anything below this line]
-----------------------------------------------------------------
EOF
- }
-
- Dump(*REP);
- close(REP);
-
- # read in the report template once so that
- # we can track whether the user does any editing.
- # yes, *all* whitespace is ignored.
- open(REP, "<$filename");
- while (<REP>) {
- s/\s+//g;
- $REP{$_}++;
- }
- close(REP);
-
-}
+ }
+ Dump(*REP);
+ close(REP);
+
+ # read in the report template once so that
+ # we can track whether the user does any editing.
+ # yes, *all* whitespace is ignored.
+ open(REP, "<$filename");
+ while (<REP>) {
+ s/\s+//g;
+ $REP{$_}++;
+ }
+ close(REP);
+} # sub Query
sub Dump {
- local(*OUT) = @_;
-
- print REP "\n---\n";
+ local(*OUT) = @_;
- print REP "This perlbug was built using Perl $config_tag1\n",
- "It is being executed now by Perl $config_tag2.\n\n"
- if $config_tag2 ne $config_tag1;
+ print REP "\n---\n";
+ print REP "This perlbug was built using Perl $config_tag1\n",
+ "It is being executed now by Perl $config_tag2.\n\n"
+ if $config_tag2 ne $config_tag1;
- print OUT <<EOF;
+ print OUT <<EOF;
Site configuration information for perl $]:
EOF
+ if ($::Config{cf_by} and $::Config{cf_time}) {
+ print OUT "Configured by $::Config{cf_by} at $::Config{cf_time}.\n\n";
+ }
+ print OUT Config::myconfig;
- if( $::Config{cf_by} and $::Config{cf_time}) {
- print OUT "Configured by $::Config{cf_by} at $::Config{cf_time}.\n\n";
- }
-
- print OUT Config::myconfig;
-
- if (@patches) {
- print OUT join "\n\t", "Locally applied patches:", @patches;
- print OUT "\n";
- };
+ if (@patches) {
+ print OUT join "\n ", "Locally applied patches:", @patches;
+ print OUT "\n";
+ };
- print OUT <<EOF;
+ print OUT <<EOF;
---
\@INC for perl $]:
EOF
- for my $i (@INC) {
- print OUT "\t$i\n";
- }
+ for my $i (@INC) {
+ print OUT " $i\n";
+ }
- print OUT <<EOF;
+ print OUT <<EOF;
---
Environment for perl $]:
EOF
- for my $env (sort
- (qw(PATH LD_LIBRARY_PATH
- LANG PERL_BADLANG
- SHELL HOME LOGDIR),
- grep { /^(?:PERL|LC_)/ } keys %ENV)) {
- print OUT " $env",
- exists $ENV{$env} ? "=$ENV{$env}" : ' (unset)',
- "\n";
- }
- if($verbose) {
- print OUT "\nComplete configuration data for perl $]:\n\n";
- my($value);
- foreach (sort keys %::Config) {
- $value = $::Config{$_};
- $value =~ s/'/\\'/g;
- print OUT "$_='$value'\n";
- }
+ for my $env (sort
+ (qw(PATH LD_LIBRARY_PATH LANG PERL_BADLANG SHELL HOME LOGDIR),
+ grep /^(?:PERL|LC_)/, keys %ENV)
+ ) {
+ print OUT " $env",
+ exists $ENV{$env} ? "=$ENV{$env}" : ' (unset)',
+ "\n";
+ }
+ if ($verbose) {
+ print OUT "\nComplete configuration data for perl $]:\n\n";
+ my $value;
+ foreach (sort keys %::Config) {
+ $value = $::Config{$_};
+ $value =~ s/'/\\'/g;
+ print OUT "$_='$value'\n";
}
-}
+ }
+} # sub Dump
sub Edit {
- # Edit the report
-
- if($usefile) {
- $usefile = 0;
- paraprint <<EOF;
-
+ # Edit the report
+ if ($usefile || $body) {
+ paraprint <<EOF;
Please make sure that the name of the editor you want to use is correct.
-
EOF
- print "Editor [$ed]: ";
-
- my($entry) =scalar(<>);
- chop $entry;
-
- if($entry ne "") {
- $ed = $entry;
- }
- }
-
-tryagain:
- if(!$usefile and !$body) {
- my $sts = system("$ed $filename");
- if($sts) {
- #print "\nUnable to run editor!\n";
- paraprint <<EOF;
+ print "Editor [$ed]: ";
+ my $entry =scalar <>;
+ chop $entry;
+ $ed = $entry unless $entry eq '';
+ }
+tryagain:
+ my $sts = system("$ed $filename");
+ if ($sts) {
+ paraprint <<EOF;
The editor you chose (`$ed') could apparently not be run!
Did you mistype the name of your editor? If so, please
-correct it here, otherwise just press Enter.
-
+correct it here, otherwise just press Enter.
EOF
- print "Editor [$ed]: ";
-
- my($entry) =scalar(<>);
- chop $entry;
-
- if($entry ne "") {
- $ed = $entry;
- goto tryagain;
- } else {
-
- paraprint <<EOF;
+ print "Editor [$ed]: ";
+ my $entry =scalar <>;
+ chop $entry;
+ if ($entry ne "") {
+ $ed = $entry;
+ goto tryagain;
+ } else {
+ paraprint <<EOF;
You may want to save your report to a file, so you can edit and mail it
yourself.
EOF
- }
- }
- }
-
- return if $ok;
- # Check that we have a report that has some, eh, report in it.
-
- my $unseen = 0;
-
- open(REP, "<$filename");
- # a strange way to check whether any significant editing
- # have been done: check whether any new non-empty lines
- # have been added. Yes, the below code ignores *any* space
- # in *any* line.
- while (<REP>) {
- s/\s+//g;
- $unseen++ if ($_ ne '' and not exists $REP{$_});
}
+ }
- while ($unseen == 0) {
- paraprint <<EOF;
+ return if ($ok and not $::opt_n) || $body;
+ # Check that we have a report that has some, eh, report in it.
+ my $unseen = 0;
+
+ open(REP, "<$filename");
+ # a strange way to check whether any significant editing
+ # have been done: check whether any new non-empty lines
+ # have been added. Yes, the below code ignores *any* space
+ # in *any* line.
+ while (<REP>) {
+ s/\s+//g;
+ $unseen++ if $_ ne '' and not exists $REP{$_};
+ }
+ while ($unseen == 0) {
+ paraprint <<EOF;
I am sorry but it looks like you did not report anything.
-
EOF
- print "Action (Retry Edit/Cancel) ";
- my ($action) = scalar(<>);
- if ($action =~ /^[re]/i) { # <R>etry <E>dit
- goto tryagain;
- } elsif ($action =~ /^[cq]/i) { # <C>ancel, <Q>uit
- Cancel();
- }
- }
-
-}
+ print "Action (Retry Edit/Cancel) ";
+ my ($action) = scalar(<>);
+ if ($action =~ /^[re]/i) { # <R>etry <E>dit
+ goto tryagain;
+ } elsif ($action =~ /^[cq]/i) { # <C>ancel, <Q>uit
+ Cancel();
+ }
+ }
+} # sub Edit
sub Cancel {
1 while unlink($filename); # remove all versions under VMS
@@ -689,227 +603,211 @@ sub Cancel {
}
sub NowWhat {
-
- # Report is done, prompt for further action
- if( !$::opt_S ) {
- while(1) {
-
- paraprint <<EOF;
-
-
-Now that you have completed your report, would you like to send
-the message to $address$andcc, display the message on
+ # Report is done, prompt for further action
+ if( !$::opt_S ) {
+ while(1) {
+ paraprint <<EOF;
+Now that you have completed your report, would you like to send
+the message to $address$andcc, display the message on
the screen, re-edit it, or cancel without sending anything?
You may also save the message as a file to mail at another time.
-
EOF
-
- print "Action (Send/Display/Edit/Cancel/Save to File): ";
- my($action) = scalar(<>);
- chop $action;
-
- if( $action =~ /^(f|sa)/i ) { # <F>ile/<Sa>ve
- 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(<REP>) { print FILE }
- close(REP);
- close(FILE);
-
- print "\nMessage saved in `$file'.\n";
- exit;
-
- } elsif( $action =~ /^(d|l|sh)/i ) { # <D>isplay, <L>ist, <Sh>ow
- # Display the message
- open(REP,"<$filename");
- while(<REP>) { print $_ }
- close(REP);
- } elsif( $action =~ /^se/i ) { # <S>end
- # Send the message
- print "\
-Are you certain you want to send this message?
-Please type \"yes\" if you are: ";
- my($reply) = scalar(<STDIN>);
- chop($reply);
- if( $reply eq "yes" ) {
- last;
- } else {
- paraprint <<EOF;
-
+ print "Action (Send/Display/Edit/Cancel/Save to File): ";
+ my $action = scalar <>;
+ chop $action;
+
+ if ($action =~ /^(f|sa)/i) { # <F>ile/<Sa>ve
+ print "\n\nName of file to save message in [perlbug.rep]: ";
+ my $file = scalar <>;
+ chop $file;
+ $file = "perlbug.rep" if $file eq "";
+
+ 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 (<REP>) { print FILE }
+ close(REP);
+ close(FILE);
+
+ print "\nMessage saved in `$file'.\n";
+ exit;
+ } elsif ($action =~ /^(d|l|sh)/i ) { # <D>isplay, <L>ist, <Sh>ow
+ # Display the message
+ open(REP, "<$filename");
+ while (<REP>) { print $_ }
+ close(REP);
+ } elsif ($action =~ /^se/i) { # <S>end
+ # Send the message
+ print "Are you certain you want to send this message?\n"
+ . 'Please type "yes" if you are: ';
+ my $reply = scalar <STDIN>;
+ chop $reply;
+ if ($reply eq "yes") {
+ last;
+ } else {
+ paraprint <<EOF;
That wasn't a clear "yes", so I won't send your message. If you are sure
your message should be sent, type in "yes" (without the quotes) at the
confirmation prompt.
-
EOF
-
- }
- } elsif( $action =~ /^[er]/i ) { # <E>dit, <R>e-edit
- # edit the message
- Edit();
- #system("$ed $filename");
- } elsif( $action =~ /^[qc]/i ) { # <C>ancel, <Q>uit
- Cancel();
- } elsif( $action =~ /^s/ ) {
- paraprint <<EOF;
-
+ }
+ } elsif ($action =~ /^[er]/i) { # <E>dit, <R>e-edit
+ # edit the message
+ Edit();
+ } elsif ($action =~ /^[qc]/i) { # <C>ancel, <Q>uit
+ Cancel();
+ } elsif ($action =~ /^s/) {
+ paraprint <<EOF;
I'm sorry, but I didn't understand that. Please type "send" or "save".
EOF
- }
-
- }
+ }
}
-}
-
+ }
+} # sub NowWhat
sub Send {
+ # Message has been accepted for transmission -- Send the message
+ if ($::HaveSend) {
+ $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 (<REP>) { print $fh $_ }
+ close(REP);
+ $fh->close;
+
+ print "\nMessage sent.\n";
+ } elsif ($Is_VMS) {
+ if ( ($address =~ /@/ and $address !~ /^\w+%"/) or
+ ($cc =~ /@/ and $cc !~ /^\w+%"/) ) {
+ my $prefix;
+ foreach (qw[ IN MX SMTP UCX PONY WINS ], '') {
+ $prefix = "$_%", last if $ENV{"MAIL\$PROTOCOL_$_"};
+ }
+ $address = qq[${prefix}"$address"] unless $address =~ /^\w+%"/;
+ $cc = qq[${prefix}"$cc"] unless !$cc || $cc =~ /^\w+%"/;
+ }
+ $subject =~ s/"/""/g; $address =~ s/"/""/g; $cc =~ s/"/""/g;
+ my $sts = system(qq[mail/Subject="$subject" $filename. "$address","$cc"]);
+ if ($sts) {
+ die <<EOF;
+Can't spawn off mail
+ (leaving bug report in $filename): $sts
+EOF
+ }
+ } else {
+ my $sendmail = "";
+ for (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail)) {
+ $sendmail = $_, last if -e $_;
+ }
+ if ($^O eq 'os2' and $sendmail eq "") {
+ my $path = $ENV{PATH};
+ $path =~ s:\\:/: ;
+ my @path = split /$Config{'path_sep'}/, $path;
+ for (@path) {
+ $sendmail = "$_/sendmail", last if -e "$_/sendmail";
+ $sendmail = "$_/sendmail.exe", last if -e "$_/sendmail.exe";
+ }
+ }
- # Message has been accepted for transmission -- Send the message
-
- if($::HaveSend) {
-
- $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(<REP>) { print $fh $_ }
- close(REP);
-
- $fh->close;
-
- print "\nMessage sent.\n";
- } else {
- if ($Is_VMS) {
- if ( ($address =~ /@/ and $address !~ /^\w+%"/) or
- ($cc =~ /@/ and $cc !~ /^\w+%"/) ){
- my($prefix);
- foreach (qw[ IN MX SMTP UCX PONY WINS ],'') {
- $prefix = "$_%",last if $ENV{"MAIL\$PROTOCOL_$_"};
- }
- $address = qq[${prefix}"$address"] unless $address =~ /^\w+%"/;
- $cc = qq[${prefix}"$cc"] unless !$cc || $cc =~ /^\w+%"/;
- }
- $subject =~ s/"/""/g; $address =~ s/"/""/g; $cc =~ s/"/""/g;
- my($sts) = system(qq[mail/Subject="$subject" $filename. "$address","$cc"]);
- if ($sts) { die "Can't spawn off mail\n\t(leaving bug report in $filename): $sts\n;" }
- } else {
- my($sendmail) = "";
-
- foreach (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail))
- {
- $sendmail = $_, last if -e $_;
- }
-
- if ($^O eq 'os2' and $sendmail eq "") {
- my $path = $ENV{PATH};
- $path =~ s:\\:/: ;
- my @path = split /$Config{path_sep}/, $path;
- for (@path) {
- $sendmail = "$_/sendmail", last
- if -e "$_/sendmail";
- $sendmail = "$_/sendmail.exe", last
- if -e "$_/sendmail.exe";
- }
- }
-
- paraprint(<<"EOF"), die "\n" if $sendmail eq "";
-
+ paraprint(<<"EOF"), die "\n" if $sendmail eq "";
I am terribly sorry, but I cannot find sendmail, or a close equivalent, and
the perl package Mail::Send has not been installed, so I can't send your bug
report. We apologize for the inconvenience.
So you may attempt to find some way of sending your message, it has
been left in the file `$filename'.
-
EOF
-
- open(SENDMAIL,"|$sendmail -t") || die "'|$sendmail -t' failed: $|";
- print SENDMAIL "To: $address\n";
- print SENDMAIL "Subject: $subject\n";
- print SENDMAIL "Cc: $cc\n" if $cc;
- print SENDMAIL "Reply-To: $from\n" if $from;
- print SENDMAIL "\n\n";
- open(REP,"<$filename");
- while(<REP>) { print SENDMAIL $_ }
- close(REP);
-
- if (close(SENDMAIL)) {
- print "\nMessage sent.\n";
- } else {
- warn "\nSendmail returned status '",$?>>8,"'\n";
- }
- }
-
- }
-
- 1 while unlink($filename); # remove all versions under VMS
+ open(SENDMAIL, "|$sendmail -t") || die "'|$sendmail -t' failed: $!";
+ print SENDMAIL "To: $address\n";
+ print SENDMAIL "Subject: $subject\n";
+ print SENDMAIL "Cc: $cc\n" if $cc;
+ print SENDMAIL "Reply-To: $from\n" if $from;
+ print SENDMAIL "\n\n";
+ open(REP, "<$filename");
+ while (<REP>) { print SENDMAIL $_ }
+ close(REP);
-}
+ if (close(SENDMAIL)) {
+ print "\nMessage sent.\n";
+ } else {
+ warn "\nSendmail returned status '", $? >> 8, "'\n";
+ }
+ }
+ 1 while unlink($filename); # remove all versions under VMS
+} # sub Send
sub Help {
- print <<EOF;
+ print <<EOF;
-A program to help generate bug reports about perl5, and mail them.
+A program to help generate bug reports about perl5, and mail them.
It is designed to be used interactively. Normally no arguments will
be needed.
-
+
Usage:
$0 [-v] [-a address] [-s subject] [-b body | -f file ]
[-r returnaddress] [-e editor] [-c adminaddress | -C] [-S] [-t] [-h]
-
+$0 [-v] [-r returnaddress] [-ok | -okay | -nok | -nokay]
+
Simplest usage: run "$0", and follow the prompts.
Options:
-v Include Verbose configuration data in the report
- -f File containing the body of the report. Use this to
+ -f File containing the body of the report. Use this to
quickly send a prepared message.
-S Send without asking for confirmation.
-a Address to send the report to. Defaults to `$address'.
-c Address to send copy of report to. Defaults to `$cc'.
-C Don't send copy to administrator.
- -s Subject to include with the message. You will be prompted
+ -s Subject to include with the message. You will be prompted
if you don't supply one on the command line.
-b Body of the report. If not included on the command line, or
in a file with -f, you will get a chance to edit the message.
-r Your return address. The program will ask you to confirm
this if you don't give it here.
- -e Editor to use.
+ -e Editor to use.
-t Test mode. The target address defaults to `$testaddress'.
- -d Data mode (the default if you redirect or pipe output.)
+ -d Data mode (the default if you redirect or pipe output.)
This prints out your configuration data, without mailing
anything. You can use this with -v to get more complete data.
-ok Report successful build on this system to perl porters
- (use alone or with -v). Only use -ok if *everything* was ok.
- If there were *any* problems at all then don't use -ok.
+ (use alone or with -v). Only use -ok if *everything* was ok:
+ if there were *any* problems at all, use -nok.
-okay As -ok but allow report from old builds.
- -h Print this help message.
-
+ -nok Report unsuccessful build on this system to perl porters
+ (use alone or with -v). You must describe what went wrong
+ in the body of the report which you will be asked to edit.
+ -nokay As -nok but allow report from old builds.
+ -h Print this help message.
+
EOF
}
+sub filename {
+ my $dir = $Is_VMS ? 'sys$scratch:'
+ : ($Is_MSWin32 && $ENV{'TEMP'}) ? $ENV{'TEMP'}
+ : '/tmp/';
+ $filename = "bugrep0$$";
+ $dir .= "\\" if $Is_MSWin32 and $dir !~ m|[\\/]$|;
+ $filename++ while -e "$dir$filename";
+ $filename = "$dir$filename";
+}
+
sub paraprint {
my @paragraphs = split /\n{2,}/, "@_";
print "\n\n";
for (@paragraphs) { # implicit local $_
- s/(\S)\s*\n/$1 /g;
- write;
- print "\n";
+ s/(\S)\s*\n/$1 /g;
+ write;
+ print "\n";
}
-
}
-
format STDOUT =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
@@ -929,12 +827,13 @@ S<[ B<-b> I<body> | B<-f> I<file> ]> S<[ B<-r> I<returnaddress> ]>
S<[ B<-e> I<editor> ]> S<[ B<-c> I<adminaddress> | B<-C> ]>
S<[ B<-S> ]> S<[ B<-t> ]> S<[ B<-d> ]> S<[ B<-h> ]>
-B<perlbug> S<[ B<-v> ]> S<[ B<-r> I<returnaddress> ]> S<[ B<-ok> | B<okay> ]>
+B<perlbug> S<[ B<-v> ]> S<[ B<-r> I<returnaddress> ]>
+S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]>
=head1 DESCRIPTION
A program to help generate bug reports about perl or the modules that
-come with it, and mail them.
+come with it, and mail them.
If you have found a bug with a non-standard port (one that was not part
of the I<standard distribution>), a binary distribution, or a
@@ -1073,7 +972,7 @@ with B<-v> to get more complete data.
=item B<-e>
-Editor to use.
+Editor to use.
=item B<-f>
@@ -1097,6 +996,21 @@ system is less than 60 days old.
As B<-ok> except it will report on older systems.
+=item B<-nok>
+
+Report unsuccessful build on this system. Forces B<-C>. Forces and
+supplies a value for B<-s>, then requires you to edit the report
+and say what went wrong. Alternatively, a prepared report may be
+supplied using B<-f>. Only prompts for a return address if it
+cannot guess it (for use with B<make>). Honors return address
+specified with B<-r>. You can use this with B<-v> to get more
+complete data. Only makes a report if this system is less than 60
+days old.
+
+=item B<-nokay>
+
+As B<-nok> except it will report on older systems.
+
=item B<-r>
Your return address. The program will ask you to confirm its default
@@ -1126,8 +1040,9 @@ Include verbose configuration data in the report.
Kenneth Albanowski (E<lt>kjahds@kjahds.comE<gt>), subsequently I<doc>tored
by Gurusamy Sarathy (E<lt>gsar@umich.eduE<gt>), Tom Christiansen
(E<lt>tchrist@perl.comE<gt>), Nathan Torkington (E<lt>gnat@frii.comE<gt>),
-Charles F. Randall (E<lt>cfr@pobox.comE<gt>) and
-Mike Guy (E<lt>mjtg@cam.a.ukE<gt>).
+Charles F. Randall (E<lt>cfr@pobox.comE<gt>), Mike Guy
+(E<lt>mjtg@cam.a.ukE<gt>), Dominic Dunlop (E<lt>domo@computer.orgE<gt>)
+and Hugo van der Sanden (E<lt>hv@crypt0.demon.co.ukE<gt>).
=head1 SEE ALSO