Subversion Repositories DevTools

Rev

Rev 6177 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4035 dpurdie 1
#! perl
2
########################################################################
6177 dpurdie 3
# COPYRIGHT - VIX IP PTY LTD ("VIX"). ALL RIGHTS RESERVED.
4035 dpurdie 4
#
5
# Module name   : extract_depends.pl
6
# Module type   : Makefile system
7
# Compiler(s)   : n/a
8
# Environment(s): jats
9
#
10
# Description   : Given a package name and version, this program will interogate
11
#                 the release manager database and create a directed graph of
12
#                 the packages depenancies - as described by the package entry.
13
#
14
# Usage:
15
#
16
# Version   Who      Date        Description
17
#
18
#......................................................................#
19
 
20
require 5.006_001;
21
use strict;
22
use warnings;
23
use Data::Dumper;
24
use Cwd;
25
use DeployUtils::RmPkgInfo;
26
 
27
 
28
#-------------------------------------------------------------------------------
29
#   Globals
30
#
31
my %packages;
32
my %required_packages;
33
my $root_package;
34
my @logs;
35
 
36
#-------------------------------------------------------------------------------
37
#   Extract package dependancy information
38
#
39
my  %Package;
40
my $ONLY_DISPLAY_ONCE = 1;
41
 
42
#
43
#   Determine root package
44
#
45
unless ( $ARGV[0] && $ARGV[1] )
46
{
47
    print "Specify a package as 'name' 'version'\n";
48
    exit;
49
}
50
 
51
GetDepends (0, $ARGV[0], $ARGV[1] );
52
 
53
#-------------------------------------------------------------------------------
54
# Function        : GetDepends
55
#
56
# Description     :
57
#
58
# Inputs          : pkg_name
59
#                   pkg_ver
60
#
61
# Returns         :
62
#
63
sub GetDepends
64
{
65
    my ($level, $pkg_name, $pkg_ver ) = @_;
66
 
67
#    return
68
#        if ( defined($Package{$pkg_name}) );
69
 
70
    displayName( $level, $pkg_name, $pkg_ver );
71
 
72
    my $pkgInfo = $Package{$pkg_name}{$pkg_ver};
73
    unless ( defined $pkgInfo )
74
    {
75
        $pkgInfo = DeployUtils::RmPkgInfo->new( { PKG_NAME => $pkg_name , PKG_VERSION => $pkg_ver } );
76
        $Package{$pkg_name}{$pkg_ver} = $pkgInfo;
77
        if ( ! $pkgInfo->foundDetails() )
78
        {
79
            logit ("PACKAGE DETAILS NOT FOUND: $pkg_name $pkg_ver\n");
80
        }
81
    }
82
    else
83
    {
84
        return if ( $ONLY_DISPLAY_ONCE );
85
    }
86
 
87
 
88
    #
89
    #   Save package information
90
    #
91
    my $alias = $pkg_name . '_' . $pkg_ver;
92
    $root_package = $alias unless ( $root_package );
93
 
94
    $packages{$alias}{'name'} = $pkg_name;
95
    $packages{$alias}{'ext'}  = $pkg_ver;
96
    $packages{$alias}{'version'} = $pkg_ver;
97
    $packages{$alias}{'label'} = $alias;
98
 
99
    my @clean_depends;
100
    foreach my $depName ( $pkgInfo->getDependencyNames() )
101
    {
102
        my $depPkg = $pkgInfo->getDependencyObject($depName);
103
        my $depVer = $depPkg->pkg_version();
104
 
105
        # Skip some known packages
106
        next if ( $depName =~ m~^ant~ );
107
        next if ( $depName =~ m~^deployfiles~ );
108
        next if ( $depName =~ m~^ishieldlib~ );
109
        next if ( $depName =~ m~^Dinkumware~i );
110
 
111
        my $dalias = $depName . '_' . $depVer;
112
        push @clean_depends, $dalias;
113
 
114
        GetDepends( $level + 1, $depName, $depVer );
115
    }
116
 
117
    $packages{$alias}{'depends'} = \@clean_depends;
118
    $required_packages{$alias} = 1;
119
 
120
}
121
 
122
sub displayName
123
{
124
    my ($level, $name, $ver ) = @_;
125
    if ( $ONLY_DISPLAY_ONCE )
126
    {
127
        logit  ("Package $name $ver\n") unless $Package{$name};
128
    }
129
    else
130
    {
131
        logit  (' ' x ($level * 4), "Package $name $ver\n");
132
    }
133
 
134
}
135
 
136
#DebugDumpData ('Needed Packages', \%required_packages );
137
 
138
#
139
#   Display details of the required packages
140
#
141
print "Required Packages and versions\n";
142
my $filebase = $root_package;
143
open (FH, ">$filebase.dot" ) or die "Cannot open output";
144
print FH "digraph world {\n";
145
print FH "\trankdir=LR;\n";
146
print FH "\tnode[fontsize=24];\n";
147
 
