Subversion Repositories DevTools

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
392 dpurdie 1
#! perl
2
########################################################################
5710 dpurdie 3
# Copyright (c) VIX TECHNOLOGY (AUST) LTD
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 only for parts not already built on "win32"
13
#
14
#                 Currently hard coded to BEIJING (BEI) > R2
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 = 5702;                     #  5702 BEIJING (BEI) > R2
38
my $opt_no_ver = 1;
39
my $RM_DB;
40
 
41
#
42
#   Package information
43
#
44
my %Package;
45
my @StrayPackages;
46
 
47
#-------------------------------------------------------------------------------
48
# Function        : Main Entry
49
#
50
# Description     :
51
#
52
# Inputs          :
53
#
54
# Returns         :
55
#
56
my $result = GetOptions (
57
                "help+"         => \$opt_help,          # flag, multiple use allowed
58
                "manual"        => \$opt_manual,        # flag
59
                "verbose+"      => \$opt_verbose,       # flag
60
                "rtag_id=s"     => \$opt_rtag_id,       # string
61
                "ignorever!"    => \$opt_no_ver,        # [no]flag
62
                );
63
 
64
#
65
#   Process help and manual options
66
#
67
pod2usage(-verbose => 0, -message => "Version: $VERSION")  if ($opt_help == 1  || ! $result);
68
pod2usage(-verbose => 1)  if ($opt_help == 2 );
69
pod2usage(-verbose => 2)  if ($opt_manual || ($opt_help > 2));
70
 
71
ErrorConfig( 'name'    =>'PLAY14' );
72
 
73
Error ("No RTAGID specified") unless ( $opt_rtag_id );
74
 
75
getPkgDetailsByRTAG_ID($opt_rtag_id);
76
LocateStrays();
77
BuildOrder();
78
#DebugDumpData ("Package", \%Package );
79
 
80
exit;
81
 
82
sub getPkgDetailsByRTAG_ID
83
{
84
    my ($RTAG_ID) = @_;
85
    my $foundDetails = 0;
86
    my (@row);
87
 
88
    # if we are not or cannot connect then return 0 as we have not found anything
89
    connectRM( \$RM_DB);
90
 
91
    # First get details from pv_id
92
 
93
    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" .
94
                    " FROM RELEASE_CONTENT rc, PACKAGE_VERSIONS pv, PACKAGES pkg" .
95
                    " WHERE rc.RTAG_ID = $RTAG_ID AND rc.PV_ID = pv.PV_ID AND pv.PKG_ID = pkg.PKG_ID";
96
    my $sth = $RM_DB->prepare($m_sqlstr);
97
    if ( defined($sth) )
98
    {
99
        if ( $sth->execute( ) )
100
        {
101
            if ( $sth->rows )
102
            {
103
                while ( @row = $sth->fetchrow_array )
104
                {
105
                    my $pv_id = $row[0];
106
                    my $name = $row[1];
107
                    my $ver = $row[2];
108
                    my $label = $row[3] || '';
109
                    my $path = $row[4] || '';
110
                    my $deployable = $row[6];
111
                    my $base_id = $row[7] || '';
112
 
113
                    if ($opt_no_ver)
114
                    {
115
                        push @{$Package{$name}{'xxx'}{ver_list}}, $ver;
116
                        $ver = 'xxx';
117
                    }
118
 
119
                    $path =~ tr~\\/~/~s;
120
#print "$row[5] --";
121
#printf ( "%40s %15s %50s %s\n",  $name, $ver, $label, $path);
122
#printf ( "copy e:\\%s\\%s .\n",  $name, $ver, $label, $path);
123
#print "$name $ver\n";
124
                    $Package{$name}{$ver}{done} = 1;
125
                    $Package{$name}{$ver}{base} = 1;
126
                    $Package{$name}{$ver}{base_id} = $base_id;
127
                    $Package{$name}{$ver}{deployable} = 1 if ($deployable);
128
                    GetDepends( $pv_id, $name, $ver );
129
                }
130
            }
131
            $sth->finish();
132
        }
133
    }
134
    else
135
    {
136
        Error("Prepare failure" );
137
    }
138
 
139
#    $globals->{RM_CONN}->disconnect() || Error ("Disconnect failed");
140
}
141
 
