summaryrefslogtreecommitdiffstats
path: root/rpme
diff options
context:
space:
mode:
Diffstat (limited to 'rpme')
-rw-r--r--rpme68
1 files changed, 68 insertions, 0 deletions
diff --git a/rpme b/rpme
new file mode 100644
index 00000000..a4a8cb99
--- /dev/null
+++ b/rpme
@@ -0,0 +1,68 @@
+#!/usr/bin/perl
+
+local $_ = join '', @ARGV;
+
+/-h/ || @ARGV == 0 and die "usage: rpme [-a] [--auto] <packages...>\n";
+
+$matches = /-a/;
+$auto = /-auto/;
+
+my $DIR = "/var/lib/urpmi";
+
+@l = grep { !/^-/ } @ARGV;
+if (!$matches) {
+ @m = map { chop; $_ } `rpm -q @l 2>&1`;
+ if ($?) {
+ $maymatch = "unknown package(s) " . join(", ", map { /package (\S+) is not installed/ ? $1 : () } @m) . "\n";
+ $auto || @l > 1 and die $maymatch;
+ }
+}
+if ($matches || $maymatch) {
+ my $match = join "|", @l;
+ @m = grep { /$match/ } map { chop; $_ } `rpm -qa`;
+
+ if ($maymatch) {
+ @m or die $maymatch;
+ print "Using $match as a substring, I found:\n@m\nRemove them all? (y/N) ";
+ <STDIN> =~ /y/i or exit 1;
+ }
+}
+
+load_provides();
+my %toremove; @toremove{$_, @{$provides{$_} || []}} = () foreach @m;
+my $changed = 1; while ($changed) { $changed = 0;
+ local *F;
+ open F, "rpm -e --test " . join(" ", keys %toremove) . " 2>&1 |";
+ foreach (<F>) {
+ if (/package (\S+) is not installed/) {
+ delete $toremove{$1};
+ } elsif (/is needed by (\S+)/ && ! exists $toremove{$1}) {
+ $toremove{$1} = 1;
+ $changed = 1;
+ }
+ }
+}
+my @toremove = keys %toremove or die "nothing to remove\n";
+if (@toremove > @l && !$auto) {
+ my $sum = 0; map { $sum += $_ } `rpm -q --queryformat "%{SIZE}\n" @toremove`;
+ print "To satisfy dependencies, the following packages are going to be removed";
+ printf " (%d MB)", toMb($sum);
+ print ":\n@toremove\nIs it ok? (Y/n) ";
+ <STDIN> =~ /n/i and exit 0;
+}
+system("rpm", "-e", @toremove);
+
+
+sub load_provides {
+ local *F;
+ open F, "$DIR/depslist" or return;
+ foreach (<F>) {
+ my ($p, $size, @l) = split;
+ $size{$p} = $size;
+ push @{$provides{$_}}, $p foreach @l;
+ }
+}
+sub toMb {
+ my $nb = $_[0] / 1024 / 1024;
+ int $nb + 0.5;
+}