Subversion Repositories DevTools

Rev

Rev 2548 | Rev 2635 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
392 dpurdie 1
########################################################################
2
# Copyright (C) 1998-2012 Vix Technology, All rights reserved
3
#
4
# Module name   : cc2svn_gendata.pl
5
# Module type   : Makefile system
6
# Compiler(s)   : Perl
7
# Environment(s): jats
8
#
9
# Description   : Get all packages that are used in all releases
10
#                 Create a data file that can be used offline
11
#
12
#                 The process will exclude some old releases
13
#
14
#                 Generate data on Essential Package Versions to be
15
#                 transferred from CC to Subversion
16
#
17
#......................................................................#
18
 
19
require 5.006_001;
20
use strict;
21
use warnings;
22
use JatsError;
23
use JatsSystem;
24
use Getopt::Long;
25
use Pod::Usage;                             # required for help support
26
use JatsRmApi;
27
use ConfigurationFile;
28
 
29
use DBI;
30
use HTTP::Date;
31
 
32
my $VERSION = "1.2.3";                      # Update this
33
my $opt_verbose = 0;
34
my $opt_help = 0;
35
my $opt_manual;
36
my $opt_test;
37
my $opt_limit;
38
my $opt_quick;
1197 dpurdie 39
my $opt_mode = '';
392 dpurdie 40
my $RM_DB;
41
my $now = time();
42
 
43
#
44
#   Package information
45
#
46
my %Releases;
47
my %Packages;
48
my %Suffixes;
49
my @StrayPackages;
50
my %AllPackages;
51
 
52
my $doAllReleases = 0;
53
my $doIncludeOnly = 0;
54
my @includedProjects = (
55
#        481,    # UK BUS HOPS
56
);
57
 
58
my @includedReleases = (
59
        6222,   # HOME > UK STAGE COACH (SSW) > Mainline
60
        14503,  # HOME > UK STAGE COACH (SSW) > ITSO_HOPS_3
61
        21303,  # HOME > UK STAGE COACH (SSW) > SUPPORT_HOPS_REPORTS
62
        21343,  # HOME > UK STAGE COACH (SSW) > SUPPORT_CIPP
63
        17223,  # HOME > UK STAGE COACH (SSW) > ITSO HOPS 4
1453 dpurdie 64
        21864,  # Hops3.6'
65
        22303   # Hops3.7
392 dpurdie 66
);
67
 
68
 
69
my @excludeProjects = ( 162,            # WASHINGTON (WDC)
70
                        341,            # TUTORIAL (TUT)
71
                        142,            # SYDNEY (SYD)
72
                        182 ,           # ROME (ROM)
73
                        6 ,             # GMPTE/PCL (GMP)
74
                        521,            # NSW CLUB CARD
75
                        221,            # NZ STAGE COACH (NZS)
1197 dpurdie 76
                        82,             # LVS
77
                        42,             # SFO
2476 dpurdie 78
#                        641,            # BCC Releaeses
1197 dpurdie 79
                        62,             # OSLO
80
                        4,              # Singapore
81
                        441,            # Tas
82
                        102,            # Ventura
392 dpurdie 83
                        );
84
my @excludeReleases = ( 20424,          # MASS_REF (MAS) > test
1197 dpurdie 85
                        # RJACK 9043,           # TECHNOLOGY GROUP > Development Environment - For Test Setup
86
                        # RJACK 14383,          # TECHNOLOGY GROUP > eBrio TDS
87
                        # RJACK 20463,          # TECHNOLOGY GROUP > TPIT - BackOffice Linux build
88
                        # RJACK 14603,          # TECHNOLOGY GROUP > TPIT - BackOffice 64 bit [CCB Mode!]
392 dpurdie 89
                        #9263,           # TECHNOLOGY GROUP > Buildtool DEVI&TEST
90
                        22163,          # GLOBAL PRODUCT MGMT > Rio Tinto - Remote Draught Survey
91
                        19483,          # SEATTLE (SEA) > Phase 2 - I18 [backup] [Restrictive Mode]
92
                        20403,          # SEATTLE (SEA) > Phase 2 - I19 [backup]
93
                        20983,          # ??? May have been deleted
395 dpurdie 94
                        13083,          # TECHNOLOGY GROUP > TRACS
95
                        15224,          # 64Bit Solaris Test
1197 dpurdie 96
 
392 dpurdie 97
                        );
98
 
99
my %sillyVersions =
100
(
101
    '2b6'           => '2.6.0.cots',
102
    '1.0b2'         => '1.0.2.cots',
103
    '1.6.x'         => '1.6.0.cots',
104
    '3.5beta12.5'   => '3.5.12.5.cots',
1197 dpurdie 105
    '1.0b1.1.mas'   => '1.1.1.mas',
392 dpurdie 106
);
1197 dpurdie 107
 
108
my %suffixFixup = (
109
    '.sf'           => '.sfo',
110
    '.vt'           => '.vtk',
111
    '.lv'           => '.lvs',
112
    '.was'          => '.wdc',
113
    '.uk.1'         => '.uk',
114
    '.ssts.demo'    => '.ssts',
115
    '.u244.syd'     => '.syd',
116
    '.pxxx.sea'     => '.sea',
117
    '.pxxx.syd'     => '.syd',
118
    '.pxxx.sydddd'  => '.syd',
119
    '.oslo'         => '.oso',
120
);
392 dpurdie 121
 
