aboutsummaryrefslogtreecommitdiff
path: root/sboremove
blob: fc9cadcbfb2aff14baf9f5e38bf046ad0c24d2eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env perl
#
# vim: set ts=4:noet
#
# sboremove
# script to remove an installed SlackBuild.
#
# author: Luke Williams <xocel@iquidus.org>
# license: WTFPL <http://sam.zoy.org/wtfpl/COPYING>

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 show_usage () {
	print <<EOF
Usage: $self [options] sbo

Options (defaults shown first where applicable):
  -h|--help:
    this screen.
  -v|--version:
    version information.
  -r|--nointeractive:
    non-interactive; skips all prompts.
  -R|--norequirements:
    do not parse requirements.
  -e|--exclude (package):
    exclude package (do not remove).
  -f|--force:
    force remove, even if required by other packages on system. 

EOF
}

my ($help, $vers, $non_int, $no_reqs, @excluded);

GetOptions (
	'help|h'		=> \$help,
	'version|v'		=> \$vers,
	'nointeractive|r'	=> \$non_int,
	'norequirements|R'	=> \$no_reqs,
	'exclude|e=s'		=> \@excluded,
);

show_usage and exit 0 if $help;
show_version and exit 0 if $vers;
show_usage and exit 0 unless exists $ARGV[0];

my $remove_queue;
push(@$remove_queue, $ARGV[0]);
my %ignore;

unless ($no_reqs) {
	for my $ex (@excluded) {
		$ignore{$ex}="excluded by user";
	}
	$remove_queue = get_build_queue($ARGV[0]);
	my $installed = get_installed_sbos;
	my $inst_names = get_inst_names $installed;
	#print files...
	for my $pkg (@$inst_names) {
		unless ($pkg ~~ @$remove_queue) {
			my $location = get_sbo_location($pkg);
			my $requires = get_from_info (LOCATION => $location, GET => 'REQUIRES');
			next unless $$requires[0];
			for my $req (@$requires) {
				if ($req ~~ @$remove_queue) {
					$ignore{$req}="required by $pkg";
					push(@excluded, $req);
				}		
			}	
		}
	}
}
my $queue = join(" ", @$remove_queue);
say "Remove: $queue\n";
# Removed excluded
my $exclude;
my @new = ();
for my $sb (@$remove_queue) {
 	$exclude = 0;
 	foreach (@excluded) {
 		if ( $_ eq $sb ) {
 			$exclude = 1;
 		}
 	}
 		unless ($exclude) {
		push(@new, $sb);
	}
}

$remove_queue = \@new;

# Show ignored
my $ignore_count = keys(%ignore);
if ($ignore_count) {
	say "Ignoring $ignore_count package(s).";
	while ( my ($key, $value) = each(%ignore) ) {
    		say "$key : $value";
	}
	print "\n";
}

# Show remove queue
my $remove_count = @$remove_queue;
if ($remove_count) {
	say "Removing $remove_count package(s).";
	for my $i (@$remove_queue) {
		print "$i\n";
	}
	print "\n";	
} else {
	say "Nothing to remove.";
	exit 0;
}

print 'Do you wish to proceed? [n] ';
unless (<STDIN> =~ /^[Yy]/) {
	say "Exiting.";
	exit 0;
} 
	
for my $instpkg (@$remove_queue) {
	system("/sbin/removepkg $instpkg");
}

say "All operations completed successfully."