#! /usr/bin/perl # # Copyright (c) 2003 by Andrew E. Mileski # # This is currently just a hack. Yes, it's ugly. use strict; my @names; my %name2rpm; sub nameget { my $rpm; my $name; open NAMES, '<../rpmget/names' || die "Can't find names list\n"; while ($_ = ) { chomp; m/(\S+) (\S+)/; $name = $1; $rpm = $2; $name2rpm{$name} = $rpm; push @names, $name; } close NAMES; } sub rpmget { my $filename = $_[0]; my $rpm = ''; my $found = 0; unless ($found) { for $rpm (@names) { if ($rpm eq $filename) { $found = 1; $rpm = $name2rpm{$rpm}; return $rpm; } } } unless ($found) { open PROVIDES, '<../rpmget/provides' || die "Can't find provides list\n"; while ($_ = ) { chomp; s/^\s+//; s/\s+$//; if (m/^# ([0-9]+) (.*)/) { $rpm = $2; next; } my $basename = $_; $basename = $1 if (m#([^/]+)$#); s/ = .*// if ($basename =~ m/ = /); if ($basename eq $filename) { $found = 1; last; } } close PROVIDES; } unless ($found) { open FILES, '<../rpmget/files' || die "Can't find files list\n"; while ($_ = ) { chomp; s/\s+$//; if (m/^# ([0-9]+) (.*)/) { $rpm = $2; next; } m#([^/ ]+)$#; if ($1 eq $filename) { $found = 1; last; } } close FILES; } die "Can't find rpm for $filename\n" unless ($found); return $rpm; } my $list = ''; my $rpm = $ARGV[0]; my @result; my $dep; my $lastdep = ''; nameget(); die "Can't find RPM \"$rpm\"\n" unless (-f $rpm); my ($name, $version, $release); @result = `rpm -qp --qf='%{NAME} %{VERSION} %{RELEASE}\n' $rpm`; chomp $result[0]; $result[0] =~ m/(\S+) (\S+) (\S+)/; $name = $1; $version = $2; $release = $3; @result = `rpm -q $name 2>&1`; die "Already installed\n" if ($result[0] =~ m/\Q$name-$version-$release\E/); while (1) { $list = "$list $rpm"; @result = `rpm -i $list 2>&1 && echo done`; last if ($result[0] =~ m/^done/); shift @result; for $dep (@result) { $dep =~ m/^\s*(\S+)/; $rpm = rpmget($1); next if ($list =~ m/\Q$rpm\E/); $lastdep = $rpm; last; } print "Adding dependency $rpm\n"; } print "rpm -i $list\n";