Bundler-MultiGem
view release on metacpan or search on metacpan
lib/Bundler/MultiGem/Model/Gem.pm view on Meta::CPAN
open(GEMSPEC, "<${gemspec}") || die "Can't open ${gemspec}: $!";
open(NEW_GEMSPEC, ">${new_gemspec}") || die "Can't open ${new_gemspec}: $!";
while( my $line = <GEMSPEC> ){
if ( $line =~ /${n}\/version/ ) { next; }
for ($line) {
# Replace version reference from file
s/${mm}::VERSION/'$v'/;
s/${n}/${vn}/g;
s/${mm}/${vmn}/g;
}
print NEW_GEMSPEC $line;
}
close(NEW_GEMSPEC);
close(GEMSPEC);
unlink $gemspec || warn "Could not unlink ${gemspec}: $!";
}
=head2 rename_main_file
Manipulates original gemfile as follows:
* rename C<lib/foo.rb> for v C<0.1.0> into C<lib/v010-foo.rb>
* add on top of C<lib/v010-foo.rb>: C<module V010; end> for namespacing
* copy the rest of original below
This step allows to add a namespace with the gem version (a kind of shading).
All the other replacement are done with other rb, rake and Rakfile files.
=cut
sub rename_main_file {
my ($self, $v, $lib_dir) = @_;
my $normv = Bundler::MultiGem::Model::Gem::norm_v($v);
my $new_main_module = ruby_constantize($normv);
my $main_module_file = catfile( $lib_dir, $self->name . ".rb" );
my $new_main_module_file = catfile( $lib_dir, $self->vname($v) . ".rb" );
if ( -e $main_module_file ) {
open(ORIGINAL, "<${main_module_file}") ||
die "Can't open ${main_module_file}: $!";
my @file_content = <ORIGINAL>;
close(ORIGINAL);
open(NEW_FILE, ">${new_main_module_file}") ||
die "Can't open ${new_main_module_file}: $!";
print NEW_FILE "module ${new_main_module}; end\n";
foreach my $line (@file_content) { print NEW_FILE $line; }
close(NEW_FILE);
unlink $main_module_file;
}
}
=head2 process_single_file
Manipulates each file as follows:
* create a backup of the original file C<.bak>
* replace gem name reference with gem vname (C<foo> with C<v010-foo>)
* replace gem main_module reference with gem vmodule_name (C<Foo> with C<V010::Foo>)
* unlink the backup C<.bak>
=cut
sub process_single_file {
my ($self, $v, $f) = @_;
my ($n, $vn, $mm, $vmn) = (
$self->name, $self->vname($v), $self->main_module, $self->vmodule_name($v)
);
my $bkp = $f . ".bak";
rename($f, $bkp);
open(I, "<$bkp");
open(O, ">$f");
while(my $line = <I>) {
for ($line) {
s/${n}/${vn}/g;
s/${mm}/${vmn}/g;
}
print O $line;
}
close(O);
close(I);
unlink $bkp;
}
=head2 fetch
This is an alias of the system command C<gem fetch>
my $gem->name; # "foo"
my $fp = "pkg/v010-foo.gem"
my $gv = "0.1.0";
$gem->fetch($fp, $gv); # if $fp found, do nothing, else fetch gem version and rename it
=cut
sub fetch {
my ( $self, $fp, $gv ) = (@_);
if (! -f $fp ) {
my $cmd = "gem fetch " . $self->name . " --version " . $gv .
" --source " . $self->source;
system("$cmd");
rename( $self->name . "-$gv" . ".gem", $fp );
}
}
=head1 EXPORTS
=head2 gem_vname
Reusable function to combine and format gem name and version
use Bundler::MultiGem::Model::Gem qw(gem_vname);
gem_vname("foo", "0.1.0"); # v010-foo
gem_vname("foo_bar", "0.1.0"); # v010-foo_bar
gem_vname("foo-bar", "0.1.0"); # v010-foo-bar
=cut
sub gem_vname {
( run in 1.662 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )