Subversion Repositories DevTools

Rev

Rev 2476 | Rev 2553 | 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
{
355
    my ($pv_id) = @_;
356
    my (@row);
357
 
358
    #
359
    #   Only do once
360
    #
361
    return if ( exists $Packages{$pv_id}{name} );
362
 
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 ".
377
                   " WHERE pv.PV_ID = \'$pv_id\' ".
378
                   "   AND pv.PKG_ID = pkg.PKG_ID" ;
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];
394
                    $Packages{$pvid}{version} = $row[2];
395
                    $Packages{$pvid}{locked} = $row[3];
396
                    $row[4] =~ tr~\\/~/~;
397
                    $Packages{$pvid}{vcstag} = $row[4];
398
                    $Packages{$pvid}{pkgid} = $row[5];
399
#                    $Packages{$pvid}{tlp} = 1;
400
                    ($Packages{$pvid}{suffix}, $Packages{$pvid}{fullVersion},$Packages{$pvid}{isaRipple} ) = massageVersion( $Packages{$pvid}{version}, $Packages{$pvid}{name} );
401
                    $Suffixes{$Packages{$pvid}{suffix}}++;
402
                    $Packages{$pvid}{Age} = ($now - str2time( $row[6] )) / (60 * 60 * 24);
2321 dpurdie 403
                    $Packages{$pvid}{Creator} = $row[7];
1197 dpurdie 404
                }
405
            }
406
#            print "--- Finish\n";
407
            $sth->finish();
408
        }
409
        else
410
        {
411
            Error("getPkgDetailsByPVID:Execute failure: $m_sqlstr", $sth->errstr() );
412
        }
413
    }
414
    else
415
    {
416
        Error("getPkgDetailsByPVID:Prepare failure" );
417
    }
418
}
419
 
420
 
392 dpurdie 421
sub getPkgDetailsByRTAG_ID
422
{
423
    my (@row);
424
    my $excludes = '';
425
    my $count = 0;
426
 
427
    # if we are not or cannot connect then return 0 as we have not found anything
428
    connectRM(\$RM_DB) unless $RM_DB;
429
 
430
    Message ("Extract toplevel dependencies");
431
 
432
    # First get all packages that are referenced in a Release
433
    # This will only get the top level packages
434
    # From non-archived releases
435
 
436
    unless ($doAllReleases)
437
    {
438
        foreach  ( @excludeProjects )
439
        {
440
            $excludes .= " AND prj.PROJ_ID != $_ ";
441
        }
442
        foreach  ( @excludeReleases )
443
        {
444
            $excludes .= " AND rt.RTAG_ID != $_ ";
445
        }
446
    }
447
 
1454 dpurdie 448
    my $m_sqlstr = "SELECT DISTINCT " .
449
                        "pv.PV_ID, " .                                          #[0]
450
                        "pkg.PKG_NAME, " .                                      #[1]
451
                        "pv.PKG_VERSION, " .                                    #[2]
452
                        "pv.DLOCKED, " .                                        #[3]
453
                        "release_manager.PK_RMAPI.return_vcs_tag(pv.PV_ID), " . #[4]
2016 dpurdie 454
                        "pv.PKG_ID," .                                          #[5]
1454 dpurdie 455
                        "rt.RTAG_ID, " .                                        #[6]
456
                        "rmv.VIEW_NAME, " .                                     #[7]
457
                        "pv.MODIFIED_STAMP, " .                                 #[8]
2321 dpurdie 458
                        "prj.PROJ_ID, " .                                       #[9]
459
                        "pv.CREATOR_ID " .                                     #[10]
392 dpurdie 460
                   " FROM RELEASE_MANAGER.RELEASE_CONTENT rc, RELEASE_MANAGER.PACKAGE_VERSIONS pv,".
461
                   "      RELEASE_MANAGER.PACKAGES pkg, release_manager.release_tags rt, release_manager.projects prj" .
462
                   "    , release_manager.views rmv" .
463
                   " WHERE rc.PV_ID = pv.PV_ID AND pv.PKG_ID = pkg.PKG_ID" .
464
                   "   AND rmv.VIEW_ID = rc.BASE_VIEW_ID" .
465
                   "   AND prj.PROJ_ID = rt.PROJ_ID and rt.RTAG_ID = rc.RTAG_ID" .
1197 dpurdie 466
#                   "   AND rt.official != 'A'" .
467
#                   "   AND rt.official != 'Y' " .
392 dpurdie 468
                   $excludes .
469
                   " order by pkg.PKG_NAME";
470
    my $sth = $RM_DB->prepare($m_sqlstr);
471
    if ( defined($sth) )
472
    {
473
        if ( $sth->execute( ) )
474
        {
475
#            print "--- Execute\n";
476
            if ( $sth->rows )
477
            {
478
#                print "--- Execute ROWS\n";
479
                while ( @row = $sth->fetchrow_array )
480
                {
481
                    print join (',',@row), "\n" if ($opt_verbose);
482
                    my $pvid = $row[0];
483
                    unless ( exists $Packages{$pvid}{name} )
484
                    {
485
                        $Packages{$pvid}{name} = $row[1];
486
                        $Packages{$pvid}{version} = $row[2];
487
                        $Packages{$pvid}{locked} = $row[3];
488
                        $row[4] =~ tr~\\/~/~;
489
                        $Packages{$pvid}{vcstag} = $row[4];
490
                        $Packages{$pvid}{pkgid} = $row[5];
491
                        $Packages{$pvid}{tlp} = 1;
492
                        ($Packages{$pvid}{suffix}, $Packages{$pvid}{fullVersion},$Packages{$pvid}{isaRipple} ) = massageVersion( $Packages{$pvid}{version}, $Packages{$pvid}{name} );
493
                        $Suffixes{$Packages{$pvid}{suffix}}++;
494
 
495
                        push @StrayPackages, $pvid;
496
                    }
497
 
498
                    my $rtag_id = $row[6];
499
                    push @{$Packages{$pvid}{release}}, $rtag_id;
500
                    $Packages{$pvid}{view}{$row[7]}++ if ( $row[7] );
501
 
502
                    $Packages{$pvid}{Age} = ($now - str2time( $row[8] )) / (60 * 60 * 24);
2321 dpurdie 503
                    $Packages{$pvid}{Creator} = $row[10];
392 dpurdie 504
 
505
                    my $proj_id = $row[9];
1197 dpurdie 506
                    push @{$Packages{$pvid}{projects}}, $proj_id
507
                        unless (grep {$_ eq $proj_id} @{$Packages{$pvid}{projects}});
392 dpurdie 508
 
509
                    if ( $doIncludeOnly )
510
                    {
511
                        if (grep {$_ eq $proj_id} @includedProjects)
512
                        {
513
                            $Packages{$pvid}{NamedProject} = 1;
514
                        }
515
                        if (grep {$_ eq $rtag_id} @includedReleases)
516
                        {
1197 dpurdie 517
                            $Packages{$pvid}{NamedProject} = 2;
392 dpurdie 518
                        }
519
                    }
520
                    else
521
                    {
1197 dpurdie 522
                        $Packages{$pvid}{NamedProject} = 3;
392 dpurdie 523
                    }
524
 
525
 
526
                    if ( $opt_limit )
527
                    {
528
                        last if ( $count++ > $opt_limit );
529
                    }
530
                }
531
            }
532
#            print "--- Finish\n";
533
            $sth->finish();
534
        }
535
        else
536
        {
537
            Error("Execute failure: $m_sqlstr", $sth->errstr() );
538
        }
539
    }
540
    else
541
    {
542
        Error("Prepare failure" );
543
    }
544
}
545
 
