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