#!/usr/bin/perl -w
|
|
|
|
use strict;
|
|
use English;
|
|
|
|
my (@pkg, %opr, %pri, %dep, %rep, %rdp, %ign, %lop);
|
|
|
|
foreach (@ARGV) { $ign{$_} = 1; }
|
|
|
|
print "Reading package priorities ...\n";
|
|
open(F, "./scripts/Create-PkgList |") || die $!;
|
|
while (<F>) {
|
|
@_ = split /\s+/;
|
|
next unless $_[1] eq "-----5---9";
|
|
next if defined $ign{$_[3]} || defined $ign{$_[4]};
|
|
$opr{$_[4]} = $_[2];
|
|
$pri{$_[4]} = $_[2];
|
|
$rep{$_[4]} = $_[3];
|
|
$pkg[$#pkg+1] = $_[4];
|
|
}
|
|
close F;
|
|
|
|
print "Reading package dependencies ...\n";
|
|
open(F, "scripts/dep_db.txt") || die $!;
|
|
while (<F>) {
|
|
chomp;
|
|
if ( ! /^(\S+): \d+ \d+ (.*)$/ ) {
|
|
print "Format Error: $_\n";
|
|
exit 1;
|
|
}
|
|
@{$dep{$1}} = split /\s+/, $2;
|
|
foreach ( @{$dep{$1}} ) {
|
|
$rdp{$_} = () unless defined $rdp{$_};
|
|
push @{$rdp{$_}}, $1;
|
|
}
|
|
}
|
|
close F;
|
|
|
|
sub count_errs($) {
|
|
my $package = $_[0];
|
|
my $dependency;
|
|
my $errors = 0;
|
|
|
|
foreach $dependency (@{$dep{$package}}) {
|
|
next unless defined $pri{$dependency};
|
|
$errors++ if $pri{$package} < $pri{$dependency};
|
|
}
|
|
foreach $dependency (@{$rdp{$package}}) {
|
|
next unless defined $pri{$dependency};
|
|
$errors++ if $pri{$package} > $pri{$dependency};
|
|
}
|
|
|
|
return $errors;
|
|
}
|
|
|
|
my ($interation, $package, $dependency, $a, $b);
|
|
my $did_something=0;
|
|
|
|
print "\nLoop Old/New Errors Package Dependency\n".
|
|
"------------------------------------------------------------------------\n";
|
|
|
|
for $interation (1..99) {
|
|
my $looplog = '';
|
|
foreach $package (@pkg) {
|
|
foreach $dependency (@{$dep{$package}}) {
|
|
next unless defined $pri{$dependency};
|
|
if ( $pri{$package} < $pri{$dependency} ) {
|
|
$a = count_errs($package) + count_errs($dependency);
|
|
$_ = $pri{$dependency};
|
|
$pri{$dependency} = $pri{$package};
|
|
$pri{$package} = $_;
|
|
$b = count_errs($package) + count_errs($dependency);
|
|
|
|
$looplog.="[$package,$dependency]";
|
|
|
|
$_ = sprintf "[%02d] %-7d %-7d %-25s %s\n",
|
|
$interation, $a, $b, $pri{$dependency}." ".$package,
|
|
$pri{$package}." ".$dependency;
|
|
s/ / . /g; s/\. /.. /g; s/\. /.. /g;
|
|
s/\. (\s*)\./..$1./g; s/\. (\s*)\./..$1./g;
|
|
print; $did_something=1;
|
|
}
|
|
}
|
|
}
|
|
last if $looplog eq "";
|
|
if (defined $lop{$looplog}) {
|
|
print "[XX] Detected endless-loop ".
|
|
"(cross-dependency) -> Aborting now.\n";
|
|
last;
|
|
}
|
|
$lop{$looplog} = 1;
|
|
}
|
|
|
|
if ( $did_something ) {
|
|
print "\nCreate dependencies.patch ...\n";
|
|
my $tmpfile = `mktemp`; chomp $tmpfile;
|
|
unlink "dependencies.patch";
|
|
|
|
foreach $package (@pkg) {
|
|
if ($pri{$package} != $opr{$package}) {
|
|
my $descfile = "package/$rep{$package}/".
|
|
"$package/$package.desc";
|
|
open(IN, $descfile) || die $!;
|
|
open(OUT, ">$tmpfile") || die $!;
|
|
$did_something = 0;
|
|
my $re1 = "(\\[P\\] . \\S+) $opr{$package}";
|
|
my $re2 = "\$1 $pri{$package}";
|
|
while (<IN>) {
|
|
$did_something = 1 if eval "s/$re1/$re2/";
|
|
print OUT;
|
|
}
|
|
close IN; close OUT;
|
|
if (not $did_something) {
|
|
print "ERROR: Can't patch $descfile!\n";
|
|
print "ERROR: Regex was s/$re1/$re2/\n";
|
|
}
|
|
system("diff -u0 ./$descfile $tmpfile >> dependencies.patch");
|
|
}
|
|
}
|
|
unlink $tmpfile;
|
|
print "Done. Please check moves manually bofore applying the patch.\n";
|
|
} else {
|
|
print "No unresolved dependencies found.\n";
|
|
}
|