142
#-------------------------------------------------------------------------------
143
# Function        : GetDepends
144
#
145
# Description     : Extract the dependancies for a given package version
146
#
147
# Inputs          : $pvid
148
#
149
# Returns         :
150
#
151
sub GetDepends
152
{
153
    my ($pv_id, $pname, $pver ) = @_;
154
 
155
    #
156
    #   Now extract the package dependacies
157
    #
158
    my $m_sqlstr = "SELECT pkg.PKG_NAME, pv.PKG_VERSION, pd.DPV_ID, pv.IS_DEPLOYABLE" .
159
                   " FROM PACKAGE_DEPENDENCIES pd, PACKAGE_VERSIONS pv, PACKAGES pkg" .
160
                   " WHERE pd.PV_ID = \'$pv_id\' AND pd.DPV_ID = pv.PV_ID AND pv.PKG_ID = pkg.PKG_ID";
161
    my $sth = $RM_DB->prepare($m_sqlstr);
162
    if ( defined($sth) )
163
    {
164
        if ( $sth->execute( ) )
165
        {
166
            if ( $sth->rows )
167
            {
168
                my %depends;
169
                while ( my @row = $sth->fetchrow_array )
170
                {
171
#                    print "$name ===== @row\n";
172
                    my $name = $row[0];
173
                    my $ver = $row[1];
174
                    my $deployable = $row[3];
175
 
176
                    if ($opt_no_ver)
177
                    {
178
                        push @{$Package{$name}{'xxx'}{ver_list}}, $ver;
179
                        $ver = 'xxx';
180
                    }
181
 
182
                    $depends{$name}{$ver} = 1;
183
                    push @{$Package{$name}{$ver}{usedby}}, [ $pname, $pver ];
184
 
185
                    unless ( exists $Package{$name}{$ver}{done} )
186
                    {
187
                        $Package{$name}{$ver}{needed} = 1;
188
                        $Package{$name}{$ver}{deployable} = 1 if ($deployable);
189
 
190
                        my @DATA = ($name, $ver, $row[2]);
191
                        push @StrayPackages, \@DATA;
192
                    }
193
                }
194
                $Package{$pname}{$pver}{depends} = \%depends;
195
            }
196
            $sth->finish();
197
        }
198
    }
199
    else
200
    {
201
        Error("GetDepends:Prepare failure" );
202
    }
203
}
204
 
205
#-------------------------------------------------------------------------------
206
# Function        : LocateStrays
207
#
208
# Description     :
209
#
210
# Inputs          :
211
#
212
# Returns         :
213
#
214
sub LocateStrays
215
{
216
 
217
    while ( $#StrayPackages >= 0 )
218
    {
219
        my $DATA = pop @StrayPackages;
220
        my $name = $DATA->[0];
221
        my $ver = $DATA->[1];
222
        my $pv_id = $DATA->[2];
223
 
224
        next if ( exists $Package{$name}{$ver}{done} );
225
        GetDepends(  $pv_id, $name, $ver );
226
        $Package{$name}{$ver}{done} = 1;
227
    }
228
}
229
 
230
#-------------------------------------------------------------------------------
231
# Function        : BuildOrder
232
#
233
# Description     : Determine the order to build packages
234
#
235
# Inputs          :
236
#
237
# Returns         :
238
#
239
sub BuildOrder
240
{
241
#    DebugDumpData ("Package", \%Package); exit 1;
242
 
243
    my $more = 1;
244
    my $level = 0;
245
    while ( $more )
246
    {
247
        my %build;
248
        $level ++;
249
        $more = 0;
250
        foreach my $name ( keys %Package )
251
        {
252
 
253
            #
254
            #   Locate packges with no dependencies left
255
            #
256
            foreach my $ver ( keys %{$Package{$name}} )
257
            {
258
                next if ( keys %{$Package{$name}{$ver}{depends}} );
259
                $build{$name}{$ver} = 1;
260
 
261
            }
262
        }
263
 
264
        foreach my $name ( keys %build )
265
        {
266
            foreach my $ver ( keys %{$build{$name}} )
267
            {
268
                $more = 1;
269
                print "Build($level): $name, $ver\n";
270
                delete $Package{$name}{$ver};
271
                delete $Package{$name} unless keys %{$Package{$name}{$ver}};
272
            }
273
        }
274
 
275
        #
276
        #   Delete dependencies
277
        #
278
 
279
        foreach my $name ( keys %Package )
280
        {
281
            foreach my $ver ( keys %{$Package{$name}} )
282
            {
283
                next unless ( keys %{$Package{$name}{$ver}{depends}} );
284
                foreach my $tname ( keys %build )
285
                {
286
                    foreach my $tver ( keys %{$build{$tname}} )
287
                    {
288
                        delete $Package{$name}{$ver}{depends}->{$tname}{$tver};
289
                        delete $Package{$name}{$ver}{depends}->{$tname} unless keys %{$Package{$name}{$ver}{depends}->{$tname}} ;
290
                    }
291
                }
292
            }
293
        }
294
    }
295
}
296
 
297