122
#-------------------------------------------------------------------------------
123
# Function        : Main Entry
124
#
125
# Description     :
126
#
127
# Inputs          :
128
#
129
# Returns         :
130
#
131
my $result = GetOptions (
132
                "help+"         => \$opt_help,          # flag, multiple use allowed
133
                "manual"        => \$opt_manual,        # flag
134
                "verbose+"      => \$opt_verbose,       # flag
135
                "test:s"        => \$opt_test,          # Test a version string
136
                "limit:n"       => \$opt_limit,         #
137
                "quick"         => \$opt_quick,         # Don't look for indirects
1197 dpurdie 138
                'mode:s'        => \$opt_mode,          # Mode of operation
392 dpurdie 139
                );
140
 
141
#
142
#   Process help and manual options
143
#
144
pod2usage(-verbose => 0, -message => "Version: $VERSION")  if ($opt_help == 1  || ! $result);
145
pod2usage(-verbose => 1)  if ($opt_help == 2 );
146
pod2usage(-verbose => 2)  if ($opt_manual || ($opt_help > 2));
1197 dpurdie 147
ErrorConfig( 'name'    =>'CC2SVN_GENDATA' );
392 dpurdie 148
 
149
if ( $opt_test )
150
{
151
    my @results = massageVersion( $opt_test, 'DummyName' );
152
    Message ("Version", $opt_test, @results);
153
    exit 1;
154
}
155
 
1197 dpurdie 156
#
157
#   Set up the mode
158
#   Must be specified
159
#
160
if ( $opt_mode eq 'all' ) {
161
    $doAllReleases = 1;
162
    $doIncludeOnly = 0;
163
 
164
} elsif ( $opt_mode eq 'hops' ) {
165
    $doAllReleases = 0;
166
    $doIncludeOnly = 1;
392 dpurdie 167
 
1197 dpurdie 168
} elsif ( $opt_mode eq 'standard' ) {
169
    $doAllReleases = 0;
170
    $doIncludeOnly = 0;
171
 
172
} else {
173
    Error ("Mode not specified: all, hops, standard");
174
}
175
 
392 dpurdie 176
GetAllPackageNames();
2548 dpurdie 177
getPackagesInSvn();
392 dpurdie 178
getReleaseDetails();
179
getPkgDetailsByRTAG_ID();
1197 dpurdie 180
my ($pcount, $vcount) = countPackages();
181
print "Directly referenced Packages: $pcount Versions: $vcount\n";
392 dpurdie 182
LocateStrays() unless ($opt_quick);
1197 dpurdie 183
($pcount, $vcount) = countPackages();
184
print "Indirectly referenced Packages: $pcount Versions: $vcount\n";
185
processData();
392 dpurdie 186
outputData();
187
 
188
if ( $opt_verbose > 1 )
189
{
190
    print "=========================================================================\n";
191
    DebugDumpData("Releases", \%Releases);
192
    print "=========================================================================\n";
193
    DebugDumpData("Packages", \%Packages );
194
    print "=========================================================================\n";
195
    DebugDumpData("Suffixes", \%Suffixes );
196
}
197
 
1197 dpurdie 198
($pcount, $vcount) = countPackages();
199
print "Total References Packages: $pcount Versions: $vcount\n";
392 dpurdie 200
exit;
201
 
202
#-------------------------------------------------------------------------------
2548 dpurdie 203
# Function        : getPackagesInSvn
204
#
205
# Description     : Determine packages that have been migrated
206
#                   Done by looking up RM for any version that has been migrated
207
#
208
# Inputs          : 
209
#
210
# Returns         : 
211
#
212
sub getPackagesInSvn
213
{
214
    my (@row);
215
 
216
    # if we are not or cannot connect then return 0 as we have not found anything
217
    connectRM(\$RM_DB) unless $RM_DB;
218
 
219
    # First get all packages that are referenced in a Release
220
    # This will only get the top level packages
221
    # From non-archived releases
222
 
223
    my $m_sqlstr = "SELECT UNIQUE" .
224
                        " pv.PKG_ID ".                                         #[0]
225
                   " FROM RELEASE_MANAGER.PACKAGE_VERSIONS pv".
226
                   " WHERE pv.VCS_TYPE_ID=23";
227
    my $sth = $RM_DB->prepare($m_sqlstr);
228
    if ( defined($sth) )
229
    {
230
        if ( $sth->execute( ) )
231
        {
232
#            print "--- Execute\n";
233
            if ( $sth->rows )
234
            {
235
                #print "--- Execute ROWS\n";
236
                while ( @row = $sth->fetchrow_array )
237
                {
238
                    my $id = $row[0];
239
                    next unless ( $id );
240
                    $AllPackages{$id}{inSvn} = 1;
241
#print "Data: @row\n";
242
                }
243
            }
244
#            print "--- Finish\n";
245
            $sth->finish();
246
        }
247
        else
248
        {
249
            Error("Execute failure: $m_sqlstr", $sth->errstr() );
250
        }
251
    }
252
    else
253
    {
254
        Error("Prepare failure" );
255
    }
256
 
257
}
258
 
