diff options
author | Pascal Rigaux <pixel@mandriva.com> | 2000-03-26 17:24:04 +0000 |
---|---|---|
committer | Pascal Rigaux <pixel@mandriva.com> | 2000-03-26 17:24:04 +0000 |
commit | a982d562a19e1bf9d421cc64127635e403dd3f39 (patch) | |
tree | 0d50576692fb37646fb5c4fd837e55eab88f7f7f /rpme | |
parent | e922549802d625842f87ce2e1857685074f6b344 (diff) | |
download | urpmi-a982d562a19e1bf9d421cc64127635e403dd3f39.tar urpmi-a982d562a19e1bf9d421cc64127635e403dd3f39.tar.gz urpmi-a982d562a19e1bf9d421cc64127635e403dd3f39.tar.bz2 urpmi-a982d562a19e1bf9d421cc64127635e403dd3f39.tar.xz urpmi-a982d562a19e1bf9d421cc64127635e403dd3f39.zip |
no_comment
Diffstat (limited to 'rpme')
-rw-r--r-- | rpme | 68 |
1 files changed, 68 insertions, 0 deletions
@@ -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; +} |