546
#-------------------------------------------------------------------------------
547
# Function        : GetDepends
548
#
549
# Description     :
550
#
551
# Inputs          : $pvid
552
#
553
# Returns         :
554
#
555
sub GetDepends
556
{
557
    my ($pv_id ) = @_;
558
 
559
    #
1197 dpurdie 560
    #   Ensure we have package information
561
    #
562
    getPkgDetailsByPVID( $pv_id );
563
    return if ( $Packages{$pv_id}{depend} );
564
    $Packages{$pv_id}{depend} = 1;
565
 
566
    #
392 dpurdie 567
    #   Now extract the package dependacies
1197 dpurdie 568
    #   There may not be any
392 dpurdie 569
    #
1197 dpurdie 570
    my $m_sqlstr = "SELECT ".
571
                    " pd.PV_ID, ".
572
                    " pd.DPV_ID " .
573
                  " FROM    RELEASE_MANAGER.PACKAGE_DEPENDENCIES pd ".
574
                  " WHERE pd.PV_ID = \'$pv_id\'";
392 dpurdie 575
    my $sth = $RM_DB->prepare($m_sqlstr);
576
    if ( defined($sth) )
577
    {
578
        if ( $sth->execute( ) )
579
        {
580
            if ( $sth->rows )
581
            {
582
                while ( my @row = $sth->fetchrow_array )
583
                {
584
                    my $pvid = $row[0];
1197 dpurdie 585
                    my $dpvid = $row[1];
586
                    push @StrayPackages, $dpvid;
587
                    push @{$Packages{$dpvid}{usedBy}}, $pvid;
392 dpurdie 588
                }
589
            }
590
            $sth->finish();
591
        }
592
        else
593
        {
1197 dpurdie 594
            Error("GetDepends:Execute failure: $m_sqlstr", $sth->errstr() );
392 dpurdie 595
        }
596
    }
597
    else
598
    {
599
        Error("GetDepends:Prepare failure" );
600
    }
601
}
602
 
603
#-------------------------------------------------------------------------------
604
# Function        : GetAllPackageNames
605
#
606
# Description     :
607
#
608
# Inputs          : None
609
#
610
# Returns         :
611
#
612
sub GetAllPackageNames
613
{
614
    # if we are not or cannot connect then return 0 as we have not found anything
615
    connectRM(\$RM_DB) unless $RM_DB;
616
 
617
    #
618
    #   Now extract all the package names
619
    #
620
    my $m_sqlstr = "SELECT pkg.PKG_ID, pkg.PKG_NAME" .
621
                  " FROM RELEASE_MANAGER.PACKAGES pkg";
622
    my $sth = $RM_DB->prepare($m_sqlstr);
623
    if ( defined($sth) )
624
    {
625
        if ( $sth->execute( ) )
626
        {
627
            if ( $sth->rows )
628
            {
629
                while ( my @row = $sth->fetchrow_array )
630
                {
631
                    my $id = $row[0];
632
                    my $name = $row[1];
633
                    next unless ( $id );
2548 dpurdie 634
                    $AllPackages{$id}{name} = $name;
392 dpurdie 635
                }
636
            }
637
            $sth->finish();
638
        }
639
        else
640
        {
641
        Error("GetAllPackageNames:Execute failure" );
642
        }
643
    }
644
    else
645
    {
646
        Error("GetAllPackageNames:Prepare failure" );
647
    }
648
}
649
 
650
 