259
#-------------------------------------------------------------------------------
392 dpurdie 260
# Function        : getReleaseDetails
261
#
262
# Description     : Determine all candiate releases
263
#
264
# Inputs          : 
265
#
266
# Returns         : 
267
#
268
sub getReleaseDetails
269
{
270
    my (@row);
271
 
272
    # if we are not or cannot connect then return 0 as we have not found anything
273
    connectRM(\$RM_DB) unless $RM_DB;
274
 
275
    # First get all packages that are referenced in a Release
276
    # This will only get the top level packages
277
    # From non-archived releases
278
 
279
    my $m_sqlstr = "SELECT prj.PROJ_NAME, rt.RTAG_NAME, rt.PROJ_ID, rt.RTAG_ID, rt.official" .
280
                   " FROM release_manager.release_tags rt, release_manager.projects prj" .
281
                   " WHERE prj.PROJ_ID = rt.PROJ_ID " .
1197 dpurdie 282
#                   "   AND rt.official != 'A' ".
283
#                   "   AND rt.official != 'Y'" .
392 dpurdie 284
                   " order by prj.PROJ_NAME";
285
    my $sth = $RM_DB->prepare($m_sqlstr);
286
    if ( defined($sth) )
287
    {
288
        if ( $sth->execute( ) )
289
        {
290
#            print "--- Execute\n";
291
            if ( $sth->rows )
292
            {
293
#                print "--- Execute ROWS\n";
294
                while ( @row = $sth->fetchrow_array )
295
                {
296
                    my $rtag_id =$row[3];
297
                    my $proj_id = $row[2];
298
 
299
                    $Releases{$rtag_id}{pName} = $row[0];
300
                    $Releases{$rtag_id}{name} = $row[1];
301
                    $Releases{$rtag_id}{proj_id} = $proj_id;
302
                    $Releases{$rtag_id}{rtag_id} = $rtag_id;
303
                    $Releases{$rtag_id}{official} = $row[4];
304
 
305
                    unless ( $doAllReleases )
306
                    {
307
                        if (grep {$_ eq $proj_id} @excludeProjects) {
308
                            $Releases{$rtag_id}{excluded} = 'E';
309
                        }
310
 
311
                        if (grep {$_ eq $rtag_id} @excludeReleases) {
312
                            $Releases{$rtag_id}{excluded} = 'E';
313
                        }
314
                    }
315
 
316
                    if ( $doIncludeOnly )
317
                    {
318
 
319
                        if (grep {$_ eq $proj_id} @includedProjects)
320
                        {
321
                            delete $Releases{$rtag_id}{excluded};
322
                        }
323
                        else
324
                        {
325
                            $Releases{$rtag_id}{excluded} = 'E';
326
                        }
327
 
328
                        if (grep {$_ eq $rtag_id} @includedReleases)
329
                        {
330
                            delete $Releases{$rtag_id}{excluded};
331
                        }
332
                    }
333
 
334
                    unshift @row, $Releases{$rtag_id}{excluded} || ' ';
335
                    print join (',',@row), "\n" if ($opt_verbose);
336
                }
337
            }
338
#            print "--- Finish\n";
339
            $sth->finish();
340
        }
341
        else
342
        {
343
            Error("Execute failure: $m_sqlstr", $sth->errstr() );
344
        }
345
    }
346
    else
347
    {
348
        Error("Prepare failure" );
349
    }
350
}
351
 
352
 
1197 dpurdie 353
sub getPkgDetailsByPVID
354
{
2553 dpurdie 355
    my (@plist) = @_;
1197 dpurdie 356
    my (@row);
357
 
358
    #
359
    #   Only do once
360
    #
2553 dpurdie 361
#    return if ( exists $Packages{$pv_id}{name} );
362
 
1197 dpurdie 363
    # if we are not or cannot connect then return 0 as we have not found anything
364
    connectRM(\$RM_DB) unless $RM_DB;
365
 
366
    my $m_sqlstr = "SELECT" .
367
                        " pv.PV_ID, ".                                          #[0]
368
                        " pkg.PKG_NAME, ".                                      #[1]
369
                        " pv.PKG_VERSION, ".                                    #[2]
370
                        " pv.DLOCKED," .                                        #[3]
371
                        " release_manager.PK_RMAPI.return_vcs_tag(pv.PV_ID), ". #[4]
372
                        " pv.PKG_ID," .                                         #[5]
2321 dpurdie 373
                        " pv.MODIFIED_STAMP, ".                                 #[6]
374
                        " pv.CREATOR_ID  ".                                     #[7]
1197 dpurdie 375
                   " FROM RELEASE_MANAGER.PACKAGE_VERSIONS pv,".
376
                   "      RELEASE_MANAGER.PACKAGES pkg ".
2553 dpurdie 377
                   " WHERE pv.PKG_ID = pkg.PKG_ID ".
378
                   "   AND pv.PV_ID in ( " . join(',', @plist) . "  )" ;
1197 dpurdie 379
    my $sth = $RM_DB->prepare($m_sqlstr);
380
    if ( defined($sth) )
381
    {
382
        if ( $sth->execute( ) )
383
        {
384
#            print "--- Execute\n";
385
            if ( $sth->rows )
386
            {
387
#                print "--- Execute ROWS\n";
388
                while ( @row = $sth->fetchrow_array )
389
                {
390
                    print join (',',@row), "\n" if ($opt_verbose);
391
 
392
                    my $pvid = $row[0];
393
                    $Packages{$pvid}{name} = $row[1];
2553 dpurdie 394
                    next if ( exists $Packages{$pvid}{version} );
395
 
1197 dpurdie 396
                    $Packages{$pvid}{version} = $row[2];
397
                    $Packages{$pvid}{locked} = $row[3];
398
                    $row[4] =~ tr~\\/~/~;
399
                    $Packages{$pvid}{vcstag} = $row[4];
400
                    $Packages{$pvid}{pkgid} = $row[5];
401
#                    $Packages{$pvid}{tlp} = 1;
402
                    ($Packages{$pvid}{suffix}, $Packages{$pvid}{fullVersion},$Packages{$pvid}{isaRipple} ) = massageVersion( $Packages{$pvid}{version}, $Packages{$pvid}{name} );
403
                    $Suffixes{$Packages{$pvid}{suffix}}++;
404
                    $Packages{$pvid}{Age} = ($now - str2time( $row[6] )) / (60 * 60 * 24);
2321 dpurdie 405
                    $Packages{$pvid}{Creator} = $row[7];
1197 dpurdie 406
                }
407
            }
408
#            print "--- Finish\n";
409
            $sth->finish();
410
        }
411
        else
412
        {
413
            Error("getPkgDetailsByPVID:Execute failure: $m_sqlstr", $sth->errstr() );
414
        }
415
    }
416
    else
417
    {
418
        Error("getPkgDetailsByPVID:Prepare failure" );
419
    }
420
}
421
 
