#!/usr/bin/perl local $_ = join '', @ARGV; /-h/ || @ARGV == 0 and die "usage: rpme [-a] [--auto] \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) "; =~ /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 () { 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) "; =~ /n/i and exit 0; } system("rpm", "-e", @toremove); sub load_provides { local *F; open F, "$DIR/depslist" or return; foreach () { my ($p, $size, @l) = split; $size{$p} = $size; push @{$provides{$_}}, $p foreach @l; } } sub toMb { my $nb = $_[0] / 1024 / 1024; int $nb + 0.5; }