651
#-------------------------------------------------------------------------------
652
# Function        : massageVersion
653
#
654
# Description     : Process a version number and return usful bits
655
#
656
# Inputs          : Version Number
657
#                   Package Name - debug only
658
#
659
# Returns         : An array
660
#                       suffix
661
#                       multipart version string useful for text comparisons
662
#
663
sub massageVersion
664
{
665
    my ($version, $name) = @_;
666
    my ($major, $minor, $patch, $build, $suffix);
667
    my $result;
1197 dpurdie 668
    my $buildVersion;
392 dpurdie 669
    my $isaRipple;
670
    my $isaWIP;
671
    $build = 0;
672
 
1197 dpurdie 673
#print "--- $name, $version\n";
674
    $version =~ s~^_~~;
675
    $version =~ s~^\Q${name}\E_~~;
676
 
392 dpurdie 677
    #
678
    #   Pre-massage some silly ones
679
    #
680
    if ( exists $sillyVersions{$version} ) {
681
        $version = $sillyVersions{$version};
682
    }
683
 
1197 dpurdie 684
    if ( $name eq 'ReleaseName' ) {
685
        $version =~ s~[a-z]~.~g;
686
        $version =~ s~\.+~.~g;
687
        $version =~ s~\.$~~g
688
    }
392 dpurdie 689
 
1197 dpurdie 690
    #
691
    #   xxxxxxxxx.nnnn.cots
692
    #
392 dpurdie 693
    if ( $version =~ m~(.*)\.cots$~ ) {
694
        my $cots_base = $1;
695
        $suffix = '.cots';
696
        if ( $version =~ m~(.*?)\.([0-9]{4})\.cots$~ )
697
        {
698
            $result = $1 . sprintf (".%4.4d", $2) . $suffix;
699
        }
700
        else
701
        {
702
            $result = $cots_base . '.0000.cots';
703
        }
704
    }
705
    #
706
    #   Convert version into full form for comparisions
707
    #       nnn.nnn.nnn.[p]nnn.xxx
708
    #       nnn.nnn.nnn.[p]nnn-xxx
709
    #       nnn.nnn.nnn-[p]nnn.xxx
710
    #       nnn.nnn.nnn-[p]nnn-xxx
711
    #       nnn.nnn.nnn[p]nnn-xxx
1197 dpurdie 712
    #   Don't flag as ripples - they are patches
392 dpurdie 713
    #
714
    elsif ( $version =~ m~^(\d+)\.(\d+)\.(\d+)[-.p][p]?(\d+)([-.](.*))?$~ ) {
715
        $major = $1;
716
        $minor = $2;
717
        $patch = $3;
718
        $build = $4;
719
        $suffix = defined $6 ? ".$6" : '';
1197 dpurdie 720
        $isaRipple = 0;
392 dpurdie 721
    }
722
    #
723
    #       nn.nnn.nnnnn.xxx
724
    #       nn.nnn.nnnnn-xxx
1197 dpurdie 725
    #       nnn.nnn.nnnx.xxx
726
    #   Don't flag as ripples - they are patches
392 dpurdie 727
    #
1197 dpurdie 728
    elsif ( $version =~ m~^(\d+)\.(\d+)\.(\d+)\w?([-.](.*))?$~ ) {
392 dpurdie 729
        $major = $1;
730
        $minor = $2;
731
        $patch = $3;
732
        if ( length( $patch) >= 4 )
733
        {
734
            $build = substr( $patch, -3 ,3);
735
            $patch = substr( $patch,  0 ,length($patch)-3);
736
        }
737
        $suffix = defined $5 ? ".$5" : '';
738
    }
1197 dpurdie 739
 
392 dpurdie 740
    #
1197 dpurdie 741
    #       nnn.nnn.nnn
742
    #       nnn.nnn-nnn
743
    #       nnn.nnn_nnn
392 dpurdie 744
    #
1197 dpurdie 745
    elsif ( $version =~ m~^(\d+)\.(\d+)[-._](\d+)$~ ) {
392 dpurdie 746
        $major = $1;
747
        $minor = $2;
748
        $patch = $3;
749
        $suffix = '';
750
    }
1197 dpurdie 751
 
392 dpurdie 752
    #
1197 dpurdie 753
    #       nnn.nnn.nnn.nnn
754
    #       nnn.nnn.nnn-nnn
755
    #       nnn.nnn.nnn_nnn
392 dpurdie 756
    #
1197 dpurdie 757
    elsif ( $version =~ m~^(\d+)\.(\d+)\.(\d+)[-._](\d+)$~ ) {
392 dpurdie 758
        $major = $1;
759
        $minor = $2;
760
        $patch = $3;
1197 dpurdie 761
        $build = $4;
392 dpurdie 762
        $suffix = '';
1197 dpurdie 763
        $isaRipple = 0;
392 dpurdie 764
    }
1197 dpurdie 765
 
392 dpurdie 766
 
767
    #
768
    #       nnn.nnn
769
    #
770
    elsif ( $version =~ m~^(\d+)\.(\d+)$~ ) {
771
        $major = $1;
772
        $minor = $2;
773
        $patch = 0;
774
        $suffix = '';
775
    }
776
    #
1197 dpurdie 777
    #       nnn.nnn.xxx
778
    #
779
    elsif ( $version =~ m~^(\d+)\.(\d+)(\.\w+)$~ ) {
780
        $major = $1;
781
        $minor = $2;
782
        $patch = 0;
783
        $suffix = $3;
784
    }
785
 
786
    #
392 dpurdie 787
    #       nnn.nnn.nnnz
788
    #
789
    elsif ( $version =~ m~^(\d+)\.(\d+)\.(\d+)([a-z])$~ ) {
790
        $major = $1;
791
        $minor = $2;
792
        $patch = $3;
793
        $build = ord($4) - ord('a');
794
        $suffix = '.cots';
1197 dpurdie 795
        $isaRipple = 0;
392 dpurdie 796
    }
797
    #
798
    #       ???REV=???
799
    #
800
    elsif ( $version =~ m~REV=~ ) {
801
        $suffix = '.cots';
802
        $result = $version . '.0000.cots';
803
    }
804
 
805
    #
806
    #   Wip Packages
1197 dpurdie 807
    #   (nnnnnn).xxx
392 dpurdie 808
    #   Should be essential, but want to sort very low
809
    #
1197 dpurdie 810
    elsif ($version =~ m~\((.*)\)(\..*)?~) {
811
        $suffix = $2 || '';
812
        $result = "000.000.000.000$suffix";
392 dpurdie 813
        $isaWIP = 1;
814
    }
1197 dpurdie 815
 
392 dpurdie 816
    #
1197 dpurdie 817
    #   !current
392 dpurdie 818
    #
1197 dpurdie 819
    elsif ($version eq '!current' || $version eq 'current_$USER' || $version eq 'current' || $version eq 'beta' || $version eq 'latest' || $version eq 'beta.cr' || $version eq 'CREATE') {
820
        $suffix = '';
821
        $result = "000.000.000.000$suffix";
822
        $isaWIP = 1;
823
    }
824
 
825
    #
826
    #   Also WIP: FINRUN.103649.BEI.WIP
827
    elsif ($version =~ m~(\.[a-zA-Z]+)\.WIP$~) {
828
        $suffix = lc($1);
829
        $result = "000.000.000.000$suffix";
830
        $isaWIP = 1;
831
    }
832
 
833
    #
834
    #   Also ERGOFSSLS190100_015
835
    #   Don't flag as a ripple
836
    elsif ($version =~ m~^ERG[A-Z]+(\d\d)(\d\d)(\d\d)[-_](\d+)(\.\w+)?$~) {
837
        $major = $1;
838
        $minor = $2;
839
        $patch = $3;
840
        $build = $4;
841
        $suffix = $5 || '.sls';
842
        $isaRipple = 0;
843
    }
844
 
845
    #
846
    #   Stuff we don't yet handle
847
    #
392 dpurdie 848
    else  {
1197 dpurdie 849
        Warning ("Unknown version number: $name,$version");
392 dpurdie 850
        $version =~ m~(\.\w+)$~;
851
        $suffix = $1 || '';
852
        $result = $version;
853
    }
854
 
1197 dpurdie 855
    $isaRipple = ($build > 0) unless defined $isaRipple;
392 dpurdie 856
    unless ( $result )
857
    {
1197 dpurdie 858
        # Major and minor of 99.99 are normally funny versions
859
        # Don't make important decisions on them
860
        #
861
        if (defined $major && defined $minor && $major == 99 && $minor == 99 )
862
        {
863
            $major = 0;
864
            $minor = 0;
865
            $patch = 0;
866
        }
867
 
392 dpurdie 868
        $result = sprintf("%3.3d.%3.3d.%3.3d.%3.3d%s", $major,$minor,$patch,$build,$suffix || '.0000');
1197 dpurdie 869
        $buildVersion = [ $major, $minor, $patch, $build ];
392 dpurdie 870
    }
871
 
1197 dpurdie 872
    $suffix = lc( $suffix );
873
    if ( exists $suffixFixup{$suffix} )
874
    {
875
        $suffix = $suffixFixup{$suffix} ;
876
    }
392 dpurdie 877
 
1197 dpurdie 878
    return ($suffix, $result, $isaRipple, $isaWIP, $buildVersion );
392 dpurdie 879
}
880
 