422
 
392 dpurdie 423
sub getPkgDetailsByRTAG_ID
424
{
425
    my (@row);
426
    my $excludes = '';
427
    my $count = 0;
428
 
429
    # if we are not or cannot connect then return 0 as we have not found anything
430
    connectRM(\$RM_DB) unless $RM_DB;
431
 
432
    Message ("Extract toplevel dependencies");
433
 
434
    # First get all packages that are referenced in a Release
435
    # This will only get the top level packages
436
    # From non-archived releases
437
 
438
    unless ($doAllReleases)
439
    {
440
        foreach  ( @excludeProjects )
441
        {
442
            $excludes .= " AND prj.PROJ_ID != $_ ";
443
        }
444
        foreach  ( @excludeReleases )
445
        {
446
            $excludes .= " AND rt.RTAG_ID != $_ ";
447
        }
448
    }
449
 
1454 dpurdie 450
    my $m_sqlstr = "SELECT DISTINCT " .
451
                        "pv.PV_ID, " .                                          #[0]
452
                        "pkg.PKG_NAME, " .                                      #[1]
453
                        "pv.PKG_VERSION, " .                                    #[2]
454
                        "pv.DLOCKED, " .                                        #[3]
455
                        "release_manager.PK_RMAPI.return_vcs_tag(pv.PV_ID), " . #[4]
2016 dpurdie 456
                        "pv.PKG_ID," .                                          #[5]
1454 dpurdie 457
                        "rt.RTAG_ID, " .                                        #[6]
458
                        "rmv.VIEW_NAME, " .                                     #[7]
459
                        "pv.MODIFIED_STAMP, " .                                 #[8]
2321 dpurdie 460
                        "prj.PROJ_ID, " .                                       #[9]
461
                        "pv.CREATOR_ID " .                                     #[10]
392 dpurdie 462
                   " FROM RELEASE_MANAGER.RELEASE_CONTENT rc, RELEASE_MANAGER.PACKAGE_VERSIONS pv,".
463
                   "      RELEASE_MANAGER.PACKAGES pkg, release_manager.release_tags rt, release_manager.projects prj" .
464
                   "    , release_manager.views rmv" .
465
                   " WHERE rc.PV_ID = pv.PV_ID AND pv.PKG_ID = pkg.PKG_ID" .
466
                   "   AND rmv.VIEW_ID = rc.BASE_VIEW_ID" .
467
                   "   AND prj.PROJ_ID = rt.PROJ_ID and rt.RTAG_ID = rc.RTAG_ID" .
1197 dpurdie 468
#                   "   AND rt.official != 'A'" .
469
#                   "   AND rt.official != 'Y' " .
392 dpurdie 470
                   $excludes .
471
                   " order by pkg.PKG_NAME";
472
    my $sth = $RM_DB->prepare($m_sqlstr);
473
    if ( defined($sth) )
474
    {
475
        if ( $sth->execute( ) )
476
        {
477
#            print "--- Execute\n";
478
            if ( $sth->rows )
479
            {
480
#                print "--- Execute ROWS\n";
481
                while ( @row = $sth->fetchrow_array )
482
                {
2553 dpurdie 483
                    $count++;
392 dpurdie 484
                    print join (',',@row), "\n" if ($opt_verbose);
485
                    my $pvid = $row[0];
486
                    unless ( exists $Packages{$pvid}{name} )
487
                    {
488
                        $Packages{$pvid}{name} = $row[1];
489
                        $Packages{$pvid}{version} = $row[2];
490
                        $Packages{$pvid}{locked} = $row[3];
491
                        $row[4] =~ tr~\\/~/~;
492
                        $Packages{$pvid}{vcstag} = $row[4];
493
                        $Packages{$pvid}{pkgid} = $row[5];
494
                        $Packages{$pvid}{tlp} = 1;
495
                        ($Packages{$pvid}{suffix}, $Packages{$pvid}{fullVersion},$Packages{$pvid}{isaRipple} ) = massageVersion( $Packages{$pvid}{version}, $Packages{$pvid}{name} );
496
                        $Suffixes{$Packages{$pvid}{suffix}}++;
497
 
498
                        push @StrayPackages, $pvid;
499
                    }
500
 
501
                    my $rtag_id = $row[6];
502
                    push @{$Packages{$pvid}{release}}, $rtag_id;
503
                    $Packages{$pvid}{view}{$row[7]}++ if ( $row[7] );
504
 
505
                    $Packages{$pvid}{Age} = ($now - str2time( $row[8] )) / (60 * 60 * 24);
2321 dpurdie 506
                    $Packages{$pvid}{Creator} = $row[10];
392 dpurdie 507
 
508
                    my $proj_id = $row[9];
1197 dpurdie 509
                    push @{$Packages{$pvid}{projects}}, $proj_id
510
                        unless (grep {$_ eq $proj_id} @{$Packages{$pvid}{projects}});
392 dpurdie 511
 
512
                    if ( $doIncludeOnly )
513
                    {
514
                        if (grep {$_ eq $proj_id} @includedProjects)
515
                        {
516
                            $Packages{$pvid}{NamedProject} = 1;
517
                        }
518
                        if (grep {$_ eq $rtag_id} @includedReleases)
519
                        {
1197 dpurdie 520
                            $Packages{$pvid}{NamedProject} = 2;
392 dpurdie 521
                        }
522
                    }
523
                    else
524
                    {
1197 dpurdie 525
                        $Packages{$pvid}{NamedProject} = 3;
392 dpurdie 526
                    }
527
 
528
 
529
                    if ( $opt_limit )
530
                    {
2553 dpurdie 531
                        last if ( $count > $opt_limit );
392 dpurdie 532
                    }
533
                }
534
            }
535
#            print "--- Finish\n";
536
            $sth->finish();
537
        }
538
        else
539
        {
540
            Error("Execute failure: $m_sqlstr", $sth->errstr() );
541
        }
542
    }
543
    else
544
    {
545
        Error("Prepare failure" );
546
    }
2553 dpurdie 547
 
548
    Message ("Extract toplevel dependencies: $count rows");
392 dpurdie 549
}
550
 
