App-Rakubrew
view release on metacpan or search on metacpan
lib/App/Rakubrew/Update.pm view on Meta::CPAN
package App::Rakubrew::Update;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw();
use strict;
use warnings;
use 5.010;
use HTTP::Tinyish;
use JSON;
use FindBin qw( $RealBin $RealScript );
use File::Copy;
use File::Spec::Functions qw( catfile catdir );
use Fcntl;
use if scalar ($^O =~ /win32/i), 'Win32';
use if scalar ($^O =~ /win32/i), 'Win32::Process';
use if scalar ($^O =~ /win32/i), 'Win32::ShellQuote';
use App::Rakubrew;
use App::Rakubrew::Variables;
use App::Rakubrew::Config;
use App::Rakubrew::Tools;
my $release_index_url = 'https://rakubrew.org/releases';
my $download_url_prefix = 'https://rakubrew.org';
my %dl_urls = (
fatpack => "$download_url_prefix/perl/rakubrew",
win => "$download_url_prefix/win/rakubrew.exe",
macos => "$download_url_prefix/macos/rakubrew",
macos_arm => "$download_url_prefix/macos_arm/rakubrew",
);
sub update {
my $quiet = shift;
# For par packaged executables the following returns the path and name of
# the par packaged file.
my $current_rakubrew_file = catfile($RealBin, $RealScript);
# check whether this is a CPAN installation. Abort if yes.
if ($distro_format eq 'cpan') {
say STDERR 'Rakubrew was installed via CPAN, use your CPAN client to update.';
exit 1;
}
my $ht = HTTP::Tinyish->new();
my $release_index = _download_release_index($ht);
# check version
if ($App::Rakubrew::VERSION >= $release_index->{latest}) {
say 'Rakubrew is up-to-date!';
exit 0;
}
# Display changes
if (!$quiet) {
say "Changes\n";
say "=======\n";
for my $change (@{$release_index->{releases}}) {
next if $change->{version} <= $App::Rakubrew::VERSION;
say $change->{version} . ':';
say " $_" for split(/^/, $change->{changes});
say '';
}
print 'Shall we do the update? [y|N] ';
my $reply = <STDIN>;
chomp $reply;
exit 0 if $reply ne 'y';
say '';
}
mkdir catdir($prefix, 'update') unless (-d catdir($prefix, 'update'));
my $update_file = catfile($prefix, 'update', $RealScript);
# delete RAKUBREW_HOME/update/rakubrew
unlink $update_file;
# download latest to RAKUBREW_HOME/update/rakubrew
my $res = $ht->get($dl_urls{$distro_format});
unless ($res->{success}) {
say STDERR "Couldn\'t download update. Error: $res->{status} $res->{reason}";
exit 1;
}
my $fh;
if (!sysopen($fh, $update_file, O_WRONLY|O_CREAT|O_EXCL, 0777)) {
say STDERR "Couldn't write update file to $update_file. Aborting update.";
exit 1;
}
binmode $fh;
print $fh $res->{content};
close $fh;
if ($^O =~ /win32/i) {
( run in 1.297 second using v1.01-cache-2.11-cpan-df04353d9ac )