| 227 |
dpurdie |
1 |
#!/usr/local/bin/perl -w
|
|
|
2 |
|
|
|
3 |
use DeployUtils::RmPkgInfo;
|
|
|
4 |
use DeployUtils::Logger;
|
|
|
5 |
use Getopt::Std;
|
|
|
6 |
|
|
|
7 |
our ( $opt_h, $opt_d, $opt_n, $opt_v, $opt_p, $opt_r, $opt_c );
|
|
|
8 |
|
|
|
9 |
my $Rm;
|
|
|
10 |
my %PkgInfo;
|
|
|
11 |
my $maxLevel = 0;
|
|
|
12 |
|
|
|
13 |
getopts('hd:n:v:pr:c');
|
|
|
14 |
|
|
|
15 |
if ( defined($opt_h) || ! defined($opt_r) )
|
|
|
16 |
{
|
|
|
17 |
print "Must Supply -r along with (-n & -v) or -p\n";
|
|
|
18 |
exit;
|
|
|
19 |
}
|
|
|
20 |
|
|
|
21 |
setLogLevel($opt_d) if ( defined($opt_d) );
|
|
|
22 |
|
|
|
23 |
if ( defined($opt_p) )
|
|
|
24 |
{
|
|
|
25 |
foreach my $pvid ( @ARGV )
|
|
|
26 |
{
|
|
|
27 |
walktree($opt_n, $opt_v, $pvid, $opt_r, 0);
|
|
|
28 |
}
|
|
|
29 |
}
|
|
|
30 |
else
|
|
|
31 |
{
|
|
|
32 |
walktree($opt_n, $opt_v, $opt_p, $opt_r, 0);
|
|
|
33 |
}
|
|
|
34 |
|
|
|
35 |
if ( defined($opt_c) )
|
|
|
36 |
{
|
|
|
37 |
for( my $level = 0; $level <= $maxLevel; $level++ )
|
|
|
38 |
{
|
|
|
39 |
foreach my $i ( keys %PkgInfo )
|
|
|
40 |
{
|
|
|
41 |
if ( $PkgInfo{$i} == $level )
|
|
|
42 |
{
|
|
|
43 |
printf("%d %s%s\n", $level, " " x ($level*4), $i );
|
|
|
44 |
}
|
|
|
45 |
}
|
|
|
46 |
}
|
|
|
47 |
}
|
|
|
48 |
|
|
|
49 |
|
|
|
50 |
|
|
|
51 |
|
|
|
52 |
sub walktree
|
|
|
53 |
{
|
|
|
54 |
my ( $name, $ver, $pvid, $rtag, $level ) = @_;
|
|
|
55 |
my $debugLine = "";
|
|
|
56 |
my $pkgName;
|
|
|
57 |
|
|
|
58 |
$debugLine .= "Name[$name] " if ( defined($name) );
|
|
|
59 |
$debugLine .= "Version[$ver] " if ( defined($ver) );
|
|
|
60 |
$debugLine .= "PvId[$pvid] " if ( defined($pvid) );
|
|
|
61 |
$debugLine .= "RtagId[$rtag] " if ( defined($rtag) );
|
|
|
62 |
$debugLine .= "Level[$level] " if ( defined($level) );
|
|
|
63 |
|
|
|
64 |
$maxLevel = $level if ( $level > $maxLevel );
|
|
|
65 |
|
|
|
66 |
LogDebug("WalkTree: Looking for $debugLine");
|
|
|
67 |
$Rm = DeployUtils::RmPkgInfo->new({ PKG_NAME => $name, PKG_VERSION => $ver, PV_ID => $pvid, RTAG_ID => $rtag });
|
|
|
68 |
if ( $Rm->foundDetails() )
|
|
|
69 |
{
|
|
|
70 |
$pkgName = $Rm->pkg_name();
|
|
|
71 |
LogDebug("WalkTree: Found Pkg Details [$pkgName], getting RtDeps");
|
|
|
72 |
# if opt_c then we are doing a consise list so lets populate hash
|
|
|
73 |
if ( defined($opt_c) )
|
|
|
74 |
{
|
|
|
75 |
if ( defined( $PkgInfo{$pkgName} ) && $level <= $PkgInfo{$pkgName} )
|
|
|
76 |
{
|
|
|
77 |
LogDebug("WalkTree: Tree Rooted at [$pkgName] already seen at lower level [$PkgInfo{$pkgName}], pruning tree");
|
|
|
78 |
return;
|
|
|
79 |
}
|
|
|
80 |
elsif ( defined( $PkgInfo{$pkgName} ) && $level > $PkgInfo{$pkgName} )
|
|
|
81 |
{
|
|
|
82 |
LogDebug("WalkTree: Moving [$pkgName] to a higher level [$PkgInfo{$pkgName}] to [$level]");
|
|
|
83 |
}
|
|
|
84 |
$PkgInfo{$pkgName} = $level;
|
|
|
85 |
}
|
|
|
86 |
# else just print current item at the current level
|
|
|
87 |
else
|
|
|
88 |
{
|
|
|
89 |
printf("%d %s%s\n", $level, " " x ($level*4), $pkgName );
|
|
|
90 |
}
|
|
|
91 |
|
|
|
92 |
$Rm->getRtDeps();
|
|
|
93 |
if ( $Rm->foundRtDeps() )
|
|
|
94 |
{
|
|
|
95 |
foreach my $rtDep ( $Rm->getRtDepNames() )
|
|
|
96 |
{
|
|
|
97 |
LogDebug("WalkTree: Walking [$pkgName]:[$rtDep]");
|
|
|
98 |
# Get details for the next rt dep using rtag to find latest version
|
|
|
99 |
walktree($rtDep, undef, undef, $rtag, $level + 1);
|
|
|
100 |
}
|
|
|
101 |
}
|
|
|
102 |
else
|
|
|
103 |
{
|
|
|
104 |
LogWarn("WalkTree: Unable to find RunTime Details for $debugLine");
|
|
|
105 |
}
|
|
|
106 |
}
|
|
|
107 |
else
|
|
|
108 |
{
|
|
|
109 |
LogWarn("WalkTree: Unable to find Details for $debugLine");
|
|
|
110 |
}
|
|
|
111 |
}
|
|
|
112 |
|
|
|
113 |
|