881
 
882
#-------------------------------------------------------------------------------
883
# Function        : LocateStrays
884
#
2548 dpurdie 885
# Description     : Locate stray packages
886
#                   Try to do several at a time to speed up processing
392 dpurdie 887
#
888
# Inputs          :
889
#
890
# Returns         :
891
#
892
sub LocateStrays
893
{
894
    Message ("Locate indirectly referenced packages");
895
    while ( $#StrayPackages >= 0 )
896
    {
897
        my $pv_id = pop @StrayPackages;
898
 
899
        next if ( exists $Packages{$pv_id}{done} );
900
#print "... ",$#StrayPackages,"\n";
901
        GetDepends( $pv_id);
902
        $Packages{$pv_id}{done} = 1;
903
    }
904
}
905
 
906
#-------------------------------------------------------------------------------
1197 dpurdie 907
# Function        : countPackages
392 dpurdie 908
#
1197 dpurdie 909
# Description     : 
392 dpurdie 910
#
911
# Inputs          : 
912
#
1197 dpurdie 913
# Returns         : Number of packages and number oof versions
392 dpurdie 914
#
1197 dpurdie 915
sub countPackages
392 dpurdie 916
{
1197 dpurdie 917
    my $v = 0;
918
    my $p = 0;
919
    my %names;
392 dpurdie 920
 
1197 dpurdie 921
    foreach ( keys %Packages )
922
    {
923
        my $name = $Packages{$_}{name};
924
        next unless ( $name );
925
        $names{$name} = 1;
926
        $v++;
927
    }
392 dpurdie 928
 
1197 dpurdie 929
    $p = keys %names;
930
 
931
    return $p,$v;
932
 
933
}
934
 
935
#-------------------------------------------------------------------------------
936
# Function        : processData
937
#
938
# Description     : Process data before its written out
939
#                       Remove a few packages that we do not want to now about
940
#                       Determine Reason that a version is in the list
941
#                       Finish taging packages in NamedProject
942
#
943
# Inputs          : 
944
#
945
# Returns         : 
946
#
947
sub processData
948
{
392 dpurdie 949
    foreach ( keys %Packages )
950
    {
951
        delete $Packages{$_}{done};
952
        next if ( $Packages{$_}{name} =~ ~m~CSWcfengine~ );
953
 
954
        if ($Packages{$_}{name} eq 'Activestate Perl - Solaris')
955
        {
956
            delete $Packages{$_};
957
            next;
958
        }
959
 
960
        if ( $Packages{$_}{name} =~ m/^CSW/ || $Packages{$_}{name} =~ m/^Solaris$/)
961
        {
962
            delete $Packages{$_};
963
            next;
964
        }
965
 
966
        if ( $Packages{$_}{name} =~ m/^jats_/)
967
        {
968
            delete $Packages{$_};
969
            next;
970
        }
1197 dpurdie 971
 
972
 
973
        #
974
        #   Catch packages that are dependents of NamedProject's
975
        #
976
        if ( $doIncludeOnly )
977
        {
978
            if ( exists  $Packages{$_}{'sbomBase'} || exists  $Packages{$_}{'sbomOsid'} )
979
            {
980
                $Packages{$_}{NamedProject} = 4;
981
            }
982
 
983
            unless ( $Packages{$_}{NamedProject}  )
984
            {
985
                my $named;
986
                my %usedBy;
987
 
988
                if ( exists $Packages{$_}{'usedBy'})
989
                {
990
                    my @examineThese = @{$Packages{$_}{'usedBy'}};
991
                    while ( @examineThese )
992
                    {
993
                        my $pvid = pop @examineThese;
994
                        next if ( $usedBy{$pvid} );
995
 
996
                        if ( $Packages{$pvid}{NamedProject}  )
997
                        {
998
                            $named = 1;
999
                            last;
1000
                        }
1001
 
1002
                        push @examineThese, @{$Packages{$pvid}{'usedBy'}}
1003
                            if (exists $Packages{$pvid}{'usedBy'});
1004
                    }
1005
                    $Packages{$_}{NamedProject} = 5
1006
                        if ( $named );
1007
                }
1008
#                else
1009
#                {
1010
#                    Warning("Not Named and not usedBy: $Packages{$_}{name} $Packages{$_}{'version'}");
1011
#                }
1012
            }
1013
        }
1014
        else
1015
        {
1016
            $Packages{$_}{NamedProject} = 6;
1017
        }
392 dpurdie 1018
    }
1197 dpurdie 1019
}
392 dpurdie 1020
 
1197 dpurdie 1021
#-------------------------------------------------------------------------------
1022
# Function        : outputData
1023
#
1024
# Description     : Write out data in a form to allow post processing
1025
#
1026
# Inputs          : 
1027
#
1028
# Returns         : 
1029
#
1030
sub outputData
1031
{
1032
    my $file = "cc2svn.raw.txt";
1033
    Message ("Create: $file");
1034
    my $fh = ConfigurationFile::New( $file );
1035
 
392 dpurdie 1036
    $fh->DumpData(
1197 dpurdie 1037
        "\n# Releases.\n#\n",
1038
        "ScmReleases", \%Releases );
1039
 
1040
    $fh->DumpData(
392 dpurdie 1041
        "\n# Packages.\n#\n",
1042
        "ScmPackages", \%Packages );
1043
 
1044
    $fh->DumpData(
1045
        "\n# Suffixes.\n#\n",
1046
        "ScmSuffixes", \%Suffixes );
1047
 
1048
    $fh->DumpData(
1049
        "\n# All Package Names.\n#\n",
1050
        "ScmAllPackages", \%AllPackages );
1051
 
1052
    #
1053
    #   Close out the file
1054
    #
1055
    $fh->Close();
1056
 
1057
#    #
1058
#    #   Split up package data into small files for easy consumption
1059
#    #
1060
#
1061
#    foreach ( keys %Packages )
1062
#    {
1063
#        my $file = "cc2svn.raw.${_}.txt";
1064
#        Message ("Create: $file");
1065
#        my $fh = ConfigurationFile::New( $file );
1066
#
1067
#        $fh->DumpData(
1068
#            "\n# Releases.\n#\n",
1069
#            "ScmReleases", \$Packages{$_} );
1070
#        $fh->Close();
1071
#    }
1072
 
1073
}
1074
 
1075
 
1076
#-------------------------------------------------------------------------------
1077
#   Documentation
1078
#
1079
 
1080
=pod
1081
 
1082
=for htmltoc    SYSUTIL::cc2svn::
1083
 
1084
=head1 NAME
1085
 
1086
cc2svn_gendata - Extract CC2SVN Essential Package Data from Release Manager
1087
 
1088
=head1 SYNOPSIS
1089
 
1090
  jats cc2svn_gendata [options]
1091
 
1092
 Options:
1093
    -help              - brief help message
1094
    -help -help        - Detailed help message
1095
    -man               - Full documentation
1096
    -test=version      - Test a version string, then exit
1097
    -limit=n           - Limit packages processed. Test only
1197 dpurdie 1098
    -mode=xxx          - Set Mode: all, hops, standard
392 dpurdie 1099
 
1100
=head1 OPTIONS
1101
 
1102
=over 8
1103
 
1104
=item B<-help>
1105
 
1106
Print a brief help message and exits.
1107
 
1108
=item B<-help -help>
1109
 
1110
Print a detailed help message with an explanation for each option.
1111
 
1112
=item B<-man>
1113
 
1114
Prints the manual page and exits.
1115
 
1116
=item B<-test=version>
1117
 
1118
Examine a package version string and report how the tool will parse it.
1119
 
1120
=item B<-limit=n>
1121
 
1122
Limit the number of packages processed by the tool. This is only used to
1123
simplify testing of the program
1124
 
1125
=back
1126
 
1127
=head1 DESCRIPTION
1128
 
1129
This program is a tool used in the conversion of ClearCase VOBS to subversion.
1130
It will:
1131
 
1132
=over 8
1133
 
1134
=item *
1135
 
1136
Determine all Releases in Release manager and mark those that
1137
are to be excluded.
1138
 
1139
=item *
1140
 
1141
Determine all the package-versions used by the releases that are
1142
not excluded. These are called 'direct' dependencies.
1143
 
1144
=item *
1145
 
1146
Recursively find all the dependent packages of all packages. New package
1147
versions are called 'indirect' dependencies. They are buried. This process can
1148
take several minutes.
1149
 
1150
=back
1151
 
1152
The data collected is dumped into a text file for later processing.
1153
 
1154
=cut
1155