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.

153 lines
4.0 KiB

  1. #!/usr/bin/perl -w
  2. use strict;
  3. use English;
  4. my (@pkg, %opr, %pri, %dep, %rep, %rdp, %ign, %lop);
  5. my @useddeps; # deps used for visualization of cross dependencies
  6. my %pkg_redone; # packages built in stages 6-8
  7. foreach (@ARGV) { $ign{$_} = 1; }
  8. print "Reading package priorities ...\n";
  9. open(F, "./scripts/Create-PkgList |") || die $!;
  10. while (<F>) {
  11. @_ = split /\s+/;
  12. next if $_[1] =~ /[1234]/ or $_[1] !~ /5/;
  13. $pkg_redone{$_[4]} = 1 if $_[1] =~ /[678]/;
  14. next if defined $ign{$_[3]} || defined $ign{$_[4]};
  15. $opr{$_[4]} = $_[2];
  16. $pri{$_[4]} = $_[2];
  17. $rep{$_[4]} = $_[3];
  18. $pkg[$#pkg+1] = $_[4];
  19. }
  20. close F;
  21. print "Reading package dependencies ...\n";
  22. open(F, "scripts/dep_db.txt") || die $!;
  23. while (<F>) {
  24. chomp;
  25. if ( ! /^(\S+): \d+ \d+ (.*)$/ ) {
  26. print "Format Error: $_\n";
  27. exit 1;
  28. }
  29. next if defined $pkg_redone{$1};
  30. @{$dep{$1}} = split /\s+/, $2;
  31. foreach ( @{$dep{$1}} ) {
  32. $rdp{$_} = () unless defined $rdp{$_};
  33. push @{$rdp{$_}}, $1;
  34. }
  35. }
  36. close F;
  37. sub count_errs($) {
  38. my $package = $_[0];
  39. my $dependency;
  40. my $errors = 0;
  41. foreach $dependency (@{$dep{$package}}) {
  42. next unless defined $pri{$dependency};
  43. $errors++ if $pri{$package} < $pri{$dependency};
  44. }
  45. foreach $dependency (@{$rdp{$package}}) {
  46. next unless defined $pri{$dependency};
  47. $errors++ if $pri{$package} > $pri{$dependency};
  48. }
  49. return $errors;
  50. }
  51. my ($iteration, $package, $dependency, $a, $b);
  52. my $did_something=0;
  53. print "\nLoop Old/New Errors Package Dependency\n".
  54. "------------------------------------------------------------------------\n";
  55. for $iteration (1..99) {
  56. my $looplog = '';
  57. foreach $package (@pkg) {
  58. foreach $dependency (@{$dep{$package}}) {
  59. next unless defined $pri{$dependency};
  60. if ( $pri{$package} < $pri{$dependency} ) {
  61. $a = count_errs($package) + count_errs($dependency);
  62. $_ = $pri{$dependency};
  63. $pri{$dependency} = $pri{$package};
  64. $pri{$package} = $_;
  65. $b = count_errs($package) + count_errs($dependency);
  66. $looplog.="[$package,$dependency]";
  67. $_ = sprintf "[%02d] %-7d %-7d %-25s %s\n",
  68. $iteration, $a, $b, $pri{$dependency}." ".$package,
  69. $pri{$package}." ".$dependency;
  70. $useddeps[$iteration]{$package}{$dependency} = 1;
  71. s/ / . /g; s/\. /.. /g; s/\. /.. /g;
  72. s/\. (\s*)\./..$1./g; s/\. (\s*)\./..$1./g;
  73. print; $did_something=1;
  74. }
  75. }
  76. }
  77. last if $looplog eq "";
  78. if (defined $lop{$looplog}) {
  79. my %crossdeps;
  80. print "[XX] Detected endless-loop ".
  81. "(cross-dependency) -> Aborting now.\n";
  82. print "[XX] Debug graph printed to dependencies.dot.\n";
  83. foreach my $i ($lop{$looplog} .. $iteration) {
  84. foreach my $p (keys %{$useddeps[$i]}) {
  85. foreach my $d (keys %{$useddeps[$i]{$p}}) {
  86. $crossdeps{$d}{$p} = 1;
  87. }
  88. }
  89. }
  90. open(F, ">dependencies.dot") || die $!;
  91. print F "# run this thru e.g. 'dot -Tps dependencies.dot -o dependencies.ps'\n";
  92. print F "digraph \"Cross-Dependencies Graph\" {\n";
  93. foreach my $p (sort keys %crossdeps) {
  94. foreach my $d (sort keys %{$crossdeps{$p}}) {
  95. my $p_ = $p; $p_ =~ s/[^a-z0-9]/_/g;
  96. my $d_ = $d; $d_ =~ s/[^a-z0-9]/_/g;
  97. print F "\t$p_ -> $d_;\n";
  98. }
  99. }
  100. print F "}\n";
  101. close F;
  102. last;
  103. }
  104. $lop{$looplog} = $iteration;
  105. }
  106. if ( $did_something ) {
  107. print "\nCreate dependencies.patch ...\n";
  108. my $tmpfile = `mktemp`; chomp $tmpfile;
  109. unlink "dependencies.patch";
  110. foreach $package (@pkg) {
  111. if ($pri{$package} != $opr{$package}) {
  112. my $descfile = "package/$rep{$package}/".
  113. "$package/$package.desc";
  114. open(IN, $descfile) || die $!;
  115. open(OUT, ">$tmpfile") || die $!;
  116. $did_something = 0;
  117. my $re1 = "(\\[P\\] . \\S+) $opr{$package}";
  118. my $re2 = "\$1 $pri{$package}";
  119. while (<IN>) {
  120. $did_something = 1 if eval "s/$re1/$re2/";
  121. print OUT;
  122. }
  123. close IN; close OUT;
  124. if (not $did_something) {
  125. print "ERROR: Can't patch $descfile!\n";
  126. print "ERROR: Regex was s/$re1/$re2/\n";
  127. }
  128. system("diff -u0 ./$descfile $tmpfile >> dependencies.patch");
  129. }
  130. }
  131. unlink $tmpfile;
  132. print "Done. Please check moves manually bofore applying the patch.\n";
  133. } else {
  134. print "No unresolved dependencies found.\n";
  135. }