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.

185 lines
4.6 KiB

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