551
#-------------------------------------------------------------------------------
552
# Function        : GetDepends
553
#
554
# Description     :
555
#
2553 dpurdie 556
# Inputs          : @plist          - list of pvid's to process
392 dpurdie 557
#
558
# Returns         :
559
#
560
sub GetDepends
561
{
2553 dpurdie 562
    my (@plist) = @_;
392 dpurdie 563
 
564
    #
1197 dpurdie 565
    #   Ensure we have package information
566
    #
2553 dpurdie 567
    getPkgDetailsByPVID( @plist );
568
#    return if ( $Packages{$pv_id}{depend} );
569
#    $Packages{$pv_id}{depend} = 1;
1197 dpurdie 570
 
571
    #
392 dpurdie 572
    #   Now extract the package dependacies
1197 dpurdie 573
    #   There may not be any
392 dpurdie 574
    #
1197 dpurdie 575
    my $m_sqlstr = "SELECT ".
576
                    " pd.PV_ID, ".
577
                    " pd.DPV_ID " .
578
                  " FROM    RELEASE_MANAGER.PACKAGE_DEPENDENCIES pd ".
2553 dpurdie 579
                  " WHERE pd.PV_ID in ( " . join(',', @plist) . " )";
392 dpurdie 580
    my $sth = $RM_DB->prepare($m_sqlstr);
581
    if ( defined($sth) )
582
    {
583
        if ( $sth->execute( ) )
584
        {
585
            if ( $sth->rows )
586
            {
587
                while ( my @row = $sth->fetchrow_array )
588
                {
589
                    my $pvid = $row[0];
1197 dpurdie 590
                    my $dpvid = $row[1];
591
                    push @StrayPackages, $dpvid;
592
                    push @{$Packages{$dpvid}{usedBy}}, $pvid;
392 dpurdie 593
                }
594
            }
595
            $sth->finish();
596
        }
597
        else
598
        {
1197 dpurdie 599
            Error("GetDepends:Execute failure: $m_sqlstr", $sth->errstr() );
392 dpurdie 600
        }
601
    }
602
    else
603
    {
604
        Error("GetDepends:Prepare failure" );
605
    }
606
}
607
 
608
#-------------------------------------------------------------------------------
609
# Function        : GetAllPackageNames
610
#
611
# Description     :
612
#
613
# Inputs          : None
614
#
615
# Returns         :
616
#
617
sub GetAllPackageNames
618
{
619
    # if we are not or cannot connect then return 0 as we have not found anything
620
    connectRM(\$RM_DB) unless $RM_DB;
621
 
622
    #
623
    #   Now extract all the package names
624
    #
625
    my $m_sqlstr = "SELECT pkg.PKG_ID, pkg.PKG_NAME" .
626
                  " FROM RELEASE_MANAGER.PACKAGES pkg";
627
    my $sth = $RM_DB->prepare($m_sqlstr);
628
    if ( defined($sth) )
629
    {
630
        if ( $sth->execute( ) )
631
        {
632
            if ( $sth->rows )
633
            {
634
                while ( my @row = $sth->fetchrow_array )
635
                {
636
                    my $id = $row[0];
637
                    my $name = $row[1];
638
                    next unless ( $id );
2548 dpurdie 639
                    $AllPackages{$id}{name} = $name;
392 dpurdie 640
                }
641
            }
642
            $sth->finish();
643
        }
644
        else
645
        {
646
        Error("GetAllPackageNames:Execute failure" );
647
        }
648
    }
649
    else
650
    {
651
        Error("GetAllPackageNames:Prepare failure" );
652
    }
653
}
654
 
655
 
