At 3:39 PM -0800 2/5/06, Yitzchak Scott-Thoennes wrote: >Any progress on this front? Given that this is just for purposes of >running tests, maybe here the hash keys should always be lowercased? > >The previous patch to add Module::Build no longer applies cleanly; > >http://zipcon.net/~sthoenna/mbaddfull270701.patch > >is updated to match bleadperl and what's currently in cvs for MB.
I'll try to look at that again soon -- too many projects in progress at once. I did some hacking with Tie:CPHash from CPAN and got a bit farther. A still not fully working diff of DistGen.pm is at the end of this message. I'm now getting, for example: $ perl -"I[-.lib]" [-.lib.module.build.t]tilde.t 1..11 Warning: Removing existing directory 'D0:[CRAIG.perl.t._tmp.Simple]' Changed file 't/basic.t'. Changed file 'lib/Simple.pm'. Changed file 'Build.PL'. Splitting '[]' Setting directory name '[]' in %names Splitting '[.t]' Setting directory name '[.t]' in %names Setting directory name '[.t]' in %names Splitting '[.lib]' Setting directory name '[.lib]' in %names Setting directory name '[.lib]' in %names Splitting '[]' Setting directory name '[]' in %names Removing 'lib' Removing 't' Can't call method "install_base" on an undefined value at [-.lib.module.build.t]tilde.t line 44. # No tests run! I think the next hurdle is that File::Find is returning directory names with no attached distinguishing punctuation (C<lib> or C<t>) but the names that we've cached do have that punctuation (C<[.lib]> or C<[.t]>). File::Spec->canonpath does not normalize that: $ perl -"MFile::Spec" -e "print File::Spec->canonpath('[.lib]');" [.lib] $ perl -"MFile::Spec" -e "print File::Spec->canonpath('lib');" lib So on VMS we'll have to get more aggressive about caching directory names in the same form that we'll be looking them up. Otherwise we don't recognize directories that we want to keep and we end up deleting before they are even used. --- DistGen.pm;2 Thu Jan 26 18:48:29 2006 +++ DistGen.pm Sun Jan 29 15:58:55 2006 @@ -5,7 +5,7 @@ use vars qw( $VERSION $VERBOSE ); $VERSION = '0.01'; -$VERBOSE = 0; +$VERBOSE = 1; use Cwd (); @@ -14,6 +14,7 @@ use File::Path (); use File::Spec (); use IO::File (); +use Tie::CPHash; sub new { my $package = shift; @@ -29,6 +30,10 @@ ); my $self = bless( \%data, $package ); + tie %{$self->{filedata}}, 'Tie::CPHash'; + + tie %{$self->{pending}{change}}, 'Tie::CPHash'; + if ( -d $self->dirname ) { warn "Warning: Removing existing directory '@{[$self->dirname]}'\n"; $self->remove; @@ -280,6 +285,7 @@ } my %names; + tie %names, 'Tie::CPHash'; foreach my $file ( keys %{$self->{filedata}} ) { my $filename = $self->_real_filename( $file ); my ($vol, $dirname, $f) = File::Spec->splitpath( $filename ); @@ -288,10 +294,16 @@ $names{$filename} = 0; + print "Splitting '$dirname'\n" if $VERBOSE; my @dirs = File::Spec->splitdir( $dirname ); while ( @dirs ) { - my $dir = File::Spec->catdir( @dirs ); - $names{$dir} = 0; + my $dir = ( scalar(@dirs) == 1 + ? $dirname + : File::Spec->catdir( @dirs ) ); + if (length $dir) { + print "Setting directory name '$dir' in \%names\n" if $VERBOSE; + $names{$dir} = 0; + } pop( @dirs ); } } @@ -299,11 +311,13 @@ File::Find::finddepth( sub { my $name = File::Spec->canonpath( $File::Find::name ); + $name =~ s/\.\z// if $^O eq 'VMS'; + if ( not exists $names{$name} ) { print "Removing '$name'\n" if $VERBOSE; File::Path::rmtree( $_ ); } - }, File::Spec->curdir ); + }, './' ); chdir( $here ); } -- ________________________________________ Craig A. Berry mailto:[EMAIL PROTECTED] "... getting out of a sonnet is much more difficult than getting in." Brad Leithauser