diff options
Diffstat (limited to 'sboinstall')
-rwxr-xr-x | sboinstall | 270 |
1 files changed, 0 insertions, 270 deletions
diff --git a/sboinstall b/sboinstall deleted file mode 100755 index 73fb2f4..0000000 --- a/sboinstall +++ /dev/null @@ -1,270 +0,0 @@ -#!/usr/bin/perl -# -# vim: ts=4:noet -# -# sboinstall -# script to install (a) SlackBuild(s) by name -# -# authors: Jacob Pipkin <j@dawnrazor.net> -# Luke Williams <xocel@iquidus.org> -# Andreas Guldstrand <andreas.guldstrand@gmail.com> -# maintainer: Slack Coder <slackcoder@server.ky> - -use 5.16.0; -use strict; -use warnings FATAL => 'all'; -use SBO::Lib qw/ %config _ERR_USAGE _ERR_OPENFH get_arch get_build_queue get_installed_cpans get_installed_packages get_sbo_location get_sbo_locations in merge_queues open_fh print_failures process_sbos prompt show_version slackbuilds_or_fetch slurp usage_error user_prompt /; -use Getopt::Long qw(:config bundling); -use File::Basename; -use JSON::PP; - -my $self = basename($0); - -sub show_usage { - print <<"EOF"; -Usage: $self [options] sbo - $self --use-template file - -Options (defaults shown first where applicable): - -h|--help: - this screen. - -v|--version: - version information. - -c|--noclean (FALSE|TRUE): - set whether or not to clean working files/directories after the build. - -d|--distclean (TRUE|FALSE): - set whether or not to clean distfiles afterward. - -i|--noinstall: - do not run installpkg at the end of the build process. - -j|--jobs (FALSE|#): - specify "-j" setting to make, for multicore systems; overrides conf file. - -p|--compat32: - install an SBo as a -compat32 pkg on a multilib x86_64 system. - -r|--nointeractive: - non-interactive; skips README and all prompts. - -R|--norequirements: - view the README but do not parse requirements, commands, or options. - --reinstall: - Ask to reinstall any already-installed packages in the requirement list. - --create-template (FILE): - create a template with specified requirements, commands, and options. - --use-template (FILE): - use a template created by --create-template to install requirements with - specified commands and options. This also enables the --nointeractive flag. - -EOF - return 1; -} - -my $noclean = $config{NOCLEAN}; -my $distclean = $config{DISTCLEAN}; -my $jobs = $config{JOBS}; -my ($help, $vers, $no_install, $non_int, $no_reqs, $compat32, $ctemp, $utemp, $reinstall); - -GetOptions( - 'help|h' => \$help, - 'version|v' => \$vers, - 'noclean|c=s' => \$noclean, - 'distclean|d=s' => \$distclean, - 'noinstall|i' => \$no_install, - 'jobs|j=s' => \$jobs, - 'compat32|p' => \$compat32, - 'nointeractive|r' => \$non_int, - 'norequirements|R' => \$no_reqs, - 'reinstall' => \$reinstall, - 'create-template=s' => \$ctemp, - 'use-template=s' => \$utemp, -); - -if ($help) { show_usage(); exit 0 } -if ($vers) { show_version(); exit 0 } - -if (!@ARGV and not length $utemp) { show_usage(); exit 1 } -if (defined $utemp and not length $utemp) { show_usage(); exit 1 } -if (defined $ctemp and not length $ctemp) { show_usage(); exit 1 } - -$noclean = $noclean eq 'TRUE' ? 1 : 0; -$distclean = $distclean eq 'TRUE' ? 1 : 0; - -if ($jobs) { - usage_error("You have provided an invalid value for -j|--jobs") - unless ($jobs =~ /^\d+$/ || $jobs eq 'FALSE'); -} - -if ($compat32) { - usage_error("compat32 only works on x86_64.") unless get_arch eq 'x86_64'; -} - -unless ($< == 0) { - warn "This script requires root privileges.\n"; - exit _ERR_USAGE; -} - -# if we can't find SLACKBUILDS.TXT in $config{HOME}, prompt to fetch the tree -slackbuilds_or_fetch(); - -my (%warnings, $build_queue, $template); - -if (length $utemp) { - my $json = JSON::PP->new->latin1; - $non_int = 1; - - my $data = slurp($utemp); - if (length $data) { - eval { $template = $json->decode($data); }; - } - do { warn "Could not read template from $utemp.\n"; exit _ERR_OPENFH } if not defined $template; - - $build_queue = $template->{build_queue}; -} else { - if ($no_reqs or $non_int) { - $build_queue = \@ARGV; - } else { - for my $sbo (@ARGV) { - my $queue = get_build_queue([$sbo], \%warnings); - $build_queue = merge_queues($build_queue, $queue); - } - } -} - -# get lists of installed packages and perl modules from CPAN -my $inst_pkgs = get_installed_packages('ALL'); -my $pms = get_installed_cpans(); -s/::/-/g for @$pms; -my %inst_names; -$inst_names{$_->{name}} = $_ for @$inst_pkgs; - -# populate %locations and sanity check -my %locations = get_sbo_locations($build_queue); -for my $sbo (@$build_queue) { - next if $inst_names{$sbo}; - - if (not $locations{$sbo} and in(@ARGV, $sbo)) { - usage_error("Unable to locate $sbo in the SlackBuilds.org tree.") - } - if ($compat32) { - usage_error("-p|--compat32 is not supported with Perl SBos.") - if $locations{$sbo} =~ qr|/perl/[^/]+$|; - } -} - -# check for already-installeds and prompt for the rest -my (@temp_queue, %commands, %options); -if (defined $template) { - %commands = %{ $template->{commands} }; - %options = %{ $template->{options} }; -} -my $added = ' added to install queue.'; -FIRST: for my $sbo (@$build_queue) { - my $name = $compat32 ? "$sbo-compat32" : $sbo; - - if ($inst_names{$name}) { - my $inst_msg = sprintf "%s (%s) is already installed.", $name, $inst_names{$name}{pkg}; - if ($reinstall and not $non_int) { - next FIRST unless prompt("$inst_msg Do you want to reinstall from SBo?", default => 'no'); - } elsif ($reinstall) { - say "$inst_msg Reinstalling."; - } else { - say $inst_msg; - next FIRST; - } - } else { - if ($sbo =~ /^perl-/) { - my $pm_name = $sbo; - $pm_name =~ s/^perl-//; - for my $pm (@$pms) { - if ($pm =~ /^$pm_name$/i) { - say "$sbo installed via the cpan."; - next FIRST; - } - } - } - } - - # Make sure the slackbuild exists on SBo - if (defined $warnings{$sbo} and $warnings{$sbo} eq 'nonexistent') { - say "Unable to locate $sbo in the SlackBuilds.org tree."; - if (not $non_int) { - exit 0 unless prompt "Do you want to ignore it and continue?", default => 'no'; - } - next FIRST; - } - - $locations{$name} = get_sbo_location($sbo) if $compat32; - unless ($non_int) { - # if compat32 is TRUE, we need to see if the non-compat version exists. - if ($compat32) { - unless ($inst_names{$sbo}) { - say "$name requires $sbo."; - my ($cmds, $opts, $exit) = user_prompt($sbo, $locations{$sbo}); - if ($exit) { - warn "Unable to open README for $sbo.\n"; - exit $exit; - } - if ($cmds) { - next FIRST if $cmds eq 'N'; - } - push(@temp_queue, $sbo); - $commands{$sbo} = $cmds; - $options{$sbo} = $cmds; - say "$sbo$added"; - } - } - my ($cmds, $opts, $exit) = user_prompt($name, $locations{$name}); - if ($exit) { - warn "Unable to open README for $name.\n"; - exit $exit; - } - if ($cmds) { - next FIRST if $cmds eq 'N'; - } - push(@temp_queue, $name); - $commands{$sbo} = $cmds; - $options{$sbo} = $opts; - say "$name$added"; - } else { - push(@temp_queue, $sbo); - say "\n$name$added"; - } -} -@$build_queue = @temp_queue; - -exit 0 if @{ $build_queue } == 0; -say "\nInstall queue: " . join(' ', @$build_queue); -unless ($non_int) { - exit 0 unless prompt("\nAre you sure you wish to continue?", default => 'yes'); -} - -if (defined $ctemp) { - my ($temp_fh, $exit) = open_fh($ctemp, '>'); - do { warn $temp_fh; exit $exit } if $exit; - - my $json = JSON::PP->new->latin1->pretty->canonical; - my $build_settings = { - build_queue => $build_queue, - commands => \%commands, - options => \%options, - }; - print {$temp_fh} $json->encode( $build_settings ); - close $temp_fh; - print "\nTemplate $ctemp saved.\n"; -} - -my ($failures, $exit) = process_sbos( - TODO => $build_queue, - CMDS => \%commands, - OPTS => \%options, - JOBS => $jobs, - LOCATIONS => \%locations, - NOINSTALL => $no_install, - NOCLEAN => $noclean, - DISTCLEAN => $distclean, - NON_INT => $non_int, -); -print_failures($failures); - -if ($exit) { - exit $exit; -} else { - exit 0; -} |