1 | #!/usr/bin/perl |
---|
2 | |
---|
3 | use strict; |
---|
4 | |
---|
5 | my $a = shift @ARGV or usage(); |
---|
6 | getdeps($a, \@ARGV); |
---|
7 | |
---|
8 | exit; |
---|
9 | |
---|
10 | sub usage{ |
---|
11 | print " |
---|
12 | usage: |
---|
13 | $0 basedir packages_list\n |
---|
14 | "; |
---|
15 | exit |
---|
16 | } |
---|
17 | |
---|
18 | sub getdeps{ |
---|
19 | my ($topdir,$listrpms) = @_; |
---|
20 | my ($pkg,$name,$deps) = gendeps($topdir); |
---|
21 | $listrpms = deps($pkg,$name,$deps,[0,$listrpms],1); |
---|
22 | foreach (@{$listrpms->[1]}) { ref $_ and print "@$_\n" or print "$_\n"} |
---|
23 | } |
---|
24 | |
---|
25 | sub gendeps{ |
---|
26 | my ($topdir) = @_; |
---|
27 | my %log; |
---|
28 | -f "$topdir/depslist.ordered" or die "cannot find $topdir/depslist.ordered\n"; |
---|
29 | open DEP, "$topdir/depslist.ordered"; |
---|
30 | |
---|
31 | print LOG "getting dependencies\n"; |
---|
32 | my @deps; |
---|
33 | my @rdeps; |
---|
34 | my %pkg; |
---|
35 | my $i = 0; |
---|
36 | my @name; |
---|
37 | foreach (<DEP>){ |
---|
38 | chomp; |
---|
39 | my ($name, $size, @de) = split " ", $_; |
---|
40 | ($name, my $version, my $release) = $name =~ /(.*)-([^-]*)-([^-]*)/; |
---|
41 | if ($name){ |
---|
42 | foreach my $d (@de) { |
---|
43 | if ($d =~ s/^NOTFOUND_//) { |
---|
44 | push @{$log{"$name"}}, $d; |
---|
45 | }else{ |
---|
46 | if ($d =~ /\|/){ |
---|
47 | my @t = split '\|',$d ; my @u; |
---|
48 | foreach my $t (@t) { if ($t =~ s/NOTFOUND_//) {push @{$log{"$name"}}, $d} else { push @u, $t; push @{$rdeps[$t]}, $i} } |
---|
49 | push @{$deps[$i]}, \@u |
---|
50 | }else { push @{$deps[$i]}, $d; push @{$rdeps[$d]}, $i} |
---|
51 | } |
---|
52 | } |
---|
53 | $name[$i] = $name; |
---|
54 | $pkg{$name} = $i; |
---|
55 | $i++; |
---|
56 | } |
---|
57 | } |
---|
58 | print LOG "FAILING DEPS\n"; |
---|
59 | foreach my $k (keys %log){ |
---|
60 | print LOG "$k @{$log{$k}}\n"; |
---|
61 | } |
---|
62 | return (\%pkg,\@name,\@deps,\@rdeps) |
---|
63 | } |
---|
64 | |
---|
65 | sub deps{ |
---|
66 | my ($pkg,$name,$deps,$listrpms,$alt) = @_; |
---|
67 | my @listlin; |
---|
68 | my %listalt; |
---|
69 | for(my $i=1; $i < @$listrpms; $i++){ |
---|
70 | foreach my $p (@{$listrpms->[$i]}){ |
---|
71 | $listlin[$pkg->{$p}] = $i; |
---|
72 | } |
---|
73 | } |
---|
74 | $listlin[$pkg->{"basesystem"}] = 1; |
---|
75 | my $n=1; |
---|
76 | my $lo=0; |
---|
77 | while ($n){ |
---|
78 | $lo++; |
---|
79 | $n=0; |
---|
80 | for(my $i = 0; $i < @listlin; $i++){ |
---|
81 | if ($listlin[$i]){ |
---|
82 | foreach (@{$deps->[$i]}){ |
---|
83 | if (!ref) { if ((! $listlin[$_]) or ($listlin[$i] < $listlin[$_])) { $listlin[$_] = $listlin[$i] ; $n = 1} } |
---|
84 | elsif ($alt){ |
---|
85 | my $ok; |
---|
86 | foreach (@{$_}){ |
---|
87 | if ($listlin[$_] and ($listlin[$i] > $listlin[$_])) { $ok=1; last} |
---|
88 | } |
---|
89 | !$ok and do { |
---|
90 | my $l = [map $name->[$_],@{$_}]; |
---|
91 | if (!$listalt{"@$l"} or $listalt{"@$l"}->[0] > $listlin[$i]){ |
---|
92 | $listalt{"@$l"} = [$listlin[$i],$l] |
---|
93 | } |
---|
94 | } |
---|
95 | } |
---|
96 | } |
---|
97 | } |
---|
98 | } |
---|
99 | } |
---|
100 | for(my $i = 0; $i < @listlin; $i++){ |
---|
101 | $listlin[$i] and push @{$listrpms->[$listlin[$i]]}, $name->[$i] |
---|
102 | } |
---|
103 | if ($alt) { |
---|
104 | foreach (keys %listalt){ |
---|
105 | push @{$listrpms->[$listalt{$_}->[0]]}, $listalt{$_}->[1]; |
---|
106 | } |
---|
107 | } |
---|
108 | return $listrpms; |
---|
109 | } |
---|