From 3dcdef338543d77f77b06f0a265e33ab571d98b0 Mon Sep 17 00:00:00 2001 From: Kang-min Liu Date: Thu, 19 Sep 2024 20:12:36 +0900 Subject: [PATCH] make `perlbrew installl` able to accept an URL to skaji/relocatable-perl tarball. It should be able to accept URLs found on this page: https://github.com/skaji/relocatable-perl/releases For example: perlbrew install https://github.com/skaji/relocatable-perl/releases/download/5.40.0.0/perl-linux-amd64.tar.gz Or, with `--as` parameter: perlbrew install https://github.com/skaji/relocatable-perl/releases/download/5.40.0.0/perl-linux-amd64.tar.gz --as perl-5.40 Currently this only download + extract the tarball, then move its content to the installation dir, without checking whether os/arch actually matches current environment. --- lib/App/perlbrew.pm | 66 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/lib/App/perlbrew.pm b/lib/App/perlbrew.pm index 921cfc4b..f9ffa4bd 100644 --- a/lib/App/perlbrew.pm +++ b/lib/App/perlbrew.pm @@ -21,10 +21,10 @@ BEGIN { use Getopt::Long (); use CPAN::Perl::Releases (); use JSON::PP qw( decode_json ); -use File::Copy qw( copy ); +use File::Copy qw( copy move ); use Capture::Tiny (); -use App::Perlbrew::Util qw( files_are_the_same uniq find_similar_tokens ); +use App::Perlbrew::Util qw( files_are_the_same uniq find_similar_tokens looks_like_url_of_skaji_relocatable_perl ); use App::Perlbrew::Path (); use App::Perlbrew::Path::Root (); use App::Perlbrew::HTTP qw( http_download http_get ); @@ -1227,6 +1227,10 @@ sub run_command_install { exit(-1); } + if ( my $detail = looks_like_url_of_skaji_relocatable_perl($dist) ) { + return $self->do_install_skaji_relocatable_perl($detail); + } + $self->{dist_name} = $dist; # for help msg generation, set to non # normalized name @@ -1630,6 +1634,64 @@ INSTALL return; } +sub do_install_skaji_relocatable_perl { + my ($self, $detail) = @_; + + my $installation_name = $self->{as} || ("skaji-relocatable-perl-" . $detail->{version}); + my $installation_path = $self->root->perls->child($installation_name); + + die "ERROR: Installation target \"${installation_name}\" already exists\n" + if $installation_path->exists; + + my $path = $self->root->dists + ->child("skaji-relocatable-perl") + ->child($detail->{version}) + ->mkpath() + ->child($detail->{original_filename}); + + if (-f $path) { + print "Re-using the downloaded $path\n"; + } else { + my $url = $detail->{url}; + print "Downloading $url as $path\n"; + my $error = http_download( $detail->{url}, $path ); + if ($error) { + die "Failed to download from $url\nError: $error"; + } + } + + my $extracted_path = $self->do_extract_skaji_relocatable_perl_tarball($detail, $path); + + move $extracted_path, $installation_path; + + print "$installation_name is installed at $installation_path.\n"; + + print "$installation_name is successfully installed.\n"; +} + +sub do_extract_skaji_relocatable_perl_tarball { + my ($self, $detail, $tarball_path) = @_; + + my $workdir = $self->builddir + ->child("skaji-relocatable-perl") + ->child($detail->{version}); + + $workdir->rmpath() + if $workdir->exists(); + + $workdir->mkpath(); + + my $tarx = "tar xzf"; + my $extract_command = "cd $workdir; $tarx $tarball_path"; + + system($extract_command) == 0 + or die "Failed to extract $tarball_path"; + + my ($extracted_path) = $workdir->children; + + return $extracted_path; +} + sub do_install_program_from_url { my ( $self, $url, $program_name, $body_filter ) = @_;