#!/usr/bin/env perl # # vim: set ts=4:noet # # sboremove # script to remove an installed SlackBuild and any unused dependencies # # author: Luke Williams # license: WTFPL use 5.16.0; use strict; use warnings FATAL => 'all'; use SBO::Lib; use Getopt::Long qw(:config bundling); use File::Basename; my $self = basename ($0); sub get_requires ($) { my $location = get_sbo_location($_[0]); my $requires = get_from_info (LOCATION => $location, GET => 'REQUIRES'); return $requires; } sub show_usage () { print < \$help, 'version|v' => \$vers, 'nointeractive|r' => \$non_int, 'norequirements|R' => \$no_reqs, 'force|f' => \$force, ); show_usage and exit 0 if $help; show_version and exit 0 if $vers; show_usage and exit 0 unless exists $ARGV[0]; my $rootpkg = $ARGV[0]; my $test = get_sbo_location $rootpkg; die "Unable to locate $rootpkg in the SlackBuilds.org tree.\n" unless defined $test; my $remove_queue; my %required_by; my @confirmed; # Determine dependencies unless ($no_reqs) { $remove_queue = get_build_queue($rootpkg); @$remove_queue = reverse(@$remove_queue); } else { push(@$remove_queue, $rootpkg); } my $inst_names; # Determine required by unless ($force) { my $installed = get_installed_sbos; $inst_names = get_inst_names $installed; for my $inst (@$inst_names) { my $requires = get_requires "$inst"; next unless $$requires[0]; for my $req (@$requires) { unless ( $req eq "%README%" ) { if ( $req ~~ $inst_names ) { push(@{$required_by{$req}}, $inst); } } } } } # Make sure packages in remove queue are installed on system. my @temp; if ($inst_names) { for my $i (@$remove_queue) { if ($i ~~ $inst_names) { push(@temp, $i); } } $remove_queue = \@temp; } my $queue = join(" ", @$remove_queue); say "Remove: $queue\n"; # separate ignored packages from confirmed. my $ignore; my %ignore_data; for my $pkg (@$remove_queue) { $ignore = 0; while ( my ($key, $value) = each(%required_by) ) { if ( $key eq $pkg ) { for my $v (@$value) { unless ($v ~~ @confirmed) { $ignore = 1; push(@{$ignore_data{$key}}, $v); } } } } unless ($ignore) { push(@confirmed, $pkg); } } # Show ignored packages my $ignore_count = keys(%ignore_data); if ($ignore_count) { say "Ignoring $ignore_count package(s)"; while ( my ($key, $value) = each(%ignore_data) ) { print "$key : required by"; for my $v (@$value) { print " $v"; } print "\n"; } print "\n"; } # Show remove queue my $remove_count = @confirmed; if ($remove_count) { say "Removing $remove_count package(s)"; for my $pkg (@confirmed) { print "$pkg\n"; } print "\n"; } else { say "Nothing to remove."; exit 0; } unless ($non_int) { print 'Do you wish to proceed? [n] '; unless ( =~ /^[Yy]/) { say "Exiting."; exit 0; } } for my $instpkg (@confirmed) { system("/sbin/removepkg $instpkg"); } say "All operations completed successfully."