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.

223 lines
5.1 KiB

  1. #!/bin/bash
  2. #
  3. # --- ROCK-COPYRIGHT-NOTE-BEGIN ---
  4. #
  5. # This copyright note is auto-generated by ./scripts/Create-CopyPatch.
  6. # Please add additional copyright information _after_ the line containing
  7. # the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by
  8. # the ./scripts/Create-CopyPatch script. Do not edit this copyright text!
  9. #
  10. # ROCK Linux: rock-src/scripts/Create-DepDB
  11. # ROCK Linux is Copyright (C) 1998 - 2004 Clifford Wolf
  12. #
  13. # This program is free software; you can redistribute it and/or modify
  14. # it under the terms of the GNU General Public License as published by
  15. # the Free Software Foundation; either version 2 of the License, or
  16. # (at your option) any later version. A copy of the GNU General Public
  17. # License can be found at Documentation/COPYING.
  18. #
  19. # Many people helped and are helping developing ROCK Linux. Please
  20. # have a look at http://www.rocklinux.org/ and the Documentation/TEAM
  21. # file for details.
  22. #
  23. # --- ROCK-COPYRIGHT-NOTE-END ---
  24. cachedir="package"
  25. descdir="package"
  26. debug=''
  27. while [ "$1" ] ; do
  28. case "$1" in
  29. -cachedir)
  30. cachedir=$2 ; shift ; shift ;;
  31. -descdir)
  32. descdir=$2 ; shift ; shift ;;
  33. -debug)
  34. debug=$2 ; shift ; shift ;;
  35. *)
  36. echo "Usage: $0 [ -cachedir cachedir ] [ -descdir descdir ] \\"
  37. echo " ${0//?/ } [ -debug pkg ] > filename"
  38. exit 1 ;;
  39. esac
  40. done
  41. echo "Reading *.cache and *.desc files ..." >&2
  42. perl1="" perl2=""
  43. while read package command args; do
  44. package=${package%.desc:*}
  45. package=${package##*/} ; set -- $args
  46. perl1="$perl1 if (defined \$deps{'$package'}) {"
  47. for x; do perl1="$perl1 \$deps{$x} = 1;"; done
  48. for x; do perl2="$perl2 \$deps{$package} = 1 if defined \$deps{$x};"; done
  49. perl1="$perl1 }"
  50. done < <( egrep '^\[(E|DEP|DEPENDENCY)\][ ]+group[ ]' $descdir/*/*/*.desc )
  51. perl -e '
  52. my %deldeps = ();
  53. my %adddeps = ();
  54. # open(F, "scripts/dep_fixes.txt") or die $!;
  55. # while (<F>) {
  56. # chomp;
  57. # if (/^([^#\s]\S*)\s+del\s+(.*)$/) {
  58. # my ($p, $l) = ($1, $2);
  59. # $deldeps{$p}{$_} = 1 foreach (split /\s+/, $l);
  60. # next;
  61. # }
  62. # if (/^([^#\s]\S*)\s+add\s+(.*)$/) {
  63. # my ($p, $l) = ($1, $2);
  64. # $adddeps{$p}{$_} = 1 foreach (split /\s+/, $l);
  65. # next;
  66. # }
  67. # }
  68. # close F;
  69. foreach my $c (<'$cachedir'/*/*/*.cache>) {
  70. my ($pri, $time) = (1, 1);
  71. my $pkg = $c; $pkg=~s,^.*/([^/]*)\.cache$,$1,;
  72. my $found_dep_entries = 0;
  73. my %deps = ();
  74. my $d = $c;
  75. $d =~ s,([^/]*)/[^/]*\.cache$,$1/$1.desc,;
  76. $d =~ s,^'$cachedir','$descdir',;
  77. if ( ! -f $d ) {
  78. print STDERR "WARNING: Can'\''t find $d -> skipping $c.\n";
  79. next;
  80. }
  81. $deps{$_} = 1 foreach (keys %{$adddeps{$pkg}});
  82. open(F, "$c") or die "$!: $c";
  83. while (<F>) {
  84. if (/^\[BUILDTIME\]/) {
  85. @_ = split /\s+/;
  86. $time = $_[1];
  87. next;
  88. }
  89. if (/^\[DEP\]/) {
  90. @_ = split /:\S+\s+|\s+/; shift @_;
  91. foreach (@_) { $deps{$_} = 1 unless defined $deldeps{$pkg}{$_}; }
  92. $found_dep_entries = 1;
  93. next;
  94. }
  95. }
  96. close F;
  97. # no dep_db entry if this package failed in ref build
  98. next unless $found_dep_entries;
  99. open(F, "$d") or die "$!: $d";
  100. while (<F>) {
  101. if (/^\[(P|PRI|PRIORITY)\]/) {
  102. @_ = split /\s+/;
  103. $_[2] =~ s/^.*([0-8]).*$/$1/;
  104. $pri = $_[2].".".$_[3];
  105. next;
  106. }
  107. }
  108. close F;
  109. '"$perl1 $perl2"'
  110. print "$pkg $time $pri ", join(" ", sort keys %deps), " $pkg\n";
  111. }
  112. ' | gawk '
  113. function getpri(package) {
  114. datafile="'$tmp1'";
  115. delete todo;
  116. delete done;
  117. todo[ package ] = 1;
  118. returncode=0;
  119. endloop=0;
  120. level=0;
  121. if (debug != "") {
  122. print "";
  123. print "Creating priority for " package " ...";
  124. }
  125. while ( ! endloop ) {
  126. endloop=1; level++;
  127. for (pkg in todo) {
  128. endloop=0;
  129. delete todo[pkg];
  130. done[pkg] = 1;
  131. firstdebug=1;
  132. for (nextpkg in database) {
  133. if ( index(database[nextpkg], " " pkg " ") ) {
  134. if ( ! (nextpkg in done) &&
  135. ! (nextpkg in todo) &&
  136. ! (nextpkg in ignore) ) {
  137. if ("x" orderdb[nextpkg] < "x" orderdb[pkg]) {
  138. if (debug != "") {
  139. if (firstdebug)
  140. print "\n\t(" level ") Found " \
  141. "dependencies for " pkg ":";
  142. print "\t\t" pkg ": " \
  143. "required by " nextpkg \
  144. " (ignore reverse dep)";
  145. firstdebug=0;
  146. }
  147. } else {
  148. if (debug != "") {
  149. if (firstdebug)
  150. print "\n\t(" level ") Found " \
  151. "dependencies for " pkg ":";
  152. print "\t\t" pkg ": " \
  153. "required by " nextpkg;
  154. firstdebug=0;
  155. }
  156. todo[nextpkg] = 1;
  157. returncode++;
  158. }
  159. }
  160. }
  161. }
  162. }
  163. }
  164. return returncode;
  165. }
  166. BEGIN {
  167. counter=0;
  168. debug="'$debug'";
  169. }
  170. {
  171. orderdb[$1]=$3; $3=0;
  172. database[$1]=$0;
  173. if (NF > 120) {
  174. printf "\rPackage %s has %d dependencies. I don'\''t " \
  175. "believe this.\n", $1, NF - 3 > "/dev/stderr";
  176. ignore[$1] = 1;
  177. }
  178. counter++;
  179. }
  180. END {
  181. if (debug != "") {
  182. pri=getpri(debug);
  183. print "\nResulting Priority: " pri;
  184. } else {
  185. for (package in database) {
  186. printf "\rCreating dependency database (" \
  187. counter ") ... \b" > "/dev/stderr";
  188. $0 = database[package]; $3 = getpri(package);
  189. $1 = $1 ":"; print; counter--;
  190. }
  191. print "\rCreating dependency database ... " \
  192. "done." > "/dev/stderr";
  193. }
  194. }
  195. ' | if [ "$debug" ] ; then cat ; else sort ; fi