Blame | Last modification | View Log | RSS feed
#!/usr/local/bin/perl -wuse DeployUtils::RmPkgInfo;use DeployUtils::Logger;use Getopt::Std;our ( $opt_h, $opt_d, $opt_n, $opt_v, $opt_p, $opt_r, $opt_c );my $Rm;my %PkgInfo;my $maxLevel = 0;getopts('hd:n:v:pr:c');if ( defined($opt_h) || ! defined($opt_r) ){print "Must Supply -r along with (-n & -v) or -p\n";exit;}setLogLevel($opt_d) if ( defined($opt_d) );if ( defined($opt_p) ){foreach my $pvid ( @ARGV ){walktree($opt_n, $opt_v, $pvid, $opt_r, 0);}}else{walktree($opt_n, $opt_v, $opt_p, $opt_r, 0);}if ( defined($opt_c) ){for( my $level = 0; $level <= $maxLevel; $level++ ){foreach my $i ( keys %PkgInfo ){if ( $PkgInfo{$i} == $level ){printf("%d %s%s\n", $level, " " x ($level*4), $i );}}}}sub walktree{my ( $name, $ver, $pvid, $rtag, $level ) = @_;my $debugLine = "";my $pkgName;$debugLine .= "Name[$name] " if ( defined($name) );$debugLine .= "Version[$ver] " if ( defined($ver) );$debugLine .= "PvId[$pvid] " if ( defined($pvid) );$debugLine .= "RtagId[$rtag] " if ( defined($rtag) );$debugLine .= "Level[$level] " if ( defined($level) );$maxLevel = $level if ( $level > $maxLevel );LogDebug("WalkTree: Looking for $debugLine");$Rm = DeployUtils::RmPkgInfo->new({ PKG_NAME => $name, PKG_VERSION => $ver, PV_ID => $pvid, RTAG_ID => $rtag });if ( $Rm->foundDetails() ){$pkgName = $Rm->pkg_name();LogDebug("WalkTree: Found Pkg Details [$pkgName], getting RtDeps");# if opt_c then we are doing a consise list so lets populate hashif ( defined($opt_c) ){if ( defined( $PkgInfo{$pkgName} ) && $level <= $PkgInfo{$pkgName} ){LogDebug("WalkTree: Tree Rooted at [$pkgName] already seen at lower level [$PkgInfo{$pkgName}], pruning tree");return;}elsif ( defined( $PkgInfo{$pkgName} ) && $level > $PkgInfo{$pkgName} ){LogDebug("WalkTree: Moving [$pkgName] to a higher level [$PkgInfo{$pkgName}] to [$level]");}$PkgInfo{$pkgName} = $level;}# else just print current item at the current levelelse{printf("%d %s%s\n", $level, " " x ($level*4), $pkgName );}$Rm->getRtDeps();if ( $Rm->foundRtDeps() ){foreach my $rtDep ( $Rm->getRtDepNames() ){LogDebug("WalkTree: Walking [$pkgName]:[$rtDep]");# Get details for the next rt dep using rtag to find latest versionwalktree($rtDep, undef, undef, $rtag, $level + 1);}}else{LogWarn("WalkTree: Unable to find RunTime Details for $debugLine");}}else{LogWarn("WalkTree: Unable to find Details for $debugLine");}}