Hi all,

I'm thinking of adding some new copy+fixup functionality to M::B.  For 
context, I'm working on a (hackish) process_inline_files() for an 
Inline::C subtree.

Could you please ring-in with "yes that hurts for me too" or "no, you're 
doing it all wrong"?

I'm looking/wishing for a way to munge a file's contents on the way to 
e.g. blib/lib/.  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.  

[Note, the chmod makes it inconvenient to do:

  $self->copy_if_modified(from => 'lib/Foo.foo',
    to => 'blib/lib/Foo.pm') and $self->foo_munge("blib/lib/Foo.pm");

but that's actually a bit wordy, so I still think it hurts elsewhere.]

Though I don't think that really scratches the itch.  I'm trying to 
aggregate some scattered pain-points involving populating blib, so 
please bear with me and/or read along:

  http://svn.dotreader.com/svn/dotreader/trunk/inc/MBwishlist/trees.pm

That's what I used to scratch this itch the last time it was really 
bugging me.  Now I've got something in another project and want to get 
around having to employ copy&paste code reuse.

I think the generic case is roughly:

  * source tree/list of files
    (e.g. foolib/ or ala `find lib -name '*.x'`)
  * destination root
    (e.g. "blib/foo/" or "blib/lib/")
  * possibly needing changes along-the-way
  * should be read-only when done

So maybe this could be satisfied with something like:

  my @copied = $self->copy_files([EMAIL PROTECTED], $todir); # see trees.pm
  $self->munge_in_place([EMAIL PROTECTED]);                 # supplied by user
  $self->chmod_files([EMAIL PROTECTED]);                    # wishlist item

Following the lead of copy_if_modified(), I made copy_files() return the 
destinations.

  Note1:  Though possibly that should return a hashref of 
  {$fromfile => $tofile} pairs where exists($hash->{$fromfile}) is only
  true if it was copied.

  Note2:  And I suppose chmod_files() would want said hashref for the
  is-executable check on $fromfile.

Hmm, so:

  my $copy_info = $self->copy_files([EMAIL PROTECTED], $todir);
  $self->munge_in_place([values(%$copy_info)]);
  $self->chmod_files($copy_info);

But that leaves munge_in_place() with the task of open, read, munge, 
open, write vs the much handier sub {s/^#PUT THING HERE/$thing/} usage 
that would be enabled if copy_files() took a "fixup => sub {...}" 
option, right?  Thus, the more common usage might be just:

  $self->copy_files([EMAIL PROTECTED], $to_dir,
    fixup => sub {s/^#PUT THING HERE/$thing/}
  );

Where fixup is called as:
  while(local $_ = <$infh>) {$fixup->(); print $outfh $_}

So now the questions:

  Useful?

  What did I miss?
   (besides the todo bit "if($^O eq 'os2')" from copy_if_modified())

  Is "fixup => sub {...}" better written as map_lines => sub {...}?

  Should we do "$opts{nochmod} or $self->chmod_files($copy_info)" before
  returning from copy_files()?

    That is, would the three-step shown with the munge_in_place method
    also be required?

    And/or would an after_copy => sub {open(my $fh, '<', $f); ...;
    open($fh, '>', $f); print $fh "$thbbt";} option be better than the
    three-step (avoiding "oops forgot to chmod".)

  What about mixed (e.g. ".pm" and ".cpp" trees)?  Should there be a
  "where" selector of sorts on the fixup option?  Maybe done as 
  "fixup => {lines => sub {...}, where => sub {...}}" -- this implies a
  "fixup => {file => sub {...}, where => sub {...}}" which would sort of
  answer the whole question about after_copy and the three-step thing
  too.


Wow you read this whole thing?  Cool.

Thanks,
Eric
-- 
But as soon as you hear the Doppler shift dropping in pitch, you know
that they're probably going to miss your house, because if they were on
a collision course with your house, the pitch would stay the same until
impact. As I said, that's one's subtle.
--Larry Wall
---------------------------------------------------
    http://scratchcomputing.com
---------------------------------------------------

Reply via email to