656
#-------------------------------------------------------------------------------
657
# Function        : massageVersion
658
#
659
# Description     : Process a version number and return usful bits
660
#
661
# Inputs          : Version Number
662
#                   Package Name - debug only
663
#
664
# Returns         : An array
665
#                       suffix
666
#                       multipart version string useful for text comparisons
667
#
668
sub massageVersion
669
{
670
    my ($version, $name) = @_;
671
    my ($major, $minor, $patch, $build, $suffix);
672
    my $result;
1197 dpurdie 673
    my $buildVersion;
392 dpurdie 674
    my $isaRipple;
675
    my $isaWIP;
676
    $build = 0;
677
 
1197 dpurdie 678
#print "--- $name, $version\n";
679
    $version =~ s~^_~~;
680
    $version =~ s~^\Q${name}\E_~~;
681
 
392 dpurdie 682
    #
683
    #   Pre-massage some silly ones
684
    #
685
    if ( exists $sillyVersions{$version} ) {
686
        $version = $sillyVersions{$version};
687
    }
688
 
1197 dpurdie 689
    if ( $name eq 'ReleaseName' ) {
690
        $version =~ s~[a-z]~.~g;
691
        $version =~ s~\.+~.~g;
692
        $version =~ s~\.$~~g
693
    }
392 dpurdie 694
 
1197 dpurdie 695
    #
696
    #   xxxxxxxxx.nnnn.cots
697
    #
392 dpurdie 698
    if ( $version =~ m~(.*)\.cots$~ ) {
699
        my $cots_base = $1;
700
        $suffix = '.cots';
701
        if ( $version =~ m~(.*?)\.([0-9]{4})\.cots$~ )
702
        {
703
            $result = $1 . sprintf (".%4.4d", $2) . $suffix;
704
        }
705
        else
706
        {
707
            $result = $cots_base . '.0000.cots';
708
        }
709
    }
710
    #
711
    #   Convert version into full form for comparisions
712
    #       nnn.nnn.nnn.[p]nnn.xxx
713
    #       nnn.nnn.nnn.[p]nnn-xxx
714
    #       nnn.nnn.nnn-[p]nnn.xxx
715
    #       nnn.nnn.nnn-[p]nnn-xxx
716
    #       nnn.nnn.nnn[p]nnn-xxx
1197 dpurdie 717
    #   Don't flag as ripples - they are patches
392 dpurdie 718
    #
719
    elsif ( $version =~ m~^(\d+)\.(\d+)\.(\d+)[-.p][p]?(\d+)([-.](.*))?$~ ) {
720
        $major = $1;
721
        $minor = $2;
722
        $patch = $3;
723
        $build = $4;
724
        $suffix = defined $6 ? ".$6" : '';
1197 dpurdie 725
        $isaRipple = 0;
392 dpurdie 726
    }
727
    #
728
    #       nn.nnn.nnnnn.xxx
729
    #       nn.nnn.nnnnn-xxx
1197 dpurdie 730
    #       nnn.nnn.nnnx.xxx
731
    #   Don't flag as ripples - they are patches
392 dpurdie 732
    #
1197 dpurdie 733
    elsif ( $version =~ m~^(\d+)\.(\d+)\.(\d+)\w?([-.](.*))?$~ ) {
392 dpurdie 734
        $major = $1;
735
        $minor = $2;
736
        $patch = $3;
737
        if ( length( $patch) >= 4 )
738
        {
739
            $build = substr( $patch, -3 ,3);
740
            $patch = substr( $patch,  0 ,length($patch)-3);
741
        }
742
        $suffix = defined $5 ? ".$5" : '';
743
    }
1197 dpurdie 744
 
392 dpurdie 745
    #
1197 dpurdie 746
    #       nnn.nnn.nnn
747
    #       nnn.nnn-nnn
748
    #       nnn.nnn_nnn
392 dpurdie 749
    #
1197 dpurdie 750
    elsif ( $version =~ m~^(\d+)\.(\d+)[-._](\d+)$~ ) {
392 dpurdie 751
        $major = $1;
752
        $minor = $2;
753
        $patch = $3;
754
        $suffix = '';
755
    }
1197 dpurdie 756
 
392 dpurdie 757
    #
1197 dpurdie 758
    #       nnn.nnn.nnn.nnn
759
    #       nnn.nnn.nnn-nnn
760
    #       nnn.nnn.nnn_nnn
392 dpurdie 761
    #
1197 dpurdie 762
    elsif ( $version =~ m~^(\d+)\.(\d+)\.(\d+)[-._](\d+)$~ ) {
392 dpurdie 763
        $major = $1;
764
        $minor = $2;
765
        $patch = $3;
1197 dpurdie 766
        $build = $4;
392 dpurdie 767
        $suffix = '';
1197 dpurdie 768
        $isaRipple = 0;
392 dpurdie 769
    }
1197 dpurdie 770
 
392 dpurdie 771
 
772
    #
773
    #       nnn.nnn
774
    #
775
    elsif ( $version =~ m~^(\d+)\.(\d+)$~ ) {
776
        $major = $1;
777
        $minor = $2;
778
        $patch = 0;
779
        $suffix = '';
780
    }
781
    #
1197 dpurdie 782
    #       nnn.nnn.xxx
783
    #
784
    elsif ( $version =~ m~^(\d+)\.(\d+)(\.\w+)$~ ) {
785
        $major = $1;
786
        $minor = $2;
787
        $patch = 0;
788
        $suffix = $3;
789
    }
790
 
791
    #
392 dpurdie 792
    #       nnn.nnn.nnnz
793
    #
794
    elsif ( $version =~ m~^(\d+)\.(\d+)\.(\d+)([a-z])$~ ) {
795
        $major = $1;
796
        $minor = $2;
797
        $patch = $3;
798
        $build = ord($4) - ord('a');
799
        $suffix = '.cots';
1197 dpurdie 800
        $isaRipple = 0;
392 dpurdie 801
    }
802
    #
803
    #       ???REV=???
804
    #
805
    elsif ( $version =~ m~REV=~ ) {
806
        $suffix = '.cots';
807
        $result = $version . '.0000.cots';
808
    }
809
 
810
    #
811
    #   Wip Packages
1197 dpurdie 812
    #   (nnnnnn).xxx
392 dpurdie 813
    #   Should be essential, but want to sort very low
814
    #
1197 dpurdie 815
    elsif ($version =~ m~\((.*)\)(\..*)?~) {
816
        $suffix = $2 || '';
817
        $result = "000.000.000.000$suffix";
392 dpurdie 818
        $isaWIP = 1;
819
    }
1197 dpurdie 820
 
392 dpurdie 821
    #
1197 dpurdie 822
    #   !current
392 dpurdie 823
    #
1197 dpurdie 824
    elsif ($version eq '!current' || $version eq 'current_$USER' || $version eq 'current' || $version eq 'beta' || $version eq 'latest' || $version eq 'beta.cr' || $version eq 'CREATE') {
825
        $suffix = '';
826
        $result = "000.000.000.000$suffix";
827
        $isaWIP = 1;
828
    }
829
 
830
    #
831
    #   Also WIP: FINRUN.103649.BEI.WIP
832
    elsif ($version =~ m~(\.[a-zA-Z]+)\.WIP$~) {
833
        $suffix = lc($1);
834
        $result = "000.000.000.000$suffix";
835
        $isaWIP = 1;
836
    }
837
 
838
    #
839
    #   Also ERGOFSSLS190100_015
840
    #   Don't flag as a ripple
841
    elsif ($version =~ m~^ERG[A-Z]+(\d\d)(\d\d)(\d\d)[-_](\d+)(\.\w+)?$~) {
842
        $major = $1;
843
        $minor = $2;
844
        $patch = $3;
845
        $build = $4;
846
        $suffix = $5 || '.sls';
847
        $isaRipple = 0;
848
    }
849
 
850
    #
851
    #   Stuff we don't yet handle
852
    #
392 dpurdie 853
    else  {
1197 dpurdie 854
        Warning ("Unknown version number: $name,$version");
392 dpurdie 855
        $version =~ m~(\.\w+)$~;
856
        $suffix = $1 || '';
857
        $result = $version;
858
    }
859
 
1197 dpurdie 860
    $isaRipple = ($build > 0) unless defined $isaRipple;
392 dpurdie 861
    unless ( $result )
862
    {
1197 dpurdie 863
        # Major and minor of 99.99 are normally funny versions
864
        # Don't make important decisions on them
865
        #
866
        if (defined $major && defined $minor && $major == 99 && $minor == 99 )
867
        {
868
            $major = 0;
869
            $minor = 0;
870
            $patch = 0;
871
        }
872
 
392 dpurdie 873
        $result = sprintf("%3.3d.%3.3d.%3.3d.%3.3d%s", $major,$minor,$patch,$build,$suffix || '.0000');
1197 dpurdie 874
        $buildVersion = [ $major, $minor, $patch, $build ];
392 dpurdie 875
    }
876
 
1197 dpurdie 877
    $suffix = lc( $suffix );
878
    if ( exists $suffixFixup{$suffix} )
879
    {
880
        $suffix = $suffixFixup{$suffix} ;
881
    }
392 dpurdie 882
 
1197 dpurdie 883
    return ($suffix, $result, $isaRipple, $isaWIP, $buildVersion );
392 dpurdie 884
}
885
 
