App-instopt
view release on metacpan or search on metacpan
lib/App/instopt.pm view on Meta::CPAN
schema => ['true*'],
cmdline_aliases => {l=>{}},
},
);
our %argopt_download = (
download => {
summary => 'Whether to download latest version from URL'.
'or just find from download dir',
'summary.alt.bool.not' => 'Do not download latest version from URL, '.
'just find from download dir',
schema => 'bool*',
default => 1,
cmdline_aliases => {
D => {is_flag=>1, summary => 'Shortcut for --no-download', code=>sub {$_[0]{download} = 0}},
},
},
);
our %argopt_quiet = (
quiet => {
schema => 'bool*',
cmdline_aliases => {q=>{}},
},
);
sub _set_args_default {
require Software::Catalog::Util;
my ($args, $opts) = @_;
if ($opts->{set_default_arch}) {
if (!$args->{arch}) {
$args->{arch} = Software::Catalog::Util::detect_arch();
}
}
if (!$args->{download_dir}) {
require PERLANCAR::File::HomeDir;
$args->{download_dir} = PERLANCAR::File::HomeDir::get_my_home_dir() .
'/software';
}
if (!$args->{install_dir}) {
$args->{install_dir} = "/opt";
}
if (!$args->{program_dir}) {
$args->{program_dir} = "/usr/local/bin";
}
}
my $_ua;
sub _ua {
unless ($_ua) {
require LWP::UserAgent;
$_ua = LWP::UserAgent->new;
}
$_ua;
}
# try to resolve redirect
sub _real_url {
require HTTP::Request;
my $url = shift;
my $ua = _ua();
while (1) {
my $res = $ua->simple_request(HTTP::Request->new(HEAD => $url));
if ($res->code =~ /^3/) {
if ($res->header("Location")) {
$url = $res->header("Location");
next;
} else {
die "URL '$url' redirects without Location";
}
} elsif ($res->code !~ /^2/) {
warn "Can't HEAD URL '$url': ".$res->code." - ".$res->message;
# give up
return undef;## no critic: Subroutines::ProhibitExplicitReturnUndef
} else {
return $url;
}
}
}
sub _convert_download_urls_to_filenames {
require URI::Escape;
my %args = @_;
my $res = $args{res};
my @urls = ref($res->[2]) eq 'ARRAY' ? @{$res->[2]} : ($res->[2]);
my @metanames = $res->[3]{'func.filename'} ?
(ref($res->[3]{'func.filename'}) eq 'ARRAY' ? @{ $res->[3]{'func.filename'} } : ($res->[3]{'func.filename'})) : ();
my @filenames;
for my $i (0..$#urls) {
my $filename;
if ($#metanames >= $i) {
$filename = $metanames[$i];
} elsif (my $rurl = _real_url($urls[$i])) {
($filename = $rurl) =~ s!.+/!!;
$filename = URI::Escape::uri_unescape($filename);
} else {
$filename = "$args{software}-$args{version}";
}
# strip query string
$filename =~ s/(?=.)\?.+//;
push @filenames, $filename;
}
@filenames;
}
sub _init {
my ($args, $opts) = @_;
$opts //= {};
$opts->{set_default_arch} //= 1;
unless ($App::instopt::state) {
_set_args_default($args, $opts);
my $state = {
};
$App::instopt::state = $state;
}
$App::instopt::state;
( run in 1.544 second using v1.01-cache-2.11-cpan-acf6aa7dc9e )