Subversion Repositories DevTools

Rev

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

Rev Author Line No. Line
392 dpurdie 1
#! perl
2
########################################################################
6177 dpurdie 3
# COPYRIGHT - VIX IP PTY LTD ("VIX"). ALL RIGHTS RESERVED.
392 dpurdie 4
#
5
# Module name   : jats.sh
6
# Module type   : Makefile system
7
# Compiler(s)   : n/a
8
# Environment(s): jats
9
#
10
# Description   : Walk compete dependency tree to locate all package versions
11
#                 Generate a build order
12
#                 Generate build directives
13
#
14
#                 Currently hard coded to NZS Phase-1
15
#
16
# Usage:
17
#
18
# Version   Who      Date        Description
19
#
20
#......................................................................#
21
 
22
require 5.006_001;
23
use strict;
24
use warnings;
25
use JatsError;
26
use JatsSystem;
27
use Getopt::Long;
28
use Pod::Usage;                             # required for help support
29
use JatsRmApi;
30
 
31
use DBI;
32
 
33
my $VERSION = "1.2.3";                      # Update this
34
my $opt_verbose = 1;
35
my $opt_help = 0;
36
my $opt_manual;
37
my $opt_rtag_id = 2641;                     #  NZS
38
   $opt_rtag_id = 2362;                     #  SITS R1+R2
39
 
40
my $opt_no_ver = 0;
41
my $RM_DB;
42
 
43
#
44
#   Package information
45
#
46
my %Package;
47
my @StrayPackages;
48
 
49
#-------------------------------------------------------------------------------
50
# Function        : Main Entry
51
#
52
# Description     :
53
#
54
# Inputs          :
55
#
56
# Returns         :
57
#
58
my $result = GetOptions (
59
                "help+"         => \$opt_help,          # flag, multiple use allowed
60
                "manual"        => \$opt_manual,        # flag
61
                "verbose+"      => \$opt_verbose,       # flag
62
                "rtag_id=s"     => \$opt_rtag_id,       # string
63
                "ignorever!"    => \$opt_no_ver,        # [no]flag
64
                );
65
 
66
#
67
#   Process help and manual options
68
#
69
pod2usage(-verbose => 0, -message => "Version: $VERSION")  if ($opt_help == 1  || ! $result);
70
pod2usage(-verbose => 1)  if ($opt_help == 2 );
71
pod2usage(-verbose => 2)  if ($opt_manual || ($opt_help > 2));
72
 
73
ErrorConfig( 'name'    =>'PLAY16b' );
74
 
75
Error ("No RTAGID specified") unless ( $opt_rtag_id );
76
 
77
getPkgDetailsByRTAG_ID($opt_rtag_id);
78
LocateStrays();
79
BuildOrder();
80
#DebugDumpData ("Package", \%Package );
81
 
82
exit;
83
 
