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 unused packages
11
#
12
#                 Currently hard coded to NZ STAGE COACH (NZS) > Phase 1
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 JatsError;
24
use JatsSystem;
25
use Getopt::Long;
26
use Pod::Usage;                             # required for help support
27
use JatsRmApi;
28
 
29
use DBI;
30
 
31
my $VERSION = "1.2.3";                      # Update this
32
my $opt_verbose = 1;
33
my $opt_help = 0;
34
my $opt_manual;
35
my $opt_rtag_id = 2641;                     # 2641 : NZ STAGE COACH (NZS) > Phase 1
36
my $opt_no_ver = 1;
37
my $RM_DB;
38
 
39
#
40
#   Package information
41
#
42
my %Package;
43
my @StrayPackages;
44
 
45
#-------------------------------------------------------------------------------
46
# Function        : Main Entry
47
#
48
# Description     :
49
#
50
# Inputs          :
51
#
52
# Returns         :
53
#
54
my $result = GetOptions (
55
                "help+"         => \$opt_help,          # flag, multiple use allowed
56
                "manual"        => \$opt_manual,        # flag
57
                "verbose+"      => \$opt_verbose,       # flag
58
                "rtag_id=s"     => \$opt_rtag_id,       # string
59
                "ignorever!"    => \$opt_no_ver,        # [no]flag
60
                );
61
 
62
#
63
#   Process help and manual options
64
#
65
pod2usage(-verbose => 0, -message => "Version: $VERSION")  if ($opt_help == 1  || ! $result);
66
pod2usage(-verbose => 1)  if ($opt_help == 2 );
67
pod2usage(-verbose => 2)  if ($opt_manual || ($opt_help > 2));
68
 
69
ErrorConfig( 'name'    =>'PLAY14' );
70
 
71
Error ("No RTAGID specified") unless ( $opt_rtag_id );
72
 
73
getPkgDetailsByRTAG_ID($opt_rtag_id);
74
LocateStrays();
75
LocatePackages();
76
#DebugDumpData ("Package", \%Package );
77
 
78
exit;
79
 
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
                    $path =~ tr~\\/~/~s;
119
#print "$row[5] --";
120
#printf ( "%40s %15s %50s %s\n",  $name, $ver, $label, $path);
121
#printf ( "copy e:\\%s\\%s .\n",  $name, $ver, $label, $path);
122
#print "$name $ver\n";
123
                    $Package{$name}{$ver}{done} = 1;
124
                    $Package{$name}{$ver}{base} = 1;
125
                    $Package{$name}{$ver}{base_id} = $base_id;
126
                    $Package{$name}{$ver}{deployable} = 1 if ($deployable);
127
                    GetDepends( $pv_id, $name, $ver );
128
                }
129
            }
130
            $sth->finish();
131
        }
132
    }
133
    else
134
    {
135
        Error("Prepare failure" );
136
    }
137
}
138
 
139
#-------------------------------------------------------------------------------
140
# Function        : GetDepends
141
#
142
# Description     : Extract the dependancies for a given package version
143
#
144
# Inputs          : $pvid
145
#
146
# Returns         :
147
#
148
sub GetDepends
149
{
150
    my ($pv_id, $pname, $pver ) = @_;
151
 
152
    #
153
    #   Now extract the package dependacies
154
    #
155
    my $m_sqlstr = "SELECT pkg.PKG_NAME, pv.PKG_VERSION, pd.DPV_ID, pv.IS_DEPLOYABLE" .
156
                   " FROM PACKAGE_DEPENDENCIES pd, PACKAGE_VERSIONS pv, PACKAGES pkg" .
157
                   " WHERE pd.PV_ID = \'$pv_id\' AND pd.DPV_ID = pv.PV_ID AND pv.PKG_ID = pkg.PKG_ID";
158
    my $sth = $RM_DB->prepare($m_sqlstr);
159
    if ( defined($sth) )
160
    {
161
        if ( $sth->execute( ) )
162
        {
163
            if ( $sth->rows )
164
            {
165
                my @depends;
166
                while ( my @row = $sth->fetchrow_array )
167
                {
168
#                    print "$name ===== @row\n";
169
                    my $name = $row[0];
170
                    my $ver = $row[1];
171
                    my $deployable = $row[3];
172
 
173
                    if ($opt_no_ver)
174
                    {
175
                        push @{$Package{$name}{'xxx'}{ver_list}}, $ver;
176
                        $ver = 'xxx';
177
                    }
178
 
179
                    push @depends, [ $name, $ver ];
180
                    push @{$Package{$name}{$ver}{usedby}}, [ $pname, $pver ];
181
 
182
                    unless ( exists $Package{$name}{$ver}{done} )
183
                    {
184
                        $Package{$name}{$ver}{needed} = 1;
185
                        $Package{$name}{$ver}{deployable} = 1 if ($deployable);
186
 
187
                        my @DATA = ($name, $ver, $row[2]);
188
                        push @StrayPackages, \@DATA;
189
                    }
190
                }
191
                $Package{$pname}{$pver}{depends} = [ @depends ];
192
            }
193
            $sth->finish();
194
        }
195
    }
196
    else
197
    {
198
        Error("GetDepends:Prepare failure" );
199
    }
200
}
201
 
202
#-------------------------------------------------------------------------------
203
# Function        : LocateStrays
204
#
205
# Description     :
206
#
207
# Inputs          :
208
#
209
# Returns         :
210
#
211
sub LocateStrays
212
{
213
 
214
    while ( $#StrayPackages >= 0 )
215
    {
216
        my $DATA = pop @StrayPackages;
217
        my $name = $DATA->[0];
218
        my $ver = $DATA->[1];
219
        my $pv_id = $DATA->[2];
220
 
221
        next if ( exists $Package{$name}{$ver}{done} );
222
        GetDepends(  $pv_id, $name, $ver );
223
        $Package{$name}{$ver}{done} = 1;
224
    }
225
}
226
 
227
#-------------------------------------------------------------------------------
228
# Function        : LocatePackages
229
#
230
# Description     : Locate Packages that are not used
231
#
232
# Inputs          :
233
#
234
# Returns         :
235
#
236
sub LocatePackages
237
{
238
#    DebugDumpData ("Package", \%Package); exit 1;
239
 
240
    my @unused;
241
    foreach my $name ( keys %Package )
242
    {
243
        foreach my $ver ( keys %{$Package{$name}} )
244
        {
245
            next if ( exists $Package{$name}{$ver}{usedby} );
246
 
247
            #
248
            #   Ignore packages marked as deployable
249
            #
250
            next if ( exists $Package{$name}{$ver}{deployable} );
251
 
252
 
253
            #
254
            #   Kludge
255
            #   Ignore PRODUCTS and AUTO_PRODUCTS
256
            #
257
            my $base_id = $Package{$name}{$ver}{base_id};
258
            next if ( $base_id eq 2067 );
259
            next if ( $base_id eq 2602 );
260
 
261
#            print "Unused Package: $name: $ver\n";
262
            if ($opt_no_ver)
263
            {
264
                push @unused, "$name, @{$Package{$name}{'xxx'}{ver_list}}";
265
            }
266
            else
267
            {
268
                push @unused, "$name, $ver";
269
            }
270
        }
271
    }
272
 
273
    foreach  (sort @unused )
274
    {
275
            print "Unused Package: $_\n";
276
    }
277
}
278
 
279