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.

211 lines
4.8 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 - 2003 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 -n "Creating dependency database ..." >&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,^.*/([^/]*)/[^/]*$,$1,;
  72. my %deps = ();
  73. $deps{$_} = 1 foreach (keys %{$adddeps{$pkg}});
  74. open(F, "$c") or die "$!: $c";
  75. while (<F>) {
  76. if (/^\[BUILDTIME\]/) {
  77. @_ = split /\s+/;
  78. $time = $_[1];
  79. next;
  80. }
  81. if (/^\[DEP\]/) {
  82. @_ = split /\s+/; shift @_;
  83. foreach (@_) { $deps{$_} = 1 unless defined $deldeps{$pkg}{$_}; }
  84. next;
  85. }
  86. }
  87. close F;
  88. $c =~ s/\.cache$/.desc/;
  89. open(F, "$c") or die "$!: $c";
  90. while (<F>) {
  91. if (/^\[(P|PRI|PRIORITY)\]/) {
  92. @_ = split /\s+/;
  93. $_[2] =~ s/^.*([0-8]).*$/$1/;
  94. $pri = $_[2].".".$_[3];
  95. next;
  96. }
  97. }
  98. close F;
  99. '"$perl1 $perl2"'
  100. print "$pkg $time $pri ", join(" ", sort keys %deps), " $pkg\n";
  101. }
  102. ' | gawk '
  103. function getpri(package) {
  104. datafile="'$tmp1'";
  105. delete todo;
  106. delete done;
  107. todo[ package ] = 1;
  108. returncode=0;
  109. endloop=0;
  110. level=0;
  111. if (debug != "") {
  112. print "";
  113. print "Creating priority for " package " ...";
  114. }
  115. while ( ! endloop ) {
  116. endloop=1; level++;
  117. for (pkg in todo) {
  118. endloop=0;
  119. delete todo[pkg];
  120. done[pkg] = 1;
  121. firstdebug=1;
  122. for (nextpkg in database) {
  123. if ( index(database[nextpkg], " " pkg " ") ) {
  124. if ( ! (nextpkg in done) &&
  125. ! (nextpkg in todo) &&
  126. ! (nextpkg in ignore) ) {
  127. if ("x" orderdb[nextpkg] < "x" orderdb[pkg]) {
  128. if (debug != "") {
  129. if (firstdebug)
  130. print "\n\t(" level ") Found " \
  131. "dependencies for " pkg ":";
  132. print "\t\t" pkg ": " \
  133. "required by " nextpkg \
  134. " (ignore reverse dep)";
  135. firstdebug=0;
  136. }
  137. } else {
  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. firstdebug=0;
  145. }
  146. todo[nextpkg] = 1;
  147. returncode++;
  148. }
  149. }
  150. }
  151. }
  152. }
  153. }
  154. return returncode;
  155. }
  156. BEGIN {
  157. counter=0;
  158. debug="'$debug'";
  159. }
  160. {
  161. orderdb[$1]=$3; $3=0;
  162. database[$1]=$0;
  163. if (NF > 102) {
  164. printf "\rPackage %s has %d dependencies. I don'\''t " \
  165. "believe this.\n", $1, NF - 3 > "/dev/stderr";
  166. ignore[$1] = 1;
  167. }
  168. counter++;
  169. }
  170. END {
  171. if (debug != "") {
  172. pri=getpri(debug);
  173. print "\nResulting Priority: " pri;
  174. } else {
  175. for (package in database) {
  176. printf "\rCreating dependency database (" \
  177. counter ") ... \b" > "/dev/stderr";
  178. $0 = database[package]; $3 = getpri(package);
  179. $1 = $1 ":"; print; counter--;
  180. }
  181. print "\rCreating dependency database ... " \
  182. "done." > "/dev/stderr";
  183. }
  184. }
  185. ' | if [ "$debug" ] ; then cat ; else sort ; fi