84
sub getPkgDetailsByRTAG_ID
85
{
86
    my ($RTAG_ID) = @_;
87
    my $foundDetails = 0;
88
    my (@row);
89
 
90
    # if we are not or cannot connect then return 0 as we have not found anything
91
    connectRM( \$RM_DB);
92
 
93
    # First get details from pv_id
94
 
95
    my $m_sqlstr = "SELECT pv.PV_ID, pkg.PKG_NAME, pv.PKG_VERSION, pv.PKG_LABEL, pv.SRC_PATH, pv.BUILD_TYPE, pv.IS_DEPLOYABLE, rc.BASE_VIEW_ID" .
96
                    " FROM RELEASE_CONTENT rc, PACKAGE_VERSIONS pv, PACKAGES pkg" .
97
                    " WHERE rc.RTAG_ID = $RTAG_ID AND rc.PV_ID = pv.PV_ID AND pv.PKG_ID = pkg.PKG_ID";
98
    my $sth = $RM_DB->prepare($m_sqlstr);
99
    if ( defined($sth) )
100
    {
101
        if ( $sth->execute( ) )
102
        {
103
            if ( $sth->rows )
104
            {
105
                while ( @row = $sth->fetchrow_array )
106
                {
107
                    my $pv_id = $row[0];
108
                    my $name = $row[1];
109
                    my $ver = $row[2];
110
                    my $label = $row[3] || '';
111
                    my $path = $row[4] || '';
112
                    my $deployable = $row[6];
113
                    my $base_id = $row[7] || '';
114
 
115
                    if ($opt_no_ver)
116
                    {
117
                        push @{$Package{$name}{'xxx'}{ver_list}}, $ver;
118
                        $ver = 'xxx';
119
                    }
120
 
121
                    #
122
                    #   Construct archive path
123
                    #
124
                    my $dpkg;
125
                    foreach my $var ( 'GBE_DPKG', 'GBE_DPLY' )
126
                    {
127
                        my $pkg_dir="$ENV{$var}/${name}/${ver}";
128
                        if ( -d $pkg_dir )
129
                        {
130
                            $dpkg = $pkg_dir;
131
                            last;
132
                        }
133
                    }
134
 
135
                    $path =~ tr~\\/~/~s;
136
#print "$row[5] --";
137
#printf ( "%40s %15s %50s %s\n",  $name, $ver, $label, $path);
138
#printf ( "copy e:\\%s\\%s .\n",  $name, $ver, $label, $path);
139
#print "$name $ver\n";
140
#print "$name $ver, $dpkg\n";
141
                    $Package{$name}{$ver}{done} = 1;
142
                    $Package{$name}{$ver}{base} = 1;
143
                    $Package{$name}{$ver}{base_id} = $base_id;
144
                    $Package{$name}{$ver}{deployable} = 1 if ($deployable);
145
                    $Package{$name}{$ver}{dpkg} = $dpkg if ($dpkg);
146
                    $Package{$name}{$ver}{label} = $label;
147
                    $Package{$name}{$ver}{path} = $path;
148
 
149
                    GetDepends( $pv_id, $name, $ver );
150
                }
151
            }
152
            $sth->finish();
153
        }
154
    }
155
    else
156
    {
157
        Error("Prepare failure" );
158
    }
159
 
160
#    $globals->{RM_CONN}->disconnect() || Error ("Disconnect failed");
161
}
162
 
163
#-------------------------------------------------------------------------------
164
# Function        : GetDepends
165
#
166
# Description     : Extract the dependancies for a given package version
167
#
168
# Inputs          : $pvid
169
#
170
# Returns         :
171
#
172
sub GetDepends
173
{
174
    my ($pv_id, $pname, $pver ) = @_;
175
 
176
    #
177
    #   Now extract the package dependacies
178
    #
179
    my $m_sqlstr = "SELECT pkg.PKG_NAME, pv.PKG_VERSION, pd.DPV_ID, pv.IS_DEPLOYABLE" .
180
                   " FROM PACKAGE_DEPENDENCIES pd, PACKAGE_VERSIONS pv, PACKAGES pkg" .
181
                   " WHERE pd.PV_ID = \'$pv_id\' AND pd.DPV_ID = pv.PV_ID AND pv.PKG_ID = pkg.PKG_ID";
182
    my $sth = $RM_DB->prepare($m_sqlstr);
183
    if ( defined($sth) )
184
    {
185
        if ( $sth->execute( ) )
186
        {
187
            if ( $sth->rows )
188
            {
189
                my %depends;
190
                while ( my @row = $sth->fetchrow_array )
191
                {
192
#                    print "$name ===== @row\n";
193
                    my $name = $row[0];
194
                    my $ver = $row[1];
195
                    my $deployable = $row[3];
196
 
197
                    if ($opt_no_ver)
198
                    {
199
                        push @{$Package{$name}{'xxx'}{ver_list}}, $ver;
200
                        $ver = 'xxx';
201
                    }
202
 
203
                    $depends{$name,$ver} = 1;
204
                    push @{$Package{$name}{$ver}{usedby}}, [ $pname, $pver ];
205
 
206
                    unless ( exists $Package{$name}{$ver}{done} )
207
                    {
208
                        $Package{$name}{$ver}{needed} = 1;
209
                        $Package{$name}{$ver}{deployable} = 1 if ($deployable);
210
 
211
                        my @DATA = ($name, $ver, $row[2]);
212
                        push @StrayPackages, \@DATA;
213
                    }
214
                }
215
                $Package{$pname}{$pver}{depends} = \%depends;
216
            }
217
            $sth->finish();
218
        }
219
    }
220
    else
221
    {
222
        Error("GetDepends:Prepare failure" );
223
    }
224
}
225
 
