Mailing List Archive

What next after patch.1n?
[Warning -- sermon ahead]

It was with considerable trepidation and uncertainty that I put together
patch.1n. I'd like to explain because I'd like to steer patching efforts
in a slightly different direction.

Here's why I did it:

1. Lots of people were asking for it.

2. Some applications really need some of the fixes in patch.1n.

3. Lots of things were going untested, I fear. For example, Andreas
has done a good bit of work on MakeMaker since 4.16 (the version
in 5.001m) but I don't think many people have tested it. By including
it here, I'll force the issue.

4. Though there were lots of patches floating around, little testing
had gone on as to whether or how these various patches fit together.

5. We all need a common baseline if we're to take the next steps.

6. I couldn't resist the Hallowween/Great Pumpkin allusion (for non-US
folks, it's a reference to the "Peanuts" comic strip).

Here's why I was quite hesitant about it:

1. It makes a lot of work for Larry. He's applied many of these
already in various forms, and he's now got to wade through a pile
of patch rejects to sort out duplicates, near duplicates, and
errors (i.e. one of my fixes might be wrong and might conflict with
the right one.)

I did try to arrange it so that as far as possible I identified
patches with specific BugID numbers, but I still expect it will
take the better part of a day for him to sort it all out. Sorry.

2. It's incomplete. There are a lot of things I missed. Maybe
because of time, maybe because I wasn't sure which version to apply,
maybe I just forgot. (For example, I just forgot the netbsd.sh
hint file update.) Still, I hope it's better than nothing.

3. It doesn't quite work -- i.e. it's quite rough around the edges.
Unfortunately, in trying to make it as easy as possible for Larry to
figure out what I had done, I left most of the patches mostly alone,
even if they had a problem. I propose to iron out those wrinkles
with a patch.1o.

What I propose we do now:

Over the past several months, I've seen any number of postings which say
"Let's release 5.002 today as a bug-fix release."
often followed the same day by a posting which says
"I hope FOO is included in 5.002."
or
"but you can't release 5.002 until BAR is fixed."

One of the problems is that while the 200+ subscribers to this list
generate 100 messages a day on all sorts of fun and interesting topics,
very few of those messages are bug-fixes for the remaining 200+ bug list
entries to help get 5.002 out the door. Some of the bugs are hard,
sure, but not all of them.

Larry has set up his perlbug server, and Tom has set up a very nice
web page at www.perl.com breaking up the bug list in all sorts of useful
ways. Unfortunately, I don't think we're making very good use of this
information. Myself included.

Folks, let's come back down to earth for a little while. If you _really_
want to help get 5.002 out the door, then I suggest you help fix some of
the bugs that are standing in the way.

I don't mean to pick on anyone. I'm guilty of all the bad habits
I've complained about -- that's how I know so much about them:-).

[End of sermon. Whew. That felt good.]

Andy Dougherty doughera@lafcol.lafayette.edu
Re: What next after patch.1n? [ In reply to ]
On Tue, 31 Oct 1995, Andy Dougherty wrote:

> [End of sermon. Whew. That felt good.]

Glad to hear it. Given the recent discussion, you may find this helpful.
While not exactly a bug fix, it makes perldoc a bit nicer to use. It
combines Andreas' case-insensitive changes with some recursion tricks of
my own. Slow, of course, but it works just fine.

*** perldoc.save Tue Oct 31 23:11:21 1995
--- perldoc Wed Nov 1 01:15:06 1995
***************
*** 22,26 ****
=head1 SYNOPSIS

! B<perldoc> [B<-h>] PageName|ModuleName

=head1 DESCRIPTION
--- 22,26 ----
=head1 SYNOPSIS

! B<perldoc> [B<-h>] [B<-v>] PageName|ModuleName

=head1 DESCRIPTION
***************
*** 42,50 ****
Prints out a brief help message.

=item B<PageName|ModuleName>

The item you want to look up. Nested modules (such as C<File::Basename>)
are specified either as C<File::Basename> or C<File/Basename>. You
! may also give a descriptive name of a page, such as C<perlfunc>.

=back
--- 42,57 ----
Prints out a brief help message.

+ =item B<-v> verbose
+
+ Describes search for the item in detail.
+
=item B<PageName|ModuleName>

The item you want to look up. Nested modules (such as C<File::Basename>)
are specified either as C<File::Basename> or C<File/Basename>. You
! may also give a descriptive name of a page, such as C<perlfunc>. You make
! also give a partial name, such as "Basename" for "File::Basename", but
! this will be slower, if there is more then one page with the same partial
! name, you will only get the first one.

