#!/usr/bin/perl use RPM::Database; use strict; my $db = RPM::Database->new; my %DB; # load Requires: and Provides: from RPM database for the given packages foreach my $pkg (@ARGV) { my $hdr = $$db{$pkg}; unless ($hdr) { warn "package $pkg not found\n"; next; } my $requires = $$hdr{REQUIRENAME}; if ($requires) { $DB{$pkg}{req} = $requires; } else { warn "package $pkg requires nothing\n"; $DB{$pkg}{req} = []; } my $provides = $$hdr{PROVIDES}; if ($provides) { $DB{$pkg}{prov} = $provides; } else { warn "package $pkg provides nothing\n"; $DB{$pkg}{prov} = []; } } use sort 'stable'; # try to optimize out packages with shortest names first # alphabetical order is also in effect my @packages = sort { length($a) <=> length($b) } sort keys %DB; try: while (1) { foreach my $pkg (@packages) { my @rest = grep { $_ ne $pkg } @packages; if (my ($who, $what) = implies($pkg, @rest)) { warn "\t$who requires $pkg" . ($what eq $pkg ? "\n" : " through $what\n"); warn "\t\t$pkg optimized out\n"; @packages = @rest; next try; } } last; } @packages = sort @packages; print "@packages\n"; sub implies { my ($pkg, @others) = @_; foreach my $prov (@{$DB{$pkg}{prov}}) { foreach my $who (@others) { foreach my $req (@{$DB{$who}{req}}) { return ($who, $req) if ($req eq $prov); } } } return; }