Subversion Repositories DevTools

Rev

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