=back
***************
*** 73,77 ****
if(@ARGV<1) {
die <<EOF;
! Usage: $0 [-h] PageName|ModuleName

We suggest you use "perldoc perldoc" to get aquainted
--- 80,84 ----
if(@ARGV<1) {
die <<EOF;
! Usage: $0 [-h] [-v] PageName|ModuleName

We suggest you use "perldoc perldoc" to get aquainted
***************
*** 85,90 ****
warn "@_\n" if @_;
die <<EOF;
! perlman [-h] PageName|ModuleName...
-h Display this help message.
PageName|ModuleName...
is the name of a piece of documentation that you want to look at. You
--- 92,98 ----
warn "@_\n" if @_;
die <<EOF;
! perlman [-h] [-v] PageName|ModuleName...
-h Display this help message.
+ -v Verbosely describe what's going on.
PageName|ModuleName...
is the name of a piece of documentation that you want to look at. You
***************
*** 103,107 ****
unshift(@ARGV,shellwords($ENV{"PERLDOC"}));

! getopts("h") || usage;

usage if $opt_h;
--- 111,115 ----
unshift(@ARGV,shellwords($ENV{"PERLDOC"}));

! getopts("hv") || usage;

usage if $opt_h;
***************
*** 124,163 ****
}

! sub searchfor {
! my($s,@dirs) = @_;
! $s =~ s!::!/!g;
! # printf STDERR "looking for $s in @dirs\n";
!
! foreach $dir (@dirs) {
! if( -f "$dir/$s.pod") { return "$dir/$s.pod" }
! elsif( -f "$dir/$s.pm" and containspod("$dir/$s.pm"))
! { return "$dir/$s.pm" }
! elsif( -f "$dir/$s" and containspod("$dir/$s"))
! { return "$dir/$s" }
! elsif( -f "$dir/pod/$s.pod") { return "$dir/pod/$s.pod" }
! elsif( -f "$dir/pod/$s" and containspod("$dir/pod/$s"))
! { return "$dir/pod/$s" }
! }
! return ();
! }
!

$ENV{PAGER} ||= "more";

foreach (@pages) {
! print STDERR "Searching for $_\n";
# We must look both in @INC for library modules and in PATH
# for executables, like h2xs or perldoc itself.
@searchdirs = @INC;
! push(@searchdirs, split(':', $ENV{'PATH'}) );
! @files= searchfor($_,@searchdirs);
if( @files ) {
! print STDERR "Found as @files\n";
} else {
! print STDERR "No documentation found for $_\n";
}
push(@found,@files);
}

$cmd=$filter="";

--- 132,222 ----
}

! sub minus_f_nocase {
! my($file) = @_;
! local *DIR;
! local($")="/";
! my(@p,$p,$cip);
! foreach $p (split(/\//, $file)){
! if (-d ("@p/$p")){
! push @p, $p;
! } elsif (-f ("@p/$p")) {
! return "@p/$p";
! } else {
! my $found=0;
! my $lcp = lc $p;
! opendir DIR, "@p";
! while ($cip=readdir(DIR)) {
! if (lc $cip eq $lcp){
! $found++;
! last;
! }
! }
! closedir DIR;
! return "" unless $found;
! push @p, $cip;
! return "@p" if -f "@p";
! }
! }
! return; # is not a file
! }
!
! sub searchfor {
! my($recurse,$s,@dirs) = @_;
! $s =~ s!::!/!g;
! printf STDERR "looking for $s in @dirs\n" if $opt_v;
! my $ret;
! my $i;
! my $dir;
! for ($i=0;$i<@dirs;$i++) {
! $dir = $dirs[$i];
! if (( $ret = minus_f_nocase "$dir/$s.pod")
! or ( $ret = minus_f_nocase "$dir/$s.pm" and containspod($ret))
! or ( $ret = minus_f_nocase "$dir/$s" and containspod($ret))
! or ( $ret = minus_f_nocase "$dir/pod/$s.pod")
! or ( $ret = minus_f_nocase "$dir/pod/$s" and containspod($ret)))
! { return $ret; }
!
! if($recurse) {
! opendir(D,$dir);
! my(@newdirs) = grep(-d,map("$dir/$_",grep(!/^\.\.?$/,readdir(D))));
! closedir(D);
! print STDERR "Also looking in @newdirs\n" if $opt_v;
! push(@dirs,@newdirs);
! }
! }
! return ();
! }

$ENV{PAGER} ||= "more";

foreach (@pages) {
! print STDERR "Searching for $_\n" if $opt_v;
# We must look both in @INC for library modules and in PATH
# for executables, like h2xs or perldoc itself.
@searchdirs = @INC;
! push(@searchdirs, grep(-d, split(':', $ENV{'PATH'})));
! @files= searchfor(0,$_,@searchdirs);
if( @files ) {
! print STDERR "Found as @files\n" if $opt_v;
} else {
! # no match, try recursive search
!
! @searchdirs = grep(!/^\.$/,@INC);
!
!
! @files= searchfor(1,$_,@searchdirs);
! if( @files ) {
! print STDERR "Loosly found as @files\n" if $opt_v;
! } else {
! print STDERR "No documentation found for '$_'\n";
! }
}
push(@found,@files);
}

+ if(!@found) {
+ exit 1;
+ }
+
$cmd=$filter="";

***************
*** 174,175 ****
--- 233,236 ----
}
close(OUT);
+
+ exit 0;


--
Kenneth Albanowski (kjahds@kjahds.com, CIS: 70705,126)