148
my @dep;
149
 
150
#delete $required_packages{$root_package};
151
#@dep =  sort keys %required_packages;
152
#print FH  "\t", pentry($root_package), " -> { ", plist(' ; ', @dep) ," }\n";
153
 
154
@dep = grep /^daf_/, @{$packages{$root_package}{'depends'}};;
155
#print FH "\t{rank=same; ", plist(' ', @dep) , "; }\n";
156
 
157
@dep = grep /^dac_/, @{$packages{$root_package}{'depends'}};;
158
#print FH "\t{rank=same; ", plist(' ', @dep) , "; }\n";
159
 
160
@dep = grep /cots$/, keys %required_packages;;
161
#print FH "\t{rank=max; ", plist(' ', @dep) , "; }\n";
162
print FH "\t{rank=min; ", pentry($root_package) , "; }\n";
163
print FH "\t{root=", pentry($root_package), "; }\n";
164
 
165
 
166
my @no_dep;
167
foreach my $alias ( sort keys %required_packages )
168
{
169
    my $name       = $packages{$alias}{'name'};
170
    my $ext        = $packages{$alias}{'ext'};
171
    my $version    = $packages{$alias}{'version'};
172
    my $label      = $packages{$alias}{'label'};
173
 
174
    print STDERR "ERROR: No name for: $alias\n" unless $name;
175
    print STDERR "ERROR: No version for: $alias\n" unless $version;
176
 
177
    my $deplist = $packages{$alias}{'depends'};
178
    print FH  "\t", pentry($alias)  ," -> { ", plist ( ' ; ', @{$deplist} ), " }\n";
179
 
180
    push @no_dep, $alias unless ( @{$deplist} );
181
 
182
    print FH "\t", pentry($alias), "[label=\"$label\"]\n";
183
 
184
}
185
 
186
#
187
#   Set rank on components with no dependancies
188
#
189
print FH "\t{rank=max; ", plist(' ', @no_dep) , "; }\n";
190
 
6619 dpurdie 191
# End of diagraph
192
print FH "\n}\n";
4035 dpurdie 193
close FH;
194
 
195
#
196
#   Write out logs
197
#
198
#unless ( $ONLY_DISPLAY_ONCE )
199
{
200
    open (FH, ">$filebase.txt" ) or die "Cannot open output";
201
    foreach  ( @logs )
202
    {
203
        print FH $_;
204
    }
205
    close FH;
206
}
207
 
208
#
209
#   Convert DOT to a SVG
210
#
211
print "Generating graphical images\n";
212
system( "dot $filebase.dot -Tjpg -o$filebase.jpg  -v" );
213
system( "dot $filebase.dot -Tsvg -o$filebase.svg  -v" );
214
 
215
print "\n";
216
print "Generated: $filebase.dot\n";
217
print "Generated: $filebase.jpg\n";
218
print "Generated: $filebase.svg\n";
219
print "Generated: $filebase.txt\n";
220
 
221
 
222
exit 0;
223
 
224
 
225
#-------------------------------------------------------------------------------
226
# Function        : log
227
#
228
# Description     : Log packages
229
#
230
# Inputs          : text
231
#
232
# Returns         : 
233
#
234
sub logit
235
{
236
    print @_;
237
    push @logs, "@_";
238
}
239
 
240
 
241
#-------------------------------------------------------------------------------
242
# Function        : plist
243
#
244
# Description     : Generate an entry list as text
245
#                   Replace "." with "_" since DOT doesn't like .'s
246
#                   Seperate the arguments
247
#
248
# Inputs          : $pref       - Prefix string
249
#                   @_          - An array of entries to process
250
#
251
# Returns         : A string
252
#
253
sub plist
254
{
255
    my $pref = shift;
256
    my $result = "";
257
    foreach  ( @_ )
258
    {
259
        $_ =~ s~\.~_~g;
260
        $result .= '"' . $_ . '"' . $pref;
261
    }
262
    return $result;
263
}
264
 
265
sub pentry
266
{
267
 
268
    my $result = "";
269
    foreach  ( @_ )
270
    {
271
        $_ =~ s~\.~_~g;
272
        $result .= '"' . $_ . '"'
273
    }
274
    return $result;
275
}
276
 
277
#-------------------------------------------------------------------------------
278
# Function        : DebugDumpData
279
#
280
# Description     : Display data structures
281
#
282
# Inputs          :
283
#
284
# Returns         :
285
#
286
sub DebugDumpData
287
{
288
    my ($name, @refp) = @_;
289
 
290
    my $ii = 0;
291
    foreach  ( @refp )
292
    {
293
        print Data::Dumper->Dump ( [$_], ["[Arg:$ii] $name" ]);
294
        $ii++
295
    }
296
}
297
 
298
 
299