#!/usr/bin/perl use strict; use urpm; use urpm::msg; my %options = ( restrict_group => 0, group => 'System/Libraries', root => '', ); my $usage = N("usage: %s [options] where [options] are from ", $0) . N(" -h|--help - print this help message. ") . N(" --root - use the given root instead of / ") . N(" -g [group] - restrict results to specified group. ") . N(" defaults to %s. ", $options{group}) . N(" -f - output rpm full name (NVRA) "); my $urpm = urpm->new; while ($_ = shift) { $_ eq '--root' and do { my $root = shift; $root and urpm::set_files($urpm, $root); next; }; $_ eq '-g' and do { $options{restrict_group} = 1; next if !@ARGV || $ARGV[0] =~ /^-/; my $group = shift; $options{group} = $group; next; }; $_ eq '-f' and do { $options{fullname} = 1; next }; print $usage; exit 1; } my @packages; { my $db = urpm::db_open_or_die_($urpm) or die "Can't open RPM db\n"; $db->traverse(sub { my ($p) = @_; $p->pack_header; push @packages, $p; }); } my %l; my %provides; foreach my $pkg (@packages) { next if $options{restrict_group} && $pkg->group !~ /\Q$options{group}/oi; $l{$pkg->name} = $pkg; push @{$provides{$_}}, $pkg foreach $pkg->provides_nosense; } foreach my $pkg (@packages) { foreach my $prop ($pkg->requires) { my ($n, $s) = URPM::property2name_range($prop); foreach my $p (@{$provides{$n} || []}) { $p != $pkg && $p->provides_overlap($prop) and delete $l{$p->name}; } } } if ($options{fullname}) { foreach my $k (sort keys %l) { my $l = $l{$k}; print $l->name, '-', $l->version, '-', $l->release, '.', $l->arch, "\n"; } } else { print "$_\n" foreach sort keys %l; }