# from Johan Vromans
# on Sunday 17 June 2007 02:36 am:
>Eric Wilhelm wrote:
>>For instance, process_foo_files() would be terribly
>> convenient if copy_if_modified() could hit a callback rather than
>> File::Copy::copy() *after* creating the basedir and before the
>> chmod.
>
>Assume the file contains ABBC, and the copy hook turns that into AXXC.
>The file on disk is ABBC. Coy if modified will do nothing, since it's
>not modified?
(Actually, it would copy given explicit source and dest because
up_to_date($src, $dest) would return false.)
But, that's not the "in lieu of File::Copy::copy()" of which I speak.
I'm talking about changing the file *content* not the names.
Here's the processor without any copy_files() support.
Note the assumptions I'm making about a unix filesystem (the compilation
via '-MInline=_INSTALL_' is a hack and of course assumes make, etc.
But bear with me there.)
Also note that I have to loop over the two sets of files individually.
Also note that the @$pmfiles loop assumes existing directories (which
just happens to be true *in this case* because the @$cfiles loop
creates them.)
Also note that I have to open,read and open,write the file.
Also note that I forgot to chmod the .pm's.
I could add extra code to get the cross-platform bits right, but that's
what I'm thinking should be addressed in M::B. The proposed
copy_files() and content-rewriting hooks would eliminate the need for
that extra code. They also keep allow authors to get it right without
having to think about all of those issues and/or test their custom
copy-with-modifications code.
sub process_inline_files {
my $self = shift;
# find & copy ilib tree into blib/lib
my $cfiles = $self->rscan_dir('ilib', qr{\.c(pp)?$});
foreach my $file (@$cfiles) {
(my $to = $file) =~ s#ilib#blib/lib#;
$self->copy_if_modified(from => $file, to => $to);
}
# now the .pm files
my $pmfiles = $self->rscan_dir('ilib', qr{\.pm$});
foreach my $file (@$pmfiles) {
(my $to = $file) =~ s#ilib#blib/lib#;
next if($self->up_to_date($file, $to));
my $code = do {open(my $fh, '<', $file) or die;
local $/; <$fh>;};
# look for a name
my ($name) = ($code =~ m/^package ([\w:]+);/) or
die "cannot find name";
# turn the the version on
my $count = ($code =~ s/^(\s*)#(\s*VERSION *=>)/$1$2/mg);
$count or die "missing '#VERSION =>' entry";
($count == 1) or die "too many '#VERSION =>' entries?";
# write
open(my $fh, '>', $to) or die "cannot write '$to' $!";
print $fh $code;
close($fh) or die "$!";
# then build it
$self->do_system($^X, '-Iblib/lib', '-MInline=_INSTALL_',
"-M$name", qw(-e1 0.1 blib/arch)
);
}
} # end sub process_inline_files
So here's what happens when we support all of the filename munging in
copy_files(). I'm still undecided on the particulars of "fixup". (I
also just realized that we would need some sort of "re-rooting" option
and I'm totally undecided on that at this point.)
Anyway, this is now able to be completely cross-platform without the
author having to worry about all of this details (and better yet, the
author gets to be lazy.) (You still have to ignore the inline hack --
that's a completely different problem than copy_files().)
sub process_inline_files {
my $self = shift;
# find & copy ilib tree into blib/lib
my $files = $self->rscan_dir('ilib', qr{\.(?:pm|c(pp)?)$});
# remove the ilib root
my @paths = map({s/ilib//; $_} @$files);
my @inline_mods;
$self->copy_files([EMAIL PROTECTED], 'blib/lib',
fromdir => 'ilib',
fixup => {
where => qr/\.pm$/,
content => sub {
# look for a name
my ($name) = (m/^package ([\w:]+);/) or
die "cannot find name";
push(@inline_mods, $name);
# turn the the version on
my $count = (s/^(\s*)#(\s*VERSION *=>)/$1$2/mg);
$count or die "missing '#VERSION =>' entry";
($count == 1) or die "too many '#VERSION =>' entries?";
},
},
);
# then build them
foreach my $name (@inline_mods) {
$self->do_system($^X, '-Iblib/lib', '-MInline=_INSTALL_',
"-M$name", qw(-e1 0.1 blib/arch)
);
}
} # end sub process_inline_files
--Eric
--
I arise in the morning torn between a desire to improve the world and a
desire to enjoy the world. This makes it hard to plan the day.
--E.B. White
---------------------------------------------------
http://scratchcomputing.com
---------------------------------------------------