|
|
#!/bin/bash # # --- ROCK-COPYRIGHT-NOTE-BEGIN --- # # This copyright note is auto-generated by ./scripts/Create-CopyPatch. # Please add additional copyright information _after_ the line containing # the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by # the ./scripts/Create-CopyPatch script. Do not edit this copyright text! # # ROCK Linux: rock-src/scripts/Create-DepDB # ROCK Linux is Copyright (C) 1998 - 2003 Clifford Wolf # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. A copy of the GNU General Public # License can be found at Documentation/COPYING. # # Many people helped and are helping developing ROCK Linux. Please # have a look at http://www.rocklinux.org/ and the Documentation/TEAM # file for details. # # --- ROCK-COPYRIGHT-NOTE-END ---
cachedir="package" descdir="package" debug=''
while [ "$1" ] ; do case "$1" in -cachedir) cachedir=$2 ; shift ; shift ;; -descdir) descdir=$2 ; shift ; shift ;; -debug) debug=$2 ; shift ; shift ;; *) echo "Usage: $0 [ -cachedir cachedir ] [ -descdir descdir ] \\" echo " ${0//?/ } [ -debug pkg ] > filename" exit 1 ;; esac done
echo -n "Creating dependency database ..." >&2
perl1="" perl2="" while read package command args; do package=${package%.desc:*} package=${package##*/} ; set -- $args
perl1="$perl1 if (defined \$deps{'$package'}) {" for x; do perl1="$perl1 \$deps{$x} = 1;"; done for x; do perl2="$perl2 \$deps{$package} = 1 if defined \$deps{$x};"; done perl1="$perl1 }" done < <( egrep '^\[(E|DEP|DEPENDENCY)\][ ]+group[ ]' $descdir/*/*/*.desc )
perl -e '
my %deldeps = (); my %adddeps = ();
# open(F, "scripts/dep_fixes.txt") or die $!; # while (<F>) { # chomp; # if (/^([^#\s]\S*)\s+del\s+(.*)$/) { # my ($p, $l) = ($1, $2); # $deldeps{$p}{$_} = 1 foreach (split /\s+/, $l); # next; # } # if (/^([^#\s]\S*)\s+add\s+(.*)$/) { # my ($p, $l) = ($1, $2); # $adddeps{$p}{$_} = 1 foreach (split /\s+/, $l); # next; # } # } # close F;
foreach my $c (<'$cachedir'/*/*/*.cache>) { my ($pri, $time) = (1, 1); my $pkg = $c; $pkg=~s,^.*/([^/]*)/[^/]*$,$1,; my %deps = ();
$deps{$_} = 1 foreach (keys %{$adddeps{$pkg}});
open(F, "$c") or die "$!: $c"; while (<F>) { if (/^\[BUILDTIME\]/) { @_ = split /\s+/; $time = $_[1]; next; } if (/^\[DEP\]/) { @_ = split /\s+/; shift @_; foreach (@_) { $deps{$_} = 1 unless defined $deldeps{$pkg}{$_}; } next; } } close F;
$c =~ s/\.cache$/.desc/; open(F, "$c") or die "$!: $c"; while (<F>) { if (/^\[(P|PRI|PRIORITY)\]/) { @_ = split /\s+/; $_[2] =~ s/^.*([0-8]).*$/$1/; $pri = $_[2].".".$_[3]; next; } } close F;
'"$perl1 $perl2"'
print "$pkg $time $pri ", join(" ", sort keys %deps), " $pkg\n"; }
' | gawk '
function getpri(package) { datafile="'$tmp1'";
delete todo; delete done; todo[ package ] = 1; returncode=0; endloop=0; level=0;
if (debug != "") { print ""; print "Creating priority for " package " ..."; }
while ( ! endloop ) { endloop=1; level++; for (pkg in todo) { endloop=0; delete todo[pkg]; done[pkg] = 1; firstdebug=1;
for (nextpkg in database) { if ( index(database[nextpkg], " " pkg " ") ) { if ( ! (nextpkg in done) && ! (nextpkg in todo) && ! (nextpkg in ignore) ) { if ("x" orderdb[nextpkg] < "x" orderdb[pkg]) { if (debug != "") { if (firstdebug) print "\n\t(" level ") Found " \ "dependencies for " pkg ":"; print "\t\t" pkg ": " \ "required by " nextpkg \ " (ignore reverse dep)"; firstdebug=0; } } else { if (debug != "") { if (firstdebug) print "\n\t(" level ") Found " \ "dependencies for " pkg ":"; print "\t\t" pkg ": " \ "required by " nextpkg; firstdebug=0; } todo[nextpkg] = 1; returncode++; } } } } } }
return returncode; }
BEGIN { counter=0; debug="'$debug'"; }
{ orderdb[$1]=$3; $3=0; database[$1]=$0; if (NF > 102) { printf "\rPackage %s has %d dependencies. I don'\''t " \ "believe this.\n", $1, NF - 3 > "/dev/stderr"; ignore[$1] = 1; } counter++; }
END { if (debug != "") { pri=getpri(debug); print "\nResulting Priority: " pri; } else { for (package in database) { printf "\rCreating dependency database (" \ counter ") ... \b" > "/dev/stderr"; $0 = database[package]; $3 = getpri(package); $1 = $1 ":"; print; counter--; }
print "\rCreating dependency database ... " \ "done." > "/dev/stderr"; } } ' | if [ "$debug" ] ; then cat ; else sort ; fi
|