Has anyone familiar with DistGen looked at what Craig is doing?
Can anyone offer any assistance?
More comments inline.
On Sun, Feb 05, 2006 at 06:10:58PM -0600, Craig A. Berry wrote:
> 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} ) {
Wild stab in the dark:
if (! ( exists $names{$name} ||
$^O eq 'VMS' && -d $name && exists $names{"[.$name]"} ) ) {
It doesn't have to be pretty, it just has to work.
> print "Removing '$name'\n" if $VERBOSE;
> File::Path::rmtree( $_ );
> }
> - }, File::Spec->curdir );
> + }, './' );
Why not curdir?
>
> chdir( $here );
> }
|