226
#-------------------------------------------------------------------------------
227
# Function        : LocateStrays
228
#
229
# Description     :
230
#
231
# Inputs          :
232
#
233
# Returns         :
234
#
235
sub LocateStrays
236
{
237
 
238
    while ( $#StrayPackages >= 0 )
239
    {
240
        my $DATA = pop @StrayPackages;
241
        my $name = $DATA->[0];
242
        my $ver = $DATA->[1];
243
        my $pv_id = $DATA->[2];
244
 
245
        next if ( exists $Package{$name}{$ver}{done} );
246
        GetDepends(  $pv_id, $name, $ver );
247
        $Package{$name}{$ver}{done} = 1;
248
        $Package{$name}{$ver}{stray} = 1;
249
    }
250
}
251
 
252
#-------------------------------------------------------------------------------
253
# Function        : BuildOrder
254
#
255
# Description     : Determine the order to build packages
256
#
257
# Inputs          :
258
#
259
# Returns         :
260
#
261
sub BuildOrder
262
{
263
    foreach my $name ( keys %Package )
264
    {
265
        foreach my $ver ( keys %{$Package{$name}} )
266
        {
267
            AddToBuildList( $name, $ver, $Package{$name}{$ver}{depends} );
268
        }
269
    }
270
 
271
    DetermineBuildOrder();
272
}
273
 
274
#-------------------------------------------------------------------------------
275
# Function        : AddToBuildList
276
#
277
# Description     : Add packages to a build list
278
#
279
# Inputs          : PackageName
280
#                   PackageVersion
281
#                   Hash of dependancies
282
#
283
# Returns         :
284
#
285
my %BuildList;
286
sub AddToBuildList
287
{
288
    my ($name, $ver, $pdepends ) = @_;
289
 
290
    print "Duplicate Package to build: $name, $ver\n" if exists $BuildList{$name,$ver};
291
    $BuildList{$name,$ver}{depends} = $pdepends;
292
}
293
 
294
#-------------------------------------------------------------------------------
295
# Function        : DetermineBuildOrder
296
#
297
# Description     : Determine the build order
298
#
299
# Inputs          :
300
#
301
# Returns         :
302
#
303
sub DetermineBuildOrder
304
{
305
 
306
#    DebugDumpData ("BuildList", \%BuildList); exit 1;
307
 
308
    my $more = 1;
309
    my $level = 0;
310
    while ( $more )
311
    {
312
        my @build;
313
        $level ++;
314
        $more = 0;
315
        foreach my $key ( keys %BuildList )
316
        {
317
            #
318
            #   Locate packges with no dependencies left
319
            #
320
            next if ( keys %{$BuildList{$key}{depends}} );
321
            push @build, $key;
322
        }
323
 
324
        foreach my $build ( @build )
325
        {
326
            $more = 1;
327
            delete $BuildList{$build};
328
            my ($name, $ver) = split $;, $build;
329
 
330
#            next if ( exists $Package{$name}{$ver}{stray} );
331
 
332
            my $dpkg = $Package{$name}{$ver}{dpkg} || '';
333
            my $label = $Package{$name}{$ver}{label} || '';
334
            my $path = $Package{$name}{$ver}{path} || '';
335
 
336
 
337
            printf( "Build(%2d): %25s %15s %-40s %s\n", $level, $name, $ver, $label, $path);
338
        }
339
 
340
        #
341
        #   Delete dependencies
342
        #
343
        foreach my $key ( keys %BuildList )
344
        {
345
            foreach my $build ( @build )
346
            {
347
                delete $BuildList{$key}{depends}->{$build};
348
            }
349
        }
350
    }
351
}
352
 
353