886
 
887
#-------------------------------------------------------------------------------
888
# Function        : LocateStrays
889
#
2548 dpurdie 890
# Description     : Locate stray packages
891
#                   Try to do several at a time to speed up processing
392 dpurdie 892
#
893
# Inputs          :
894
#
895
# Returns         :
896
#
897
sub LocateStrays
898
{
899
    Message ("Locate indirectly referenced packages");
900
    while ( $#StrayPackages >= 0 )
901
    {
2553 dpurdie 902
#print "Strays Remaining: ", scalar @StrayPackages ,"\n";
392 dpurdie 903
 
2553 dpurdie 904
        my @plist;
905
        while ( $#plist <= 200 && @StrayPackages )
906
        {
907
            my $pv_id = pop @StrayPackages;
908
            next if ( exists $Packages{$pv_id}{done} );
909
            push @plist, $pv_id;
910
        }
911
 
912
        GetDepends(@plist) if @plist;
913
 
914
        foreach ( @plist)
915
        {
916
            $Packages{$_}{done} = 1;
917
        }
392 dpurdie 918
    }
919
}
920
 
921
#-------------------------------------------------------------------------------
1197 dpurdie 922
# Function        : countPackages
392 dpurdie 923
#
1197 dpurdie 924
# Description     : 
392 dpurdie 925
#
926
# Inputs          : 
927
#
1197 dpurdie 928
# Returns         : Number of packages and number oof versions
392 dpurdie 929
#
1197 dpurdie 930
sub countPackages
392 dpurdie 931
{
1197 dpurdie 932
    my $v = 0;
933
    my $p = 0;
934
    my %names;
392 dpurdie 935
 
1197 dpurdie 936
    foreach ( keys %Packages )
937
    {
938
        my $name = $Packages{$_}{name};
939
        next unless ( $name );
940
        $names{$name} = 1;
941
        $v++;
942
    }
392 dpurdie 943
 
1197 dpurdie 944
    $p = keys %names;
945
 
946
    return $p,$v;
947
 
948
}
949
 
950
#-------------------------------------------------------------------------------
951
# Function        : processData
952
#
953
# Description     : Process data before its written out
954
#                       Remove a few packages that we do not want to now about
955
#                       Determine Reason that a version is in the list
956
#                       Finish taging packages in NamedProject
957
#
958
# Inputs          : 
959
#
960
# Returns         : 
961
#
962
sub processData
963
{
392 dpurdie 964
    foreach ( keys %Packages )
965
    {
966
        delete $Packages{$_}{done};
967
        next if ( $Packages{$_}{name} =~ ~m~CSWcfengine~ );
968
 
969
        if ($Packages{$_}{name} eq 'Activestate Perl - Solaris')
970
        {
971
            delete $Packages{$_};
972
            next;
973
        }
974
 
975
        if ( $Packages{$_}{name} =~ m/^CSW/ || $Packages{$_}{name} =~ m/^Solaris$/)
976
        {
977
            delete $Packages{$_};
978
            next;
979
        }
980
 
981
        if ( $Packages{$_}{name} =~ m/^jats_/)
982
        {
983
            delete $Packages{$_};
984
            next;
985
        }
1197 dpurdie 986
 
987
 
988
        #
989
        #   Catch packages that are dependents of NamedProject's
990
        #
991
        if ( $doIncludeOnly )
992
        {
993
            if ( exists  $Packages{$_}{'sbomBase'} || exists  $Packages{$_}{'sbomOsid'} )
994
            {
995
                $Packages{$_}{NamedProject} = 4;
996
            }
997
 
998
            unless ( $Packages{$_}{NamedProject}  )
999
            {
1000
                my $named;
1001
                my %usedBy;
1002
 
1003
                if ( exists $Packages{$_}{'usedBy'})
1004
                {
1005
                    my @examineThese = @{$Packages{$_}{'usedBy'}};
1006
                    while ( @examineThese )
1007
                    {
1008
                        my $pvid = pop @examineThese;
1009
                        next if ( $usedBy{$pvid} );
1010
 
1011
                        if ( $Packages{$pvid}{NamedProject}  )
1012
                        {
1013
                            $named = 1;
1014
                            last;
1015
                        }
1016
 
1017
                        push @examineThese, @{$Packages{$pvid}{'usedBy'}}
1018
                            if (exists $Packages{$pvid}{'usedBy'});
1019
                    }
1020
                    $Packages{$_}{NamedProject} = 5
1021
                        if ( $named );
1022
                }
1023
#                else
1024
#                {
1025
#                    Warning("Not Named and not usedBy: $Packages{$_}{name} $Packages{$_}{'version'}");
1026
#                }
1027
            }
1028
        }
1029
        else
1030
        {
1031
            $Packages{$_}{NamedProject} = 6;
1032
        }
392 dpurdie 1033
    }
1197 dpurdie 1034
}
392 dpurdie 1035
 
1197 dpurdie 1036
#-------------------------------------------------------------------------------
1037
# Function        : outputData
1038
#
1039
# Description     : Write out data in a form to allow post processing
1040
#
1041
# Inputs          : 
1042
#
1043
# Returns         : 
1044
#
1045
sub outputData
1046
{
1047
    my $file = "cc2svn.raw.txt";
1048
    Message ("Create: $file");
1049
    my $fh = ConfigurationFile::New( $file );
1050
 
392 dpurdie 1051
    $fh->DumpData(
1197 dpurdie 1052
        "\n# Releases.\n#\n",
1053
        "ScmReleases", \%Releases );
1054
 
1055
    $fh->DumpData(
392 dpurdie 1056
        "\n# Packages.\n#\n",
1057
        "ScmPackages", \%Packages );
1058
 
1059
    $fh->DumpData(
1060
        "\n# Suffixes.\n#\n",
1061
        "ScmSuffixes", \%Suffixes );
1062
 
1063
    $fh->DumpData(
1064
        "\n# All Package Names.\n#\n",
1065
        "ScmAllPackages", \%AllPackages );
1066
 
1067
    #
1068
    #   Close out the file
1069
    #
1070
    $fh->Close();
1071
 
1072
#    #
1073
#    #   Split up package data into small files for easy consumption
1074
#    #
1075
#
1076
#    foreach ( keys %Packages )
1077
#    {
1078
#        my $file = "cc2svn.raw.${_}.txt";
1079
#        Message ("Create: $file");
1080
#        my $fh = ConfigurationFile::New( $file );
1081
#
1082
#        $fh->DumpData(
1083
#            "\n# Releases.\n#\n",
1084
#            "ScmReleases", \$Packages{$_} );
1085
#        $fh->Close();
1086
#    }
1087
 
1088
}
1089
 
1090
 
1091
#-------------------------------------------------------------------------------
1092
#   Documentation
1093
#
1094
 
1095
=pod
1096
 
1097
=for htmltoc    SYSUTIL::cc2svn::
1098
 
1099
=head1 NAME
1100
 
1101
cc2svn_gendata - Extract CC2SVN Essential Package Data from Release Manager
1102
 
1103
=head1 SYNOPSIS
1104
 
1105
  jats cc2svn_gendata [options]
1106
 
1107
 Options:
1108
    -help              - brief help message
1109
    -help -help        - Detailed help message
1110
    -man               - Full documentation
1111
    -test=version      - Test a version string, then exit
1112
    -limit=n           - Limit packages processed. Test only
1197 dpurdie 1113
    -mode=xxx          - Set Mode: all, hops, standard
392 dpurdie 1114
 
1115
=head1 OPTIONS
1116
 
1117
=over 8
1118
 
1119
=item B<-help>
1120
 
1121
Print a brief help message and exits.
1122
 
1123
=item B<-help -help>
1124
 
1125
Print a detailed help message with an explanation for each option.
1126
 
1127
=item B<-man>
1128
 
1129
Prints the manual page and exits.
1130
 
1131
=item B<-test=version>
1132
 
1133
Examine a package version string and report how the tool will parse it.
1134
 
1135
=item B<-limit=n>
1136
 
1137
Limit the number of packages processed by the tool. This is only used to
1138
simplify testing of the program
1139
 
1140
=back
1141
 
1142
=head1 DESCRIPTION
1143
 
1144
This program is a tool used in the conversion of ClearCase VOBS to subversion.
1145
It will:
1146
 
1147
=over 8
1148
 
1149
=item *
1150
 
1151
Determine all Releases in Release manager and mark those that
1152
are to be excluded.
1153
 
1154
=item *
1155
 
1156
Determine all the package-versions used by the releases that are
1157
not excluded. These are called 'direct' dependencies.
1158
 
1159
=item *
1160
 
1161
Recursively find all the dependent packages of all packages. New package
1162
versions are called 'indirect' dependencies. They are buried. This process can
1163
take several minutes.
1164
 
1165
=back
1166
 
1167
The data collected is dumped into a text file for later processing.
1168
 
1169
=cut
1170