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

Reply via email to