mirror of the now-defunct rocklinux.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
3.1 KiB

  1. #!/usr/bin/perl -w
  2. use strict;
  3. use English;
  4. my (@pkg, %opr, %pri, %dep, %rep, %rdp, %ign, %lop);
  5. foreach (@ARGV) { $ign{$_} = 1; }
  6. print "Reading package priorities ...\n";
  7. open(F, "./scripts/Create-PkgList |") || die $!;
  8. while (<F>) {
  9. @_ = split /\s+/;
  10. next unless $_[1] eq "-----5---9";
  11. next if defined $ign{$_[3]} || defined $ign{$_[4]};
  12. $opr{$_[4]} = $_[2];
  13. $pri{$_[4]} = $_[2];
  14. $rep{$_[4]} = $_[3];
  15. $pkg[$#pkg+1] = $_[4];
  16. }
  17. close F;
  18. print "Reading package dependencies ...\n";
  19. open(F, "scripts/dep_db.txt") || die $!;
  20. while (<F>) {
  21. chomp;
  22. if ( ! /^(\S+): \d+ \d+ (.*)$/ ) {
  23. print "Format Error: $_\n";
  24. exit 1;
  25. }
  26. @{$dep{$1}} = split /\s+/, $2;
  27. foreach ( @{$dep{$1}} ) {
  28. $rdp{$_} = () unless defined $rdp{$_};
  29. push @{$rdp{$_}}, $1;
  30. }
  31. }
  32. close F;
  33. sub count_errs($) {
  34. my $package = $_[0];
  35. my $dependency;
  36. my $errors = 0;
  37. foreach $dependency (@{$dep{$package}}) {
  38. next unless defined $pri{$dependency};
  39. $errors++ if $pri{$package} < $pri{$dependency};
  40. }
  41. foreach $dependency (@{$rdp{$package}}) {
  42. next unless defined $pri{$dependency};
  43. $errors++ if $pri{$package} > $pri{$dependency};
  44. }
  45. return $errors;
  46. }
  47. my ($interation, $package, $dependency, $a, $b);
  48. my $did_something=0;
  49. print "\nLoop Old/New Errors Package Dependency\n".
  50. "------------------------------------------------------------------------\n";
  51. for $interation (1..99) {
  52. my $looplog = '';
  53. foreach $package (@pkg) {
  54. foreach $dependency (@{$dep{$package}}) {
  55. next unless defined $pri{$dependency};
  56. if ( $pri{$package} < $pri{$dependency} ) {
  57. $a = count_errs($package) + count_errs($dependency);
  58. $_ = $pri{$dependency};
  59. $pri{$dependency} = $pri{$package};
  60. $pri{$package} = $_;
  61. $b = count_errs($package) + count_errs($dependency);
  62. $looplog.="[$package,$dependency]";
  63. $_ = sprintf "[%02d] %-7d %-7d %-25s %s\n",
  64. $interation, $a, $b, $pri{$dependency}." ".$package,
  65. $pri{$package}." ".$dependency;
  66. s/ / . /g; s/\. /.. /g; s/\. /.. /g;
  67. s/\. (\s*)\./..$1./g; s/\. (\s*)\./..$1./g;
  68. print; $did_something=1;
  69. }
  70. }
  71. }
  72. last if $looplog eq "";
  73. if (defined $lop{$looplog}) {
  74. print "[XX] Detected endless-loop ".
  75. "(cross-dependency) -> Aborting now.\n";
  76. last;
  77. }
  78. $lop{$looplog} = 1;
  79. }
  80. if ( $did_something ) {
  81. print "\nCreate dependencies.patch ...\n";
  82. my $tmpfile = `mktemp`; chomp $tmpfile;
  83. unlink "dependencies.patch";
  84. foreach $package (@pkg) {
  85. if ($pri{$package} != $opr{$package}) {
  86. my $descfile = "package/$rep{$package}/".
  87. "$package/$package.desc";
  88. open(IN, $descfile) || die $!;
  89. open(OUT, ">$tmpfile") || die $!;
  90. $did_something = 0;
  91. my $re1 = "(\\[P\\] . \\S+) $opr{$package}";
  92. my $re2 = "\$1 $pri{$package}";
  93. while (<IN>) {
  94. $did_something = 1 if eval "s/$re1/$re2/";
  95. print OUT;
  96. }
  97. close IN; close OUT;
  98. if (not $did_something) {
  99. print "ERROR: Can't patch $descfile!\n";
  100. print "ERROR: Regex was s/$re1/$re2/\n";
  101. }
  102. system("diff -u0 ./$descfile $tmpfile >> dependencies.patch");
  103. }
  104. }
  105. unlink $tmpfile;
  106. print "Done. Please check moves manually bofore applying the patch.\n";
  107. } else {
  108. print "No unresolved dependencies found.\n";
  109. }