Subversion Repositories DevTools

Rev

Rev 2319 | Rev 2354 | 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_procdata.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
#                 Post process data collected in 23a
11
#
12
#
13
#......................................................................#
14
 
15
require 5.006_001;
16
use strict;
17
use warnings;
18
use JatsError;
19
use JatsEnv;
20
use JatsSystem;
21
use Getopt::Long;
22
use Pod::Usage;                             # required for help support
23
use JatsRmApi;
24
use ConfigurationFile;
25
use HTML::Table;
1270 dpurdie 26
use JatsSvn;
392 dpurdie 27
 
28
use DBI;
29
our $GBE_RM_URL;
395 dpurdie 30
our $GBE_DM_URL;
392 dpurdie 31
 
32
my $VERSION = "1.2.3";                      # Update this
33
my $opt_verbose = 1;
34
my $opt_help = 0;
35
my $opt_manual;
36
my $opt_usedby;
37
my $opt_allpackages;
38
 
39
#
40
#   Package information
41
#
42
our %ScmReleases;
43
our %ScmPackages;
44
our %ScmSuffixes;
45
our %ScmAllPackages;
395 dpurdie 46
our %ScmAllBomProjects;
47
our %ScmSboms;
392 dpurdie 48
 
2321 dpurdie 49
################################################################################
50
#   Data structure to help create links in all the files
51
#       BadVcs_$pvid
52
#       Repo_$repo
53
#       Package_$name
54
#
55
my $currentSection;
56
my %htmlData = (
57
    S0 =>  {file => 'PackageConversion.html'                  , title => 'Master Index'                     , tag => '', 'noHeader' => 0 },
58
    S1 =>  {file => 'PackageConversion_IR.html'               , title => 'Inlcuded Releases'                , tag => '' },
59
    S2 =>  {file => 'PackageConversion_ER.html'               , title => 'Excluded Releases'                , tag => '' },
60
    S3 =>  {file => 'PackageConversion_PkgIndex.html'         , title => 'Complete Package Index'           , tag => '' },
61
    S4 =>  {file => 'PackageConversion_PkgDetails.html'       , title => 'Package Conversion Details'       , tag => 'Package' },
62
    S5 =>  {file => 'PackageConversion_BadVersions.html'      , title => 'Bad Package Versions'             , tag => 'BadVcs' },
63
    S6 =>  {file => 'PackageConversion_BadVersionsPrj.html'   , title => 'Bad Package Versions By Project'  , tag => '' },
64
    S7 =>  {file => 'PackageConversion_MultiplePackages.html' , title => 'MultiplePackages'                 , tag => '' },
65
    S8 =>  {file => 'PackageConversion_RepoIndex.html'        , title => 'Repository Index'                 , tag => '' },
66
    S9 =>  {file => 'PackageConversion_RepoMap.html'          , title => 'Repository Mapping'               , tag => 'Repo' },
67
    SA =>  {file => 'PackageConversion_unMapped.html'         , title => 'Unmapped Packages'                , tag => '' },
68
    SB =>  {file => 'PackageConversion_SvnPkgs.html'          , title => 'Packages in Subversion'           , tag => '' },
69
);
392 dpurdie 70
 
71
#-------------------------------------------------------------------------------
72
# Function        : Main Entry
73
#
74
# Description     :
75
#
76
# Inputs          :
77
#
78
# Returns         :
79
#
80
my $result = GetOptions (
81
                "help+"         => \$opt_help,          # flag, multiple use allowed
82
                "manual"        => \$opt_manual,        # flag
83
                "verbose+"      => \$opt_verbose,       # flag
84
                "usedby:s"      => \$opt_usedby,        # pvid used by which releases
85
                'allpackages+'  => \$opt_allpackages
86
                );
87
 
88
#
89
#   Process help and manual options
90
#
91
pod2usage(-verbose => 0, -message => "Version: $VERSION")  if ($opt_help == 1  || ! $result);
92
pod2usage(-verbose => 1)  if ($opt_help == 2 );
93
pod2usage(-verbose => 2)  if ($opt_manual || ($opt_help > 2));
94
 
95
 
96
ErrorConfig( 'name'    =>'CC2SVN_PROCDATA' );
404 dpurdie 97
readInputData();
392 dpurdie 98
 
99
#
100
#   Report Releases that use a package
101
#
102
if ( $opt_usedby )
103
{
104
    foreach my $pvid ($opt_usedby , @ARGV )
105
    {
106
        my ($releases, $ireleases) = usedBy($pvid);
107
        my (@text, @itext);
108
 
396 dpurdie 109
        foreach ( sort {$ScmReleases{$a}{name} cmp $ScmReleases{$b}{name} } @$releases )
392 dpurdie 110
        {
111
            push @text, "$ScmReleases{$_}{pName} :: $ScmReleases{$_}{name}";
112
        }
113
 
114
        foreach ( @$ireleases )
115
        {
116
            push @text, "$ScmReleases{$_}{pName} :: $ScmReleases{$_}{name}";
117
        }
118
 
119
        unshift @text  ,"Used Directly by:" if ( @text );
120
        unshift @itext ,"Used Indirectly by:" if ( @itext );
121
        Message("Package: $ScmPackages{$pvid}{'name'} Version: $ScmPackages{$pvid}{'version'}", @text, @itext);
122
    }
123
    exit 0;
124
}
125
 
126
##
127
##   Generate a list of essential package-versions
128
##
129
#{
130
#    my $file = "EssentialPackages.txt";
131
#    my $count = 0;
132
#    Message("Create Essential Package List", $file);
133
#    open ( my $fh, '>', $file ) || Error ("Cannot open $file", "Error: $!");
134
#    foreach ( sort { $a <=> $b } keys %ScmPackages )
135
#    {
136
#        print $fh "$_\n";
137
#        $count++;
138
#    }
139
#    close $fh;
140
#    Message("Essential Packages: $count");
141
#}
142
 
143
#
144
#   Attempt to classify each package
145
#   Create a structure for each package
146
#
147
my %PackageSet;
148
my %PackageData;
149
my %Views;
150
my %Vobs;
1341 dpurdie 151
my %ReleasePackages;
152
 
392 dpurdie 153
getBadLabelData();
154
 
155
#
156
#   Remove packages that we don't need
157
#
158
my $deleteCount = keys %ScmPackages;
159
unless ( $opt_allpackages )
160
{
161
    foreach ( keys %ScmPackages )
162
    {
163
        next if ( $ScmPackages{$_}{NamedProject} );
164
        delete $ScmPackages{$_};
165
    }
166
}
167
 
168
Message ("Create Package Sets");
394 dpurdie 169
my $badCount = 0;
392 dpurdie 170
foreach ( keys %ScmPackages )
171
{
172
    my $pkgid = $ScmPackages{$_}{pkgid};
394 dpurdie 173
    unless ( $pkgid )
174
    {
175
        $badCount++;
176
        next;
177
    }
178
 
392 dpurdie 179
    push @{$PackageSet{$pkgid}}, $_;
180
 
181
    my ($vob, $path) = extractVob($_);
182
    if ($vob)
183
    {
394 dpurdie 184
        next if ( $ScmPackages{$_}{BadVob} );
392 dpurdie 185
        $Vobs{$vob}++;
186
        push @{$PackageData{$pkgid}{vobs}{$vob}}, $_ ;
187
        push @{$PackageData{$pkgid}{vobPath}{$path}}, $_  if ($path);
395 dpurdie 188
        $PackageData{$pkgid}{vobResolver}{$vob} = $path;
392 dpurdie 189
    }
190
 
191
    my $view = $ScmPackages{$_}{view};
192
    if ( $view )
193
    {
194
        foreach my $v ( keys %{$view} )
195
        {
196
            my $saneName = $v;
197
            $saneName = 'PRODUCTS' if ( $v eq 'AUTO_PRODUCTS' );
198
            $saneName = 'COTS' if ( $v eq '3RDPARTY_PRODUCTS' );
199
            next if ( $v eq 'MISC' );
200
            $Views{$saneName}++;
201
            $PackageData{$pkgid}{view}{$saneName} += $view->{$v};
202
        }
203
    }
204
 
205
    #
206
    #   Find youngest package
2321 dpurdie 207
    #       - Most recently modified
208
    #       - Not a ripple
209
    #       - Not created by buildadm (3768)
392 dpurdie 210
    #
211
    if ( (! exists $PackageData{$pkgid}{youngAge} ) || ( $ScmPackages{$_}{Age} < $PackageData{$pkgid}{youngAge} ) )
212
    {
213
        $PackageData{$pkgid}{youngAge} = $ScmPackages{$_}{Age};
214
    }
2321 dpurdie 215
 
392 dpurdie 216
    if ( (! exists $PackageData{$pkgid}{youngAgeNonRipple} ) || ( $ScmPackages{$_}{Age} < $PackageData{$pkgid}{youngAgeNonRipple} ) )
217
    {
218
        unless ( $ScmPackages{$_}{isaRipple} )
219
        {
220
            $PackageData{$pkgid}{youngAgeNonRipple} = $ScmPackages{$_}{Age};
221
        }
222
    }
223
 
2321 dpurdie 224
    if ( (! exists $PackageData{$pkgid}{nonBuildadm} ) || ( $ScmPackages{$_}{Age} < $PackageData{$pkgid}{nonBuildadm} ) )
225
    {
226
        unless ( $ScmPackages{$_}{Creator} == '3768' )
227
        {
228
            $PackageData{$pkgid}{nonBuildadm} = $ScmPackages{$_}{Age};
229
        }
230
    }
231
 
232
 
1341 dpurdie 233
    $PackageData{$pkgid}{name} = $ScmPackages{$_}{name} ;
392 dpurdie 234
 
1341 dpurdie 235
    #
236
    #   Accumulate Release data
237
    #
238
    my $mname = $ScmPackages{$_}{'name'} . ($ScmPackages{$_}{'suffix'} || '');
239
    my $name = $ScmPackages{$_}{'name'};
240
    foreach my $rtag_id ( @{$ScmPackages{$_}{'release'}} )
241
    {
242
        unless ( $ScmReleases{$rtag_id}{'excluded'} )
243
        {
244
            $ReleasePackages{$rtag_id}{mname}{$mname}{count}++;
245
            $ReleasePackages{$rtag_id}{name}{$name}{count}++;
246
            push @{$ReleasePackages{$rtag_id}{mname}{$mname}{pvid}}, $_;
247
            push @{$ReleasePackages{$rtag_id}{name}{$name}{pvid}}, $_ ;
248
        }
249
    }
392 dpurdie 250
}
394 dpurdie 251
Warning ("Bad Package Data entries: " . $badCount ) if $badCount;
392 dpurdie 252
 
253
#
254
#   Tag packages with BadVob and MultiVob
255
#
256
foreach my $pkgid ( keys %PackageSet )
257
{
258
    ($PackageData{$pkgid}{type}, @{$PackageData{$pkgid}{suffixes}} ) = smartPackageType ($pkgid);
259
    my @vobs = keys %{$PackageData{$pkgid}{vobs}};
260
    $PackageData{$pkgid}{isSVN} = 1 if ( @vobs == 1 && $vobs[0] eq 'SVN' );
1270 dpurdie 261
    $PackageData{$pkgid}{isSVN} = 1 if ( (exists ($PackageData{$pkgid}{vobs}{SVN})) && $PackageData{$pkgid}{vobs}{SVN});
262
 
392 dpurdie 263
    $PackageData{$pkgid}{MultiVob} = 1 if ( @vobs > 1 );
264
    $PackageData{$pkgid}{BadVob} = 1 if ( grep {$_ eq 'BAD'} @vobs   );
265
}
266
 
267
 
268
#
269
#   Map packages into Repos
270
#
271
my %Repos;
272
my %RepoSubIndex;
273
Message ("Mapping Vobs to Repo");
274
foreach my $pkgid ( keys %PackageSet )
275
{
276
    my $repo = mapPackage($pkgid);
277
    Error ("Unmapped package: $PackageData{$pkgid}{name}" ) unless ( $repo );
278
 
279
    $PackageData{$pkgid}{mappedRepo} = $repo;
280
    push @{$Repos{$repo}}, $pkgid;
281
}
282
 
283
foreach ( keys %Repos )
284
{
285
    @{$Repos{$_}} = sort{ uc($PackageData{$a}{name}) cmp uc($PackageData{$b}{name}) } @{$Repos{$_}};
286
    my $base = $_;
287
    my $index = '-';
288
    if (m~^(.*?)/(.*)~ )
289
    {
290
        $base = $1;
291
        $index = $2;
292
    }
293
    push @{$RepoSubIndex{$base}{$index}}, @{$Repos{$_}};
294
    @{$Repos{$base}} = () unless ( exists $Repos{$base} );
295
}
296
#DebugDumpData("RepoSubIndex", \%RepoSubIndex);
297
#DebugDumpData("Repos", \%Repos);
298
 
299
 
300
#
301
#   Create a list of Packages
302
#
303
{
304
    my $file = "PackageNames.txt";
305
    my $count = 0;
306
    Message("Create Package Name List", $file);
307
    open ( my $fh, '>', $file ) || Error ("Cannot open $file", "Error: $!");
308
 
309
    foreach ( sort {$PackageData{$a}{name} cmp $PackageData{$b}{name} } keys %PackageData )
310
    {
311
        print $fh "$PackageData{$_}{name}\n";
312
        $count++;
313
 
314
    }
315
    close $fh;
316
    Message("Unique Package Names: $count");
317
#    DebugDumpData("PackageData", \%PackageData);
318
}
319
 
1341 dpurdie 320
#
321
#   Determine Releases that have multiple versions of a package
322
#   ie: xxxx.cr and xxxxx.ssw
323
#
324
 
325
 
326
 
1270 dpurdie 327
##=pod
328
###
329
###   Display MutiVob Packages
330
###
331
##    foreach my $pkgid (  keys %PackageData )
332
##    {
333
##        next unless ( $PackageData{$pkgid}{MultiVob}  );
334
##        Message("Multi VOB package: $PackageData{$pkgid}{name}");
335
##        foreach my $vob ( keys %{$PackageData{$pkgid}{vobs}} )
336
##        {
337
##            Message("    $vob");
338
##            foreach my $pvid ( @{$PackageData{$pkgid}{vobs}{$vob}} )
339
##            {
340
##                Message ("        $ScmPackages{$pvid}{'version'}, $ScmPackages{$pvid}{'vcstag'}");
341
##            }
342
##        }
343
###DebugDumpData("DATA",$PackageData{$pkgid} );
344
##    }
345
##=cut
392 dpurdie 346
 
1270 dpurdie 347
##=pod
348
##    foreach my $pkgid (  keys %PackageData )
349
##    {
350
##        next unless ( $PackageData{$pkgid}{isSVN}  );
351
##        Message("Fully SVN Converted: $PackageData{$pkgid}{name}");
352
##    }
353
##=cut
392 dpurdie 354
 
1270 dpurdie 355
##=pod
356
##    my @BadTags;
357
##    foreach my $pvid (  keys %ScmPackages )
358
##    {
359
##        next unless ( $ScmPackages{$pvid}{BadVob}  );
360
##        push @BadTags, $pvid;
361
##    }
362
##
363
##    Message("Bad VcsTag packages: ". scalar @BadTags);
364
##    foreach my $pvid ( @BadTags )
365
##    {
366
##        Message ("    $pvid, $ScmPackages{$pvid}{'name'}, $ScmPackages{$pvid}{'version'}, $ScmPackages{$pvid}{'vcstag'}");
367
##    }
368
##=cut
392 dpurdie 369
 
370
    generateHTML();
371
    generateImportData();
372
    exit 0;
373
 
374
#-------------------------------------------------------------------------------
375
# Function        : generateImportData
376
#
377
# Description     : Generate data to be used by the importPackage util.
378
#                   Will provide Target Repo
379
#
380
# Inputs          : Nothing
381
#
382
# Returns         : 
383
#
384
sub generateImportData
385
{
386
    my %Data;
1270 dpurdie 387
    Message("Generate Data for utilties");
388
 
392 dpurdie 389
    foreach my $pkgid ( keys %PackageData )
390
    {
391
        my $repo = $PackageData{$pkgid}{mappedRepo};
392
        my $name = $PackageData{$pkgid}{name};
393
        $Data{$name}{repo} = $repo;
394
#        $Data{$pkgid}{name} = $PackageData{$pkgid}{name};
395
    }
396
 
397
    {
398
        my $file = "cc2svn.repo.txt";
399
        Message ("Create: $file");
400
        my $fh = ConfigurationFile::New( $file );
401
 
402
        foreach my $pkgid ( sort {$PackageData{$a}{name} cmp $PackageData{$b}{name} } keys %PackageData )
403
        {
404
            my $repo = $PackageData{$pkgid}{mappedRepo};
405
            my $name = $PackageData{$pkgid}{name};
406
            $fh->WriteLn("'$name' '-repo=$repo'");
407
        }
408
        $fh->Close();
409
    }
410
 
411
    my $file = "cc2svn.repo.dat";
412
    Message ("Create: $file");
413
    my $fh = ConfigurationFile::New( $file );
414
    $fh->DumpData(
415
        "\n# Repo Mapping.\n#\n",
416
        "ScmRepoMap", \%Data );
417
 
418
    $fh->Close();
419
}
420
 
421
#-------------------------------------------------------------------------------
2321 dpurdie 422
# Function        : generateHTMLHeader
392 dpurdie 423
#
2321 dpurdie 424
# Description     : Create an HTML Header
392 dpurdie 425
#
2321 dpurdie 426
# Inputs          : $section        - Section tag
392 dpurdie 427
#
2321 dpurdie 428
# Returns         : Handle to use
392 dpurdie 429
#
2321 dpurdie 430
sub generateHTMLHeader
392 dpurdie 431
{
2321 dpurdie 432
    my ($section) = @_;
433
    my $handle;
392 dpurdie 434
 
2321 dpurdie 435
    Error ("Bad HTML section id: $section") unless ( exists $htmlData{$section} );
436
    $currentSection = $section;
437
    my $fname = $htmlData{$section}{file};
438
    my $title = $htmlData{$section}{title};
392 dpurdie 439
 
2321 dpurdie 440
    open ($handle, '>', $fname) || Error ("Cannot create HTML: $fname");
441
    print $handle <<"HEADER";
442
<!DOCTYPE $handle PUBLIC "-//W3C//DTD $handle 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
392 dpurdie 443
<html>
444
<head>
2321 dpurdie 445
<title>$title</title>
392 dpurdie 446
<script type="text/javascript">
447
function click_expandingMenuHeader(obj,sectionName)
448
{ 
449
var x=document.getElementById("cssprop_" + sectionName).parentNode.className;
450
if (x.indexOf("expandingMenuNotSelected")>-1)
451
	{
452
	x=x.replace("expandingMenuNotSelected","expandingMenuSelected");
453
	document.getElementById("cssprop_" + sectionName).parentNode.className=x;
454
	document.getElementById("cssprop_" + sectionName).style.display="block";
455
	}
456
else
457
	{
458
	x=x.replace("expandingMenuSelected","expandingMenuNotSelected");
459
	document.getElementById("cssprop_" + sectionName).parentNode.className=x;
460
	document.getElementById("cssprop_" + sectionName).style.display="none";
461
	}
462
}
463
 
464
function flipStyleByName(style, prop, val, val2)
465
{
466
    var mysheet=document.styleSheets[0];
467
    var myrules=mysheet.cssRules? mysheet.cssRules: mysheet.rules
468
    for (i=0; i<myrules.length; i++)
469
    {
470
        if(myrules[i].selectorText.toLowerCase()==style)
471
        {
472
            targetrule=myrules[i];
473
 
474
            targetflag = 'ddpStuff.' + style
475
            targetrule[targetflag] = ! targetrule[targetflag];
476
            val = targetrule[targetflag] ? val : val2;
477
 
478
            targetrule.style.setProperty(prop, val,'important');
479
            break;
480
        }
481
    }
482
}
483
 
484
</script>
485
<style TYPE="text/css">
486
 
487
.nonEssential {}
488
.essential {}
489
 
490
.expandingMenu
491
{
492
xwidth:165px;
493
overflow:hidden;
494
}
495
 
496
.expandingMenuHeader
497
{
498
padding-left:12px;
499
margin-bottom:2px;
500
cursor:pointer;
501
}
502
 
503
.expandingMenuItem
504
{
505
width:145px;
506
padding-left:12px;
507
margin-bottom:3px;
508
}
509
 
510
.expandingMenuGroup {
511
xwidth:160px;
512
border:1px solid #d4d4d4;
513
margin-bottom:4px;
514
padding-top:4px;
515
padding-bottom:4px;
516
background-color:#f8f8f8;
517
}
518
 
519
.expandingMenuSelected {
520
background-image:url(http://www.w3schools.com/images/minus_arrow.gif);
521
background-repeat:no-repeat;
522
background-position:1px 3px;
523
}
524
 
525
.expandingMenuNotSelected {
526
background-image:url(http://www.w3schools.com//images/plus_arrow.gif);
527
background-repeat:no-repeat;
528
background-position:1px 3px;
529
}
530
 
531
.packageTitle {
532
    background-color:#FFFF99;
533
}
534
 
535
.listTitle {
536
    text-align:left;
537
    vertical-align:top;
538
}
539
 
540
.paddedTable {
541
    border-spacing: 10px 0px;
542
}
543
</style>
544
</head>
545
 
546
HEADER
2321 dpurdie 547
    print $handle "<body>\n";
548
    print $handle "<p>Generated: " . localtime() . "\n";
392 dpurdie 549
 
550
    #
551
    #   Generate an index
552
    #
2321 dpurdie 553
    print $handle htmlH1(anchor("Index", 'Index'));
392 dpurdie 554
 
2321 dpurdie 555
    print $handle "<dl>";
556
    foreach my $section ( sort keys %htmlData )
557
    {
558
        my $fname = $htmlData{$section}{file};
559
        my $title = $htmlData{$section}{title};
560
 
561
        print $handle "<dd>" . hRef("$fname"            ,$title);
562
 
563
    }
564
    print $handle "</dl>\n";
565
 
566
    unless ( $htmlData{$section}{noHeader} )
567
    {
568
        print $handle htmlH1('<hr>' . $title);
569
    }
570
 
571
    return $handle;
572
}
573
 
574
#-------------------------------------------------------------------------------
575
# Function        : generateHTMLTail
576
#
577
# Description     : 
578
#
579
# Inputs          : 
580
#
581
# Returns         : 
582
#
583
sub generateHTMLTail
584
{
585
    my ($handle) = @_;
586
    print $handle "</body>\n";
587
    print $handle "</html>\n";
588
    close $handle;
589
 
590
    $currentSection = '';
591
}
592
 
593
 
594
#-------------------------------------------------------------------------------
595
# Function        : generateHTML
596
#
597
# Description     : 
598
#                   Create per package data
599
#                   Create a nice HTML file so that it can be hyperlinked
600
#
601
# Inputs          : 
602
#
603
# Returns         : 
604
#
605
 
606
sub generateHTML
607
{
608
    my @PackageOrder;
609
    EnvImport('GBE_RM_URL');
610
    EnvImport('GBE_DM_URL');
611
    my $t;
612
    Message("Generate HTML");
613
    my $HTML = generateHTMLHeader ('S0');
614
    print $HTML "This page is a simple index into the other pages that contain the Clearcase to Subversion converstion details.\n";
615
 
392 dpurdie 616
    #
395 dpurdie 617
    #   BOM Projects
618
    #
1197 dpurdie 619
#    {
2321 dpurdie 620
#        print $HTML header('BOMIndex', 'Included BOM Projects');
621
#        print $HTML "BOM Projects included in processing. All branches and and SBOMS scanned for essential packages and versions\n";
1197 dpurdie 622
#
2321 dpurdie 623
#        print $HTML "<dl>\n";
1197 dpurdie 624
#        foreach my $project_id ( sort {$ScmAllBomProjects{$a}{project_name} cmp $ScmAllBomProjects{$b}{project_name} } keys %ScmAllBomProjects )
625
#        {
2321 dpurdie 626
#            print $HTML "<dd>" . linkBomProject($project_id,$ScmAllBomProjects{$project_id}{project_name});
1197 dpurdie 627
#        }
2321 dpurdie 628
#        print $HTML "</dl>\n";
1197 dpurdie 629
#    }
395 dpurdie 630
 
631
    #
392 dpurdie 632
    #   Release List
633
    #
634
    my %Projects;
635
    push @{$Projects{$ScmReleases{$_}{'pName'}}}, $_ foreach ( keys %ScmReleases );
636
 
2321 dpurdie 637
 
638
    $HTML = generateHTMLHeader ('S1');
639
    print $HTML "Releases that will be considered in the conversion process.\n";
640
    print $HTML "<br>Releases are scanned for packages and versions that are used.\n";
641
    print $HTML "<dl>\n";
392 dpurdie 642
    foreach ( sort keys %Projects )
643
    {
395 dpurdie 644
        foreach my $rtagid ( sort {$ScmReleases{$a}{name} cmp $ScmReleases{$b}{name}} @{$Projects{$_}} )
392 dpurdie 645
        {
646
            next if ( $ScmReleases{$rtagid}{'excluded'} );
2321 dpurdie 647
            print $HTML "<dd>" . linkRelease($rtagid);
392 dpurdie 648
        }
649
    }
2321 dpurdie 650
    print $HTML "</dl>\n";
651
    generateHTMLTail($HTML);
392 dpurdie 652
 
2321 dpurdie 653
 
654
    $HTML = generateHTMLHeader ('S2');
655
    print $HTML "Releases that will NOT be considered in the conversion process. These are releases that have been specificly excluded.\n";
656
    print $HTML "<dl>\n";
392 dpurdie 657
    foreach ( sort keys %Projects )
658
    {
395 dpurdie 659
        foreach my $rtagid ( sort {$ScmReleases{$a}{name} cmp $ScmReleases{$b}{name}} @{$Projects{$_}} )
392 dpurdie 660
        {
661
            next unless ( $ScmReleases{$rtagid}{'excluded'} );
2321 dpurdie 662
            print $HTML "<dd>" . linkRelease($rtagid);
392 dpurdie 663
        }
664
    }
2321 dpurdie 665
    print $HTML "</dl>\n";
666
    generateHTMLTail($HTML);
392 dpurdie 667
 
668
 
669
    my $currentChar = '';
670
    undef $t;
671
    @PackageOrder = ();
2321 dpurdie 672
    $HTML = generateHTMLHeader ('S3');
673
    print $HTML "Complete list of packages. This includes 'Essential Packages' and packages that ";
674
    print $HTML "are present in Release Manager, but are not currently used.";
675
    print $HTML "<br><button type=\"button\" onclick=\"flipStyleByName('.nonessential', 'display', 'none', '')\" >Show/Hide non Essential</button>";
676
    print $HTML "<button type=\"button\" onclick=\"flipStyleByName('.essential', 'display', 'none', '')\" >Show/Hide Essential</button>";
392 dpurdie 677
 
678
    foreach my $pkgid ( sort {lc($ScmAllPackages{$a}) cmp lc($ScmAllPackages{$b}) } keys %ScmAllPackages )
679
    {
680
        my $thisChar = uc(substr($ScmAllPackages{$pkgid}, 0, 1 ));
681
        if ( $thisChar ne $currentChar )
682
        {
2321 dpurdie 683
            print $HTML $t->getTable if ( $t );
392 dpurdie 684
            $t = new HTML::Table();
685
 
2321 dpurdie 686
            endExpander($HTML) if ($currentChar);
687
            startExpander($HTML, "Letter2$thisChar", $thisChar);
392 dpurdie 688
            $currentChar = $thisChar;
689
        }
690
        my $packageRef;
691
        my $version_tree = '';
692
        my $import_log = '';
693
        my $marker = '';
694
        my $class;
695
        unless ( exists $PackageData{$pkgid} )
696
        {
697
            $packageRef = $ScmAllPackages{$pkgid};
1197 dpurdie 698
            $marker = 'Not being converted at this time';
392 dpurdie 699
            $class = 'nonEssential';
700
        }
701
        else
702
        {
703
            push @PackageOrder, $pkgid;
704
            $packageRef = linkPackageDetails($pkgid);
705
            $version_tree = linkImage($pkgid, '(Version Tree)');
706
            $import_log = linkImportLog( $pkgid, '(Import Log)');
707
 
708
            $marker = 'Converted to SVN'
709
                if ( $PackageData{$pkgid}{isSVN} );
710
            $class = 'essential';
711
        }
712
        $t->addRow($packageRef, linkPkg($pkgid, '(Release Manager)'),$version_tree, $import_log, $marker);
713
        $t->setRowClass  (-1, $class);
714
    }
2321 dpurdie 715
    print $HTML $t->getTable if ( $t );
716
    endExpander($HTML) if ($currentChar);
717
    generateHTMLTail($HTML);
392 dpurdie 718
 
719
    #
720
    #   Package Details
721
    #
2321 dpurdie 722
    $HTML = generateHTMLHeader ('S4');
392 dpurdie 723
    $t = new HTML::Table( -border=>1 );
724
    foreach my $pkgid ( @PackageOrder )
725
    {
726
        my @badVobs;
727
        $t->addRow('&nbsp;');
728
        $t->setRowClass  (-1, 'packageTitle');
729
        $t->setCellColSpan(-1, 1, 2);
730
 
2321 dpurdie 731
        $t->addRow( anchor("$PackageData{$pkgid}{name}", 'Name:'), linkPkg($pkgid) . linkImage($pkgid, ' (Version Tree)') . linkImportLog( $pkgid, ' (Import Log)' ) );
392 dpurdie 732
#        $t->setRowHead(-1,1);
733
 
734
        my $t2 = new HTML::Table( -border=>0, -padding=>0, -spacing=>0 );
735
        foreach my $pvid ( sort {$ScmPackages{$a}{fullVersion} cmp $ScmPackages{$b}{fullVersion} } @{$PackageSet{$pkgid}} )
736
        {
394 dpurdie 737
            my @markers;
738
            if ( $ScmPackages{$pvid}{BadVob} || $ScmPackages{$pvid}{BadCCView}  ) {
739
                push @markers, hRef( "#BadVcs_$pvid", ' -Bad Tag');
392 dpurdie 740
            }
741
 
394 dpurdie 742
            if ( $ScmPackages{$pvid}{sbomOsid} || $ScmPackages{$pvid}{sbomBase}  ) {
743
                push @markers, 'SBOM';
744
            }
745
 
746
 
747
            $t2->addRow( linkPvid($pvid, undef, 1), "@markers" );
748
 
392 dpurdie 749
            push @badVobs,$pvid if ($ScmPackages{$pvid}{BadVob});
750
        }
751
        $t->addRow("Versions used:", $t2->getTable);
752
        $t->addRow("Type:", $PackageData{$pkgid}{type});
753
        $t->addRow("Projects:",join (',', @{$PackageData{$pkgid}{suffixes}} ));
754
 
755
        my $youngest = $PackageData{$pkgid}{youngAge};
2321 dpurdie 756
        my $youngestNonRipple = $PackageData{$pkgid}{youngAgeNonRipple} || 0;
757
        my $youngestNonBuildadm = $PackageData{$pkgid}{nonBuildadm} || 0;
758
 
759
        $youngest = int($youngest);
760
        $youngestNonRipple = int($youngestNonRipple) || '-';
761
        $youngestNonBuildadm = int($youngestNonBuildadm) || '-';
762
 
763
        $t->addRow("Youngest:", "$youngestNonRipple Days (NonRipple). $youngestNonBuildadm Days (NonBuildadm). $youngest Days (any Build)" );
392 dpurdie 764
        $t->addRow("Views:", join (',', keys %{$PackageData{$pkgid}{view}}));
765
 
766
        if ( $PackageData{$pkgid}{MultiVob} )
767
        {
768
            my $t2 = new HTML::Table( -border=>0, -padding=>0, -spacing=>0, -class=>'paddedTable' );
769
            foreach my $vob ( keys %{$PackageData{$pkgid}{vobs}} )
770
            {
771
                $t2->addRow($vob);
772
                $t2->setRowHead(-1,1);
773
                $t2->setCellColSpan(-1, 1, 3);
774
                foreach my $pvid ( @{$PackageData{$pkgid}{vobs}{$vob}} )
775
                {
776
                    $t2->addRow('&nbsp;', linkPvid($pvid, undef, 1), "$ScmPackages{$pvid}{'vcstag'}" );
777
                }
778
            }
779
            $t2->setColClass (1, 'listTitle' );
395 dpurdie 780
            $t->addRow("MultiVobs:", $t2->getTable);
392 dpurdie 781
        }
782
        else
783
        {
784
            $t->addRow("Vobs:", join (',', keys %{$PackageData{$pkgid}{vobs}}));
785
        }
786
 
787
        if ( $PackageData{$pkgid}{MultiVob} )
788
        {
789
            my $t2 = new HTML::Table( -border=>0, -padding=>0, -spacing=>0, -class=>'paddedTable' );
790
            foreach my $vob ( keys %{$PackageData{$pkgid}{vobPath}} )
791
            {
792
                $t2->addRow($vob);
793
                $t2->setRowHead(-1,1);
794
                $t2->setCellColSpan(-1, 1, 2);
795
                foreach my $pvid ( @{$PackageData{$pkgid}{vobPath}{$vob}} )
796
                {
797
                    $t2->addRow('&nbsp;', linkPvid($pvid, undef, 1) );
798
                }
799
            }
800
            $t2->setColClass (1, 'listTitle' );
801
            $t->addRow("Paths:", $t2->getTable);
802
        }
803
        else
804
        {
805
            $t->addRow("Paths:", join (',', keys %{$PackageData{$pkgid}{vobPath}}));
806
        }
807
 
808
 
809
        if ( @badVobs )
810
        {
811
            my $t2 = new HTML::Table( -border=>0, -padding=>0, -spacing=>0, -class=>'paddedTable' );
812
            foreach my $pvid ( @badVobs )
813
            {
814
                $t2->addRow(linkPvid($pvid), "&nbsp;", $ScmPackages{$pvid}{'vcstag'} );
815
            }
816
            $t->addRow("Bad VCS:", $t2->getTable );
817
        }
818
 
819
        my $repo = $PackageData{$pkgid}{mappedRepo};
2319 dpurdie 820
        my %RepoList;
821
        foreach my $pvid ( @{$PackageSet{$pkgid}} )
822
        {
823
            my $repo = $ScmPackages{$pvid}{'vcstag'};
824
            if ( $repo =~ m~SVN::(.*)(/tags/|/branches/|/trunk)~i )
825
            {
826
                $RepoList{$1} = svnLink($1) unless exists $RepoList{$1};
827
            }
828
        }
829
        my $txt = join( '<br>', values %RepoList);
830
        $txt = ' : ' . $txt if ( $txt );
831
        $t->addRow("Repo:", hRef("#Repo_$repo", $repo). $txt );
392 dpurdie 832
    }
833
    $t->setColClass (1, 'listTitle' );
2321 dpurdie 834
    print $HTML $t->getTable;
835
    generateHTMLTail($HTML);
392 dpurdie 836
    #
837
    #   Bad Package information
838
    #
2016 dpurdie 839
Message("Bad Package Versions");
392 dpurdie 840
    my %BadByProject;
2016 dpurdie 841
    my $last_proj_id = 0;
392 dpurdie 842
 
2321 dpurdie 843
    $HTML = generateHTMLHeader ('S5');
844
    print $HTML "These package-versions cannot be reproduced from ClearCase. This may be due to\n";
845
    print $HTML "<dl><dd>Invalid Release Manager information";
846
    print $HTML "<dd>Incorrect Release Manager Data";
847
    print $HTML "<dd>ClearCase label and Path do not result in a view with files";
848
    print $HTML "</dl>";
392 dpurdie 849
    $t = new HTML::Table( -border=>1 );
850
    $t->addRow( 'Package Version','VCS Tag' );
851
    $t->setRowHead(1,1);
852
    foreach my $pvid ( sort {lc($ScmPackages{$a}{name}) cmp lc($ScmPackages{$b}{name}) } keys %ScmPackages )
853
    {
854
        next unless ( $ScmPackages{$pvid}{BadVob} || $ScmPackages{$pvid}{BadCCView} );
855
 
856
        my $t2 = new HTML::Table( -border=>0, -padding=>0, -spacing=>0, -class=>'paddedTable' );
857
        $t2->addRow($ScmPackages{$pvid}{'vcstag'});
858
 
859
        my ($users, $iusers) = usedBy($pvid);
860
        if ( @$users )
861
        {
862
            $t2->addRow("Used Directly by:");
863
            $t2->addRow(linkRelease($_, $pvid)) foreach ( @$users );
864
            push @{$BadByProject{$_}{direct}}, $pvid foreach ( @$users );
865
        }
866
 
867
        if ( @$iusers )
868
        {
869
            $t2->addRow("Used Indirectly by:");
870
            $t2->addRow(linkRelease($_, $pvid)) foreach ( @$iusers );
871
            push @{$BadByProject{$_}{indirect}}, $pvid foreach ( @$iusers );
872
        }
2321 dpurdie 873
        $t->addRow( anchor("$pvid",linkPvid($pvid)), $t2->getTable );
392 dpurdie 874
    }
875
    $t->setColClass (1, 'listTitle' );
2321 dpurdie 876
    print $HTML $t->getTable;
877
    generateHTMLTail($HTML);
392 dpurdie 878
 
879
    #
880
    #   Bad package vesrions by project
881
    #
2016 dpurdie 882
Message("Bad Package Versions by Project");
2321 dpurdie 883
    $HTML = generateHTMLHeader ('S6');
392 dpurdie 884
    $t = new HTML::Table( -border=>1 );
885
    $t->addRow( 'Release','Package');
886
    $t->setRowHead(1,1);
2016 dpurdie 887
    $last_proj_id = 0;
392 dpurdie 888
 
889
    sub sortReleases
890
    {
891
        my $rv = ( lc($ScmReleases{$a}{pName}) cmp lc($ScmReleases{$b}{pName}));
892
        unless ($rv )
893
        {
894
            $rv = (lc($ScmReleases{$a}{'rtag_id'}) cmp lc($ScmReleases{$b}{'rtag_id'}));
895
        }
896
        return $rv;
897
    }
898
 
899
    foreach my $rtag_id ( sort sortReleases keys %BadByProject  )
900
    {
901
        if ( $last_proj_id != $ScmReleases{$rtag_id}{proj_id} )
902
        {
903
            $last_proj_id = $ScmReleases{$rtag_id}{proj_id};
904
            $t->addRow( $ScmReleases{$rtag_id}{pName});
905
            $t->setCellColSpan(-1, 1, 2);
906
        }
907
 
908
        my $t2 = new HTML::Table(-border=>0, -padding=>0, -spacing=>0, -class=>'paddedTable' );
909
 
910
        if ( $BadByProject{$rtag_id}{direct} )
911
        {
912
                $t2->addRow('Directly uses:' );
913
                foreach my $pvid (@{$BadByProject{$rtag_id}{direct}})
914
                {
915
                    $t2->addRow( linkPvid($pvid, $rtag_id) , $ScmPackages{$pvid}{'vcstag'} );
916
                }
917
        }
918
 
919
        if ( $BadByProject{$rtag_id}{indirect} )
920
        {
921
            $t2->addRow('Indirectly uses:' );
922
            foreach my $pvid (@{$BadByProject{$rtag_id}{indirect}})
923
            {
924
                $t2->addRow( linkPvid($pvid, $rtag_id) , $ScmPackages{$pvid}{'vcstag'} );
925
            }
926
        }
927
        $t->addRow(linkRelease($rtag_id, undef, 1), $t2->getTable  );
928
    }
2016 dpurdie 929
 
392 dpurdie 930
    $t->setColClass (1, 'listTitle' );
931
    $t->setColHead(1,1);
2321 dpurdie 932
    print $HTML $t->getTable;
933
    generateHTMLTail($HTML);
392 dpurdie 934
 
1341 dpurdie 935
    #
936
    #   Releases that have multiple instances of the same package in them
937
    #
2016 dpurdie 938
Message("Multiple Packages");
2321 dpurdie 939
    $HTML = generateHTMLHeader ('S7');
940
    print $HTML "Releases that have multiple instances of the same package\n";
1341 dpurdie 941
#DebugDumpData("ReleasePackages", \%ReleasePackages );
942
 
943
    $t = new HTML::Table( -border=>1 );
944
    $t->addRow( 'Release','Package');
945
    $t->setRowHead(1,1);
946
    $last_proj_id = 0;
947
 
948
    foreach my $rtag_id ( sort sortReleases keys %ReleasePackages )
949
    {
950
        my @multiples;
951
        foreach my $name ( keys %{$ReleasePackages{$rtag_id}{name}} )
952
        {
953
            if ( $ReleasePackages{$rtag_id}{name}{$name}{count} > 1 )
954
            {
955
                push @multiples, $name;
956
            }
957
        }
958
        next unless ( @multiples );
959
 
960
        if ( $last_proj_id != $ScmReleases{$rtag_id}{proj_id} )
961
        {
962
            $last_proj_id = $ScmReleases{$rtag_id}{proj_id};
963
            $t->addRow( $ScmReleases{$rtag_id}{pName});
964
            $t->setCellColSpan(-1, 1, 2);
965
        }
966
 
967
        my $t2 = new HTML::Table(-border=>0, -padding=>0, -spacing=>0, -class=>'paddedTable' );
968
 
969
        foreach my $name ( sort {uc($a) cmp uc($b) } @multiples )
970
        {
971
            $t2->addRow('Package: ' . linkFindPkgs($name, $rtag_id),  );
972
            $t2->setCellColSpan(-1, 1, 2);
973
            foreach my $pvid ( @{$ReleasePackages{$rtag_id}{name}{$name}{pvid}} )
974
            {
975
                $t2->addRow( '&nbsp;', linkPvid($pvid, $rtag_id) );
976
            }
977
        }
978
 
979
        $t->addRow(linkRelease($rtag_id, undef, 1), $t2->getTable  );
980
    }
981
    $t->setColClass (1, 'listTitle' );
982
    $t->setColHead(1,1);
2321 dpurdie 983
    print $HTML $t->getTable;
984
    generateHTMLTail($HTML);
392 dpurdie 985
 
1341 dpurdie 986
 
2016 dpurdie 987
Message("Repo Index");
2321 dpurdie 988
    $HTML = generateHTMLHeader ('S8');
989
    print $HTML "A summary of proposed Repostories and Paths\n";
1341 dpurdie 990
 
991
    $t = new HTML::Table( -border=>0, -padding=>0, -spacing=>0, -class=>'paddedTable' );
992
    $t->addRow( 'Name','', 'Count', 'Warnings'  );
993
    $t->setCellColSpan(1, 1, 2);
994
    foreach my $repo ( sort {uc($a) cmp uc($b) } keys %RepoSubIndex )
995
    {
996
            next if ( $repo eq 'UNKNOWN' );
997
            next if ( $repo eq 'SVN' );
998
            my $count = '';
999
            if ( exists $RepoSubIndex{$repo}{'-'}   )
1000
            {
1001
                $count = @{$RepoSubIndex{$repo}{'-'}};
1002
            }
1003
            $t->addRow( hRef("#Repo_$repo", $repo), '', $count  );
1004
            $t->setCellColSpan($t->getTableRows(), 1, 2);
1005
 
1006
            foreach my $path ( sort {uc($a) cmp uc($b) } keys %{$RepoSubIndex{$repo}} )
1007
            {
1008
                    next if ( $path eq '-' );
1009
                    my $depth = $path =~ tr~/~~;
1010
                    my $warn = ($depth > 2) ? ' - Deeply nested' : '';
1011
                    my $count = (@{$RepoSubIndex{$repo}{$path}});
1012
                    $warn .= ' - Only One Package' if ( $count < 2 );
1013
 
1014
                    $t->addRow( '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', hRef("#Repo_$repo/$path", $path), $count, $warn);
1015
            }
1016
 
1017
    }
1018
 
2321 dpurdie 1019
    print $HTML $t->getTable;
1020
    generateHTMLTail($HTML);
1341 dpurdie 1021
 
1022
 
1023
 
392 dpurdie 1024
#DebugDumpData("RepoSubIndex", \%RepoSubIndex);
1025
#DebugDumpData("Repos", \%Repos);
1026
 
1027
    #
1028
    #   Repo back reference
1029
    #
2016 dpurdie 1030
Message("Repo Map");
2321 dpurdie 1031
    $HTML = generateHTMLHeader ('S9');
1032
    print $HTML "Proposed Repostories and Paths with package mapping and ClearCase Path\n";
392 dpurdie 1033
 
1034
    $t = new HTML::Table( -border=>1 );
2321 dpurdie 1035
    $t->addRow( 'Repository Path', 'Package Name,Original Vob Path(s),Last Build NonBuildadm [ANY]]' );
392 dpurdie 1036
 
1037
    foreach my $repo ( sort {uc($a) cmp uc($b) } keys %Repos )
1038
    {
1039
        next if ( $repo eq 'SVN' );
1040
        next if ( $repo eq 'UNKNOWN' );
1041
        my @data;
1042
        my $t1 = new HTML::Table( -border=>1,-width=>'100%', -style=>"border-collapse:collapse" );
1043
 
1044
        foreach my $pkgid ( @{$Repos{$repo}} )
1045
        {
1046
            my $t2 = new HTML::Table( -border=>0,-padding=>0, -spacing=>0, -class=>'paddedTable' );
1047
            foreach my $vob ( keys %{$PackageData{$pkgid}{vobPath}} )
1048
            {
1049
                    $t2->addRow( $vob );
1050
            }
1051
            if ( $t2->getTableRows() )
1052
            {
1053
                $t2->setColClass (1, 'listTitle' );
1054
            }
2319 dpurdie 1055
            my $youngest = $PackageData{$pkgid}{youngAge};
2321 dpurdie 1056
            my $youngestNonRipple = $PackageData{$pkgid}{youngAgeNonRipple} || 0;
1057
            my $youngestNonBuildadm = $PackageData{$pkgid}{nonBuildadm} || 0;
2319 dpurdie 1058
 
2321 dpurdie 1059
            $youngest =  int($youngest);
1060
            $youngestNonRipple =  int($youngestNonRipple) || '-';
1061
            $youngestNonBuildadm = int($youngestNonBuildadm) || '-';
1062
 
2319 dpurdie 1063
            $t1->addRow( linkPackageDetails($pkgid),
2321 dpurdie 1064
                         $t2->getTable(), "$youngestNonBuildadm [$youngest]"  );
392 dpurdie 1065
        }
2319 dpurdie 1066
 
392 dpurdie 1067
        if ( $t1->getTableRows() )
1068
        {
1069
            $t1->setColWidth(1,'30%');
1070
            $t1->setColClass (1, 'listTitle' );
2319 dpurdie 1071
            $t1->setColWidth(3,'10%');
392 dpurdie 1072
        }
2321 dpurdie 1073
        $t->addRow( anchor("$repo",$repo), $t1->getTable() );
392 dpurdie 1074
 
1075
    }
1076
    $t->setColClass (1, 'listTitle' );
1077
    $t->setColHead(1,1);
2321 dpurdie 1078
    print $HTML $t->getTable;
1079
    generateHTMLTail($HTML);
392 dpurdie 1080
 
1081
    #
1082
    #   Highlight packages that have not been mapped to a Repo
1083
    #
2016 dpurdie 1084
Message("Not Mapped");
2321 dpurdie 1085
    $HTML = generateHTMLHeader ('SA');
1086
    print $HTML "Packages that have not been mapped to a Repository\n";
392 dpurdie 1087
    $t = new HTML::Table( -border=>1 );
1088
    foreach my $pkgid ( @{$Repos{UNKNOWN}} )
1089
    {
1090
        my $flag_badCC;
1091
        my $flag_multi;
1092
        my $flag_badVob;
1093
 
1094
        $flag_multi  = 1 if $PackageData{$pkgid}{MultiVob};
1095
        $flag_badVob = 1 if $PackageData{$pkgid}{BadVob};
1096
 
1097
        foreach my $pvid ( @{$PackageSet{$pkgid}} )
1098
        {
1099
            $flag_badCC  = 1 if ( $ScmPackages{$pvid}{BadCCView} );
1100
            $flag_multi  = 1 if ( $ScmPackages{$pvid}{MultiVob} );
1101
            $flag_badVob = 1 if ( $ScmPackages{$pvid}{BadVob} );
1102
        }
1103
 
1104
        my @data;
1105
        push @data, "Bad ClearCase View" if $flag_badCC;
1106
        push @data, "Multiple Vobs" if $flag_multi;
1107
        push @data, "Bad VcsTag" if $flag_badVob;
1108
        $t->addRow( linkPackageDetails($pkgid), join( '<br>', @data) );
1109
    }
1110
 
1111
    $t->setColClass (1, 'listTitle' );
2321 dpurdie 1112
    print $HTML $t->getTable;
1113
    generateHTMLTail($HTML);
1114
 
392 dpurdie 1115
    #
1116
    #   Packages already under Subversion
1117
    #
2016 dpurdie 1118
Message("In Subversion");
2321 dpurdie 1119
    $HTML = generateHTMLHeader ('SB');
1120
    print $HTML "Packages that are currently in Subversion\n";
1121
    print $HTML "<br>Packages in Subversion: ". scalar @{$Repos{SVN}} ."\n";
1122
    print $HTML anchor("SVN",'SVN');
1270 dpurdie 1123
 
392 dpurdie 1124
    $t = new HTML::Table( -border=>1 );
1125
    foreach my $pkgid ( @{$Repos{SVN}} )
1126
    {
1127
        my %RepoList;
1128
        foreach my $pvid ( @{$PackageSet{$pkgid}} )
1129
        {
1130
            my $repo = $ScmPackages{$pvid}{'vcstag'};
1270 dpurdie 1131
            if ( $repo =~ m~SVN::(.*)(/tags/|/branches/|/trunk)~i )
1132
            {
1133
                $RepoList{$1} = svnLink($1) unless exists $RepoList{$1};
1134
            }
392 dpurdie 1135
        }
1270 dpurdie 1136
        $t->addRow( linkPackageDetails($pkgid), join( '<br>', values %RepoList) );
392 dpurdie 1137
    }
2321 dpurdie 1138
    print $HTML $t->getTable;
392 dpurdie 1139
 
2321 dpurdie 1140
    generateHTMLTail($HTML);
392 dpurdie 1141
Message ("Created: PackageConversion.html");
1142
}
1143
 
2321 dpurdie 1144
sub hRef
1145
{
1146
    my ($url, $text, $target) = @_;
1147
    my $ttext = '';
392 dpurdie 1148
 
2321 dpurdie 1149
    if ( $url =~ m~^#(.*?)_~ )
392 dpurdie 1150
    {
2321 dpurdie 1151
        my $tag = $1;
1152
        foreach my $section ( keys %htmlData )
392 dpurdie 1153
        {
2321 dpurdie 1154
            if ( $htmlData{$section}{tag} eq $1 )
392 dpurdie 1155
            {
2321 dpurdie 1156
                $url = $htmlData{$section}{file} . $url;
1157
                $target = '_Page'.$section unless ( $target );
392 dpurdie 1158
            }
1159
        }
1160
    }
1161
 
1162
    $ttext = ' TARGET="' . $target . '"' if ( defined $target );
1163
    return ( '<a href="' . $url . '"' . $ttext . '>' . $text . '</a>' );
1164
}
1165
 
1166
sub anchor
1167
{
1168
    my ($name, $text) = @_;
2321 dpurdie 1169
    my $prefix = '';
1170
    if ( $currentSection )
1171
    {
1172
        $prefix = $htmlData{$currentSection}{tag};
1173
        $prefix = $prefix . '_' if ( $prefix );
1174
    }
1175
    return ( '<a name="' . $prefix . $name . '">' . $text . '</a>' );
392 dpurdie 1176
}
1177
 
1178
 
1179
sub htmlH1
1180
{
1181
    my ($text) = @_;
1182
    return '<h1>' . $text . '</h1>';
1183
}
1184
 
395 dpurdie 1185
sub linkBomProject
1186
{
1187
    my ($projId, $text) = @_;
1188
    my $ref = $GBE_DM_URL . "/Default.asp?proj_id=$projId";
1189
 
1190
    return hRef($ref, $text, '_packageData');
1191
}
1192
 
1193
 
392 dpurdie 1194
sub linkRelease
1195
{
1196
    my ($pkgid, $pvid, $mode) = @_;
1197
    my $pkgid_ref = $GBE_RM_URL . "/fixed_issues.asp?rtag_id=$pkgid";
1198
    $pkgid_ref .= "&pv_id=$pvid" if defined $pvid;
1199
 
1200
    my $text = '';
1201
    $text .= "$ScmReleases{$pkgid}{pName} :: " unless ( $mode );
1202
    $text .= $ScmReleases{$pkgid}{name};
1203
 
1204
    $text = hRef($pkgid_ref, $text, '_packageData');
1205
}
1206
 
1207
sub linkPackageDetails
1208
{
1209
    my ($pkgid) = @_;
1210
    my $name = $PackageData{$pkgid}{name};
1211
    return hRef("#Package_${name}",$name);
1212
}
1213
 
1214
sub linkPvid
1215
{
1216
    my ($pvid, $rtagid, $mode) = @_;
1217
    my $pv_base = $GBE_RM_URL . "/fixed_issues.asp?pv_id=$pvid";
1218
    $pv_base .= "&rtag_id=$rtagid" if ($rtagid);
1219
 
1220
    my $text = '';
1221
    $text .= "$ScmPackages{$pvid}{'name'} " unless ( $mode );
1222
    $text .= $ScmPackages{$pvid}{'version'};
1223
    return hRef($pv_base, $text, '_packageData');
1224
}
1225
 
1341 dpurdie 1226
sub linkFindPkgs
1227
{
1228
    my ($name, $rtagid) = @_;
1229
    my $pv_base = $GBE_RM_URL . "/find.asp?searchtype=1&keyword=$name&btn=Find&envtab=3&rtag_id=$rtagid";
1230
    return hRef($pv_base, $name, '_packageData');
1231
}
1232
 
392 dpurdie 1233
sub linkPkg
1234
{
1235
    my ($pkgid, $utext) = @_;
1236
    my $rm_base = $GBE_RM_URL . "/view_by_version.asp?pkg_id=$pkgid";
1237
    my $text = $utext ? $utext : $PackageData{$pkgid}{name};
1238
    return hRef($rm_base, $text , '_packageData');
1239
}
1240
 
1241
sub linkImage
1242
{
1243
    my ($pkgid, $utext) = @_;
1244
    my $name = $PackageData{$pkgid}{name};
1245
    my $ref = $name . '.svg';
1246
    my $text = $utext ? $utext : $name;
1247
    return hRef($ref, $text, '_packageImage');
1248
}
1249
 
1250
sub linkImportLog
1251
{
1252
    my ($pkgid, $utext) = @_;
1253
    my $name = $PackageData{$pkgid}{name};
1254
    my $ref = $name . '.importlog';
1255
    my $text = $utext ? $utext : $name;
1256
    return hRef($ref, $text, '_packageLog');
1257
}
1258
 
1270 dpurdie 1259
sub svnLink
1260
{
1261
    my ($tag, $utext) = @_;
1262
    my $text = $utext ? $utext : $tag;
392 dpurdie 1263
 
1270 dpurdie 1264
    $tag =~ s~^SVN::~~;
1265
    my $url = SvnPath2Url ($tag);
1266
    return hRef($url, $text, '_SvnPage');
1267
}
392 dpurdie 1268
 
1270 dpurdie 1269
 
1270
 
392 dpurdie 1271
#-------------------------------------------------------------------------------
1272
# Function        : startExpander
1273
#                   endExpander
1274
#
1275
# Description     : Insert HTML code to start/end a Javascript expanding
1276
#                   division.
1277
#
1278
# Inputs          : $name           - Unique name for the Section
1279
#                   $text           - Header Text to be displayed
1280
#
1281
# Returns         : 
1282
#
1283
sub startExpander
1284
{
2321 dpurdie 1285
    my ($HTML, $name, $text) = @_;
1286
    print $HTML <<EXPANDER;
392 dpurdie 1287
<div class="expandingMenu expandingMenuNotSelected">
1288
    <div onclick='click_expandingMenuHeader(this,"$name")' class="expandingMenuHeader" >$text</div>
1289
	<div id="cssprop_$name" class="expandingMenuGroup" style="display:none;">
1290
EXPANDER
1291
}
1292
 
1293
sub endExpander
1294
{
2321 dpurdie 1295
    my ($HTML) = @_;
1296
    print $HTML "</div></div>\n";
392 dpurdie 1297
}
1298
 
1299
 
1300
#    if ( 0 )
1301
#    {
1302
#        my $file = "TagList.txt";
1303
#        my $count = 0;
1304
#        Message("Create CC Tag  List", $file);
1305
#        open ( my $fh, '>', $file ) || Error ("Cannot open $file", "Error: $!");
1306
#        my %PackageNames;
1307
#
1308
#        foreach ( sort @taglist )
1309
#        {
1310
#            print $fh "$_\n";
1311
#            $count++;
1312
#        }
1313
#        close $fh;
1314
#        Message("Tags: $count");
1315
#    }
1316
 
1317
 
1318
#    DebugDumpData("VersionTags", \%VersionTags);
1319
#    DebugDumpData("Vobs", \%Vobs);
1320
    #print "VOBS: ", join ("\n", sort keys %Vobs), "\n";
1321
 
1322
#-------------------------------------------------------------------------------
404 dpurdie 1323
# Function        : readInputData
392 dpurdie 1324
#
1325
# Description     : Write out data in a form to allow post processing
1326
#
1327
# Inputs          : 
1328
#
1329
# Returns         : 
1330
#
404 dpurdie 1331
sub readInputData
392 dpurdie 1332
{
1333
 
1334
    my $fname = 'cc2svn.raw.txt';
1335
    Message ("Reading: $fname");
1336
    Error "Cannot locate $fname" unless ( -f $fname );
1337
    require $fname;
1338
 
1339
    Error "Data in $fname is not valid\n"
1340
        unless ( keys(%ScmReleases) >= 0 );
1341
 
1342
#    DebugDumpData("ScmReleases", \%ScmReleases );
1343
#    DebugDumpData("ScmPackages", \%ScmPackages );
1344
#    DebugDumpData("ScmSuffixes", \%ScmSuffixes );
1345
 
1346
    %ScmSuffixes = ();
1347
}
1348
 
1349
##-------------------------------------------------------------------------------
1350
## Function        : getVobMapping
1351
##
1352
## Description     : Read in Package to Repository Mapping
1353
##
1354
## Inputs          :
1355
##
1356
## Returns         : Populates
1357
#                        #%VobMapping;                 # Vob -> Repo
1358
#                        #%PackageMapping;             # Package -> Repo
1359
#                        #%ViewMapping                 # View -> Repo
1360
#sub getVobMapping
1361
#{
1362
#    my $fname = 'cc2svn.mapping.txt';
1363
#    Message ("Reading: $fname");
1364
#    Error "Cannot locate $fname" unless ( -f $fname );
1365
#    require $fname;
1366
#
1367
#    Error "Data in $fname is not valid\n"
1368
#        unless ( keys(%PackageMapping) >= 0 );
1369
#
1370
#    DebugDumpData("PackageMapping", \%PackageMapping );
1371
#    DebugDumpData("VobMapping", \%VobMapping );
1372
#    DebugDumpData("ViewMapping", \%ViewMapping );
1373
#
1374
#}
1375
 
1376
 
1377
#-------------------------------------------------------------------------------
1378
# Function        : mapPackage
1379
#
1380
# Description     : Attempt to map a package to a repo
1381
#
1382
# Inputs          : PackageId
1383
#
1384
# Returns         : RepoPatch
1385
#
1386
sub mapPackage
1387
{
1388
    my ($pkgid) = @_;
1389
    my %Named = (
1390
        'Release_Manager'                       => 'DevTools/ManagerSuite',
1391
        'Access_Manager'                        => 'DevTools/ManagerSuite',
1392
        'Deployment_Manager'                    => 'DevTools/ManagerSuite',
1393
        'Production_Manager'                    => 'DevTools/ManagerSuite',
1394
        'schema_utilities'                      => 'DevTools/ManagerSuite',
1395
        'Release_Manager_Schema'                => 'DevTools/ManagerSuite',
1396
        'Manager_Suite'                         => 'DevTools/ManagerSuite',
1397
        'Manager_Suite_VM'                      => 'DevTools/ManagerSuite',
1398
 
1399
        'QtBuilder'                             => 'DevTools',
1400
        'buildtool'                             => 'DevTools',
1401
        'cabinet_packager'                      => 'DevTools',
1402
        'core_devl'                             => 'DevTools',
1403
        'debian_packager'                       => 'DevTools',
1404
        'deployfiles'                           => 'DevTools',
1405
        'dpkg_blat'                             => 'DevTools',
1406
        'dpkg_management'                       => 'DevTools',
1407
        'generate_release_notes'                => 'DevTools',
1408
        'jants'                                 => 'DevTools',
1409
        'linux_day0fs_tools'                    => 'DevTools',
1410
        'manifest-tool'                         => 'DevTools',
1411
        'nsis_packager'                         => 'DevTools',
2039 dpurdie 1412
        'nsis_library'                          => 'DevTools',
392 dpurdie 1413
        'shellbuild'                            => 'DevTools',
1414
        'wsdl-tools'                            => 'DevTools',
1415
        'binflow'                               => 'DevTools',
1416
        'zendguard_tools'                       => 'DevTools',
1417
        'cpptasks'                              => 'DevTools/ant',
1418
        'AdvisoryDependency'                    => 'DevTools/buildtool_tests',
1419
        'CommonDependency'                      => 'DevTools/buildtool_tests',
1420
        'GenericProduct'                        => 'DevTools/buildtool_tests',
1421
        'LinuxCentricProduct'                   => 'DevTools/buildtool_tests',
1422
        'CotsWithFunnyVersion'                  => 'DevTools/buildtool_tests',
1423
 
1424
        'GenAppaCE'                             => 'DPG_SWCode/utilities',
1425
 
1426
        'AtmelHAL'                              => 'MASS_Dev_Crypto',
1427
        'Netbula'                               => 'COTS',
1428
        'ObjectiveGrid'                         => 'COTS',
1429
        'lmos'                                  => 'DPG_SWBase',
1430
        'basetypes'                             => 'MASS_Dev_Infra',
1431
        'accesscontrol_ejb-api'                 => 'MASS_Dev_Infra/security',
1432
        'tp5000_MUG'                            => 'MREF_Package',
1433
        'udman'                                 => 'MASS_Dev_Infra',
1434
        'emvud'                                 => 'DPG_SWBase/emvud',
1435
        'daf_mmi_ti'                            => 'DPG_SWBase',
1436
        'mos_api'                               => 'MOS',
1437
        'tp5700_Manifest'                       => 'MREF_Package',
1438
        'TRACS'                                 => 'TRACS',
1439
 
1440
        'jboss_config'                          => 'MASS_Dev_Bus/Business' ,
1441
        'jboss_service'                         => 'MASS_Dev_Bus/Business' ,
1197 dpurdie 1442
        'pgres'                                 => 'ITSO_TRACS/DataManagement' ,
395 dpurdie 1443
        'ERGcda_imports'                        => 'MREF_Package',
392 dpurdie 1444
 
1445
    );
1446
 
1447
    my %VobRename = (
395 dpurdie 1448
        'LMOS'              => 'LinuxDevices',
392 dpurdie 1449
        'MANUFACTURING'     => 'Manufacturing',
1450
        'MREF_Package'      => 'MREF_Package',
1451
        'MASS_Dev'          => 'MASS_Dev_Bus',
1452
        's4k_tracs'         => 'TRACS',
1453
        'MASS_Dev_Tools'    => 'DevTools',
1197 dpurdie 1454
 
1455
        'GMPTE2005'             => 'ITSO_TRACS',
1456
        'GMPTE2005_obe'         => 'ITSO_TRACS',
1457
        'UK_ITSO_COMPLIANT'     => 'ITSO_TRACS',
392 dpurdie 1458
    );
1459
 
1460
    # default is 1
1461
    my %VobDepth = (
1462
        'DPG_SWBase'                => 2,
1197 dpurdie 1463
        'ITSO_TRACS'                => 2,
1451 dpurdie 1464
        'ITSO_TRACS/Packages'       => 1,
1197 dpurdie 1465
        'LinuxDevices'              => 2,
392 dpurdie 1466
        'MASS_Dev_Bus'              => 2,
1467
        'MASS_Dev_Infra'            => 2,
1468
        'MPR'                       => 2,
1469
        'ProjectCD'                 => 2,
1470
        'TRACS'                     => 2,
1471
        'VIX-PAYMENTS'              => 2,
1472
        'WINCE500'                  => 2,
1197 dpurdie 1473
        'LinuxDevices/linux'        => 3,
392 dpurdie 1474
        'DAMS_mos_diag'             => 2,
1475
        'MASS_Dev_Bus/Financial'    => 3,
1476
    );
1477
 
1478
    return ('SVN') if ( $PackageData{$pkgid}{isSVN} );
1479
    my $name = $PackageData{$pkgid}{name};
1480
 
1481
    # If only one VOB
1482
    #
1483
    my $path = '';
1484
    unless ( $PackageData{$pkgid}{BadVob} || $PackageData{$pkgid}{MultiVob} )
1485
    {
1197 dpurdie 1486
        my @paths = reverse sort keys %{$PackageData{$pkgid}{vobPath}};
392 dpurdie 1487
        $path = $paths[0] if exists $paths[0];
1488
    }
1489
 
1490
    #
1491
    #   Some path cleanup
1492
    #
1493
    if ( $path )
1494
    {
2319 dpurdie 1495
        $path =~ s~/build.pl$~~i;
1496
        $path =~ s~/src$~~i;
395 dpurdie 1497
        $path =~ s~DPC_SWCode/~DPG_SWCode/~i;
392 dpurdie 1498
        $path =~ s~MASS_Dev/Bus/~MASS_Dev_Bus/~i;
1499
        $path =~ s~MASS_Dev_Bus/Cbp/~MASS_Dev_Bus/CBP/~i;
1500
        $path =~ s~/Vastraffik/~/Vasttrafik/~;
1501
        $path =~ s~/MREF_Package/ergpostmongui$~/MREF_Package/ergpostmongui~i;
1502
    }
1503
 
1504
    #
1505
    #   Brute force VOB renaming
1506
    #
1507
    foreach my $name ( keys %VobRename  )
1508
    {
1509
        my $newName = $VobRename{$name};
1510
        $path =~ s~^/$name/~/$newName/~i;
1197 dpurdie 1511
        $path =~ s~^/$name$~/$newName~i;
392 dpurdie 1512
    }
1513
 
395 dpurdie 1514
    return $Named{$name}  if ( exists $Named{$name} );
1515
 
1516
    return 'DevTools/ant'  if ( $name =~ m~^ant~ );
1517
    return 'DevTools/ant'  if ( $name =~ m~^jant~ );
1518
 
1519
    return 'LinuxDevices/tools' if ( $path =~ m~LinuxDevices/linux/tools~i );
1520
 
1521
    return 'MASS_Dev_Dataman' if ( $name =~ m~^dm_~ );
1522
 
1523
    return 'MPR/EMV/emvl2' if ( $name =~ m~^cp[sf]-~ );
1524
 
1525
    return 'COTS' if ( $PackageData{$pkgid}{type} eq 'COTS' && ! exists $PackageData{$pkgid}{vobs}{'LMOS'});
1526
 
1527
    #
1528
    #   Must resolve Multivobs
1529
    #
1530
    if ( $PackageData{$pkgid}{MultiVob} )
1531
    {
1532
        $path = resolveMultiVob($name, $pkgid );
1533
    }
1534
 
392 dpurdie 1535
    my $vob = '';
1536
    my @pathBase;
1537
    my @pathFull;
1538
    $path =~ s~/$~~g;
1539
    $path =~ s~^/~~g;
1540
    @pathFull = split( '/', $path);
1541
    $vob = $pathFull[0] || $path;
1542
    push @pathFull, $vob unless ( @pathFull );
1543
 
1544
    @pathBase = @pathFull;
1545
    delete $pathBase[-1];
1546
    push @pathBase, $vob unless ( @pathBase );
1547
 
1548
#print "Full: @pathFull\n";
1549
#print "Base: @pathBase\n";
1550
 
395 dpurdie 1551
    return 'MOS/images'  if (($vob eq 'COTS' || $vob eq 'MOS') &&  $name =~ m~^mos_~ && $name =~ m~\d\d\d\d~);
392 dpurdie 1552
 
1553
    return 'COTS' if ( $vob =~ m~^COTS_~ );
1554
    return 'COTS' if ( $vob eq 'COTS' );
1555
 
1556
    return 'DPG_SWBase/Demos'  if ($vob eq 'DPG_SWBase' &&  $name =~ m~^demo_~ );
1557
    return 'DPG_SWBase/Demos'  if ( $name =~ m~^qt_demo~ );
1558
 
1559
    return 'DPG_SWBase/daf_utils'  if ( $name =~ m~^time_ce~ );
1560
    return 'DPG_SWBase/daf_utils'  if ( $name =~ m~^daf_utils~ );
1561
    return 'DPG_SWBase/daf_utils'  if ( $name =~ m~^daf_bertlv~ );
1562
    return 'DPG_SWBase'            if ( $name =~ m~^daf_br_compiler~ );
1563
    return 'DPG_SWBase'            if ( $name =~ m~^hcp5000icons$~ );
1564
 
1565
    return 'DPG_SWBase/daf_components'  if ( $vob eq 'DPG_SWBase' && $name =~ m~^daf_component_~ );
1566
    return 'DPG_SWBase/daf_transap'  if ( $path =~ m~/transap$~ || $path =~ m~/transap/~ );
1567
#   return 'DPG_SWBase/daf'  if ( $vob eq 'DPG_SWBase' && $name =~ m~^daf_~ );
1568
    return 'DPG_SWBase/IDC'  if ( $vob =~ m~DPG_SW~ && $name =~ m~^IDC~ );
1569
 
1570
    return 'DPG_SWCode/dac'  if ( $name =~ m~^dac_~ );
1571
    return 'DPG_SWCode/ddu'  if ( $name =~ m~^ddu_~ );
1572
    return 'DPG_SWCode/utilities'  if ( $vob eq 'DPG_SWCode' && $path =~ m/utilities/ );
1573
 
1574
    if ( $name =~ m~^VIX~ || $name =~ m~^ERG~ )
1575
    {
1576
        return 'MREF_Package'
395 dpurdie 1577
            if ( $vob =~ m~^CORE~ || $vob =~ m~^MASS~ || $vob =~ m~^MREF~ );
392 dpurdie 1578
    }
1579
 
1580
#    if ( $vob ne 'MREF_Package' )
1581
#    {
1582
#print "---- $name, $path\n" if ( $name =~ m~^VIX~ );
1583
#print "---- $name, $path\n" if ( $name =~ m~^ERG~ );
1584
#    }
1585
 
1586
    #
1587
    #   ProjectCd is badly done
1588
    #   Many packages are in named directories, some are not.
1589
    #
1590
    if ( $vob eq 'ProjectCD' )
1591
    {
1592
        return $vob if ( $name eq 'daf_paper_variables' );
1593
        return ($vob . '/seattle')
1594
            if (  grep {$_ eq 'seattle'} @pathFull );
1595
        return ($vob . '/stockholm')
1596
            if (  grep {$_ eq 'stockholm'} @pathFull );
1597
        return $vob;
1598
    }
1599
 
395 dpurdie 1600
    #
1601
    #   Detect core_xxx packages
1602
    #
1603
    if ( $vob eq 'MASS_Dev_Infra' && $path =~ m~/core_~ )
1604
    {
1605
        return "$vob/Core";
1606
    }
1607
 
392 dpurdie 1608
    return "UNKNOWN"
1609
        unless ( $vob );
1610
 
1611
    #
1612
    #   Determine depth for this path
1613
    #
1614
    my $depth = 1;
1615
    foreach ( reverse sort keys %VobDepth)
1616
    {
1617
        if ( $path =~ m~^$_~ )
1618
        {
1619
            $depth = $VobDepth{$_};
1620
            last;
1621
        }
1622
    }
1623
#print "--Joining: $name, $depth, @pathBase\n";
1624
    return pathJoin($depth, $path, $name, @pathBase);
1625
}
1626
 
1627
sub pathJoin
1628
{
1629
    my ($num, $path, $name, @data) = @_;
1630
    my $val = '';
1631
    my $char = '';
1632
    for( my $ii = 0; $ii < $num; $ii++)
1633
    {
1634
        last unless ( defined $data[$ii] );
1635
        $val = $val . $char . $data[$ii];
1636
        $char = '/'
1637
    }
1638
#print "----$path, $name: $num, @data --> $val\n";
1639
    return $val;
1640
}
1641
 
395 dpurdie 1642
 
392 dpurdie 1643
#-------------------------------------------------------------------------------
395 dpurdie 1644
# Function        : resolveMultiVob
1645
#
1646
# Description     : Time to resolve multivob issues
1647
#
1648
# Inputs          : $name           - Package Name
1649
#                   $pkgid          - Package ID
1650
#
1651
#
1652
# Returns         : Resulved path
1653
#
1654
sub resolveMultiVob
1655
{
1656
    my ($name, $pkgid) = @_;
1657
    my $path = '';
1658
 
1659
my %preferredVob = (
1660
        'uiconv'        => 'DPG_SWBase',
1661
        'gnupg'         => 'COTS',
1662
    );
1663
 
1664
 
1665
    my $pvob = $preferredVob{$name};
1666
    unless ( defined $pvob )
1667
    {
1668
        if ( exists ($PackageData{$pkgid}{vobs}{MASS_Dataman}) && exists ($PackageData{$pkgid}{vobs}{MASS_Dev_Dataman})  )
1669
        {
1670
            $pvob = 'MASS_Dev_Dataman';
1671
        }
1672
 
1673
        if ( exists ($PackageData{$pkgid}{vobs}{DPG_SWBase}) && exists ($PackageData{$pkgid}{vobs}{DPG_SWCode})  )
1674
        {
1675
            $pvob = 'DPG_SWCode';
1676
        }
1677
 
1678
        if ( exists ($PackageData{$pkgid}{vobs}{MREF_Package}) )
1679
        {
1680
            $pvob = 'MREF_Package';
1681
        }
1682
 
1683
        if ( exists ($PackageData{$pkgid}{vobs}{MASS_Dev}) && exists ($PackageData{$pkgid}{vobs}{MASS_Dev_Bus}))
1684
        {
1685
            $pvob = 'MASS_Dev_Bus';
1686
        }
1687
 
1688
        if ( exists ($PackageData{$pkgid}{vobs}{s4k_obe}) && exists ($PackageData{$pkgid}{vobs}{GMPTE2005}))
1689
        {
1690
            $pvob = 'GMPTE2005';
1691
        }
1692
 
1693
        if ( exists ($PackageData{$pkgid}{vobs}{s4k_obe}) && exists ($PackageData{$pkgid}{vobs}{GMPTE2005_obe}))
1694
        {
1695
            $pvob = 'GMPTE2005_obe';
1696
        }
1697
 
1698
        if ( exists ($PackageData{$pkgid}{vobs}{TRACS}) && exists ($PackageData{$pkgid}{vobs}{GMPTE2005}))
1699
        {
1700
            $pvob = 'GMPTE2005';
1701
        }
1702
 
1703
        if ( exists ($PackageData{$pkgid}{vobs}{MASS_Dev_Infra}) && exists ($PackageData{$pkgid}{vobs}{MASS_Dev_Tools}))
1704
        {
1705
            $pvob = 'MASS_Dev_Infra';
1706
        }
1707
 
1708
        if ( exists ($PackageData{$pkgid}{vobs}{COTS}) && exists ($PackageData{$pkgid}{vobs}{MOS}))
1709
        {
1710
            $pvob = 'MOS';
1711
        }
1712
 
1713
        if ( exists ($PackageData{$pkgid}{vobs}{COTS}) && exists ($PackageData{$pkgid}{vobs}{MPR}))
1714
        {
1715
            $pvob = 'MPR';
1716
        }
1717
 
1718
        if ( exists ($PackageData{$pkgid}{vobs}{COTS}) && exists ($PackageData{$pkgid}{vobs}{COTS_Java}))
1719
        {
1720
            $pvob = 'COTS';
1721
        }
1722
    }
1723
 
1724
    if ( defined $pvob )
1725
    {
1726
        if ( exists $PackageData{$pkgid}{vobResolver}{$pvob} )
1727
        {
1728
            $path = $PackageData{$pkgid}{vobResolver}{$pvob} ;
1729
        }
1730
    }
1731
    else
1732
    {
1733
        Message ("Unresolved multivob: $PackageData{$pkgid}{name}");
1734
#DebugDumpData("DATA", \$PackageData{$pkgid} );
1735
#exit 1;
1736
    $path = 'UNKNOWN';
1737
    }
1738
 
1739
    return $path;
1740
}
1741
 
1742
 
1743
#-------------------------------------------------------------------------------
392 dpurdie 1744
# Function        : examineVcsTag
1745
#
1746
# Description     : Examine a VCS Tag and determine if it looks like rubbish
1747
#
1748
# Inputs          : Tag to examine
1749
#
1750
# Returns         : Badness
1751
#
1752
sub examineVcsTag
1753
{
1754
    my ($vcstag) = @_;
1755
    my $bad = 0;
1756
    if ( $vcstag =~ m~^CC::(.*?)(::(.+))?$~ )
1757
    {
1758
        my $path = $1  || '';
1759
        my $label = $2 || '';
1760
#print "$vcstag, $bad, $path, $label\n";
1761
        $bad = 1 unless ( $label );
1762
        $bad = 1 if ( $label =~ m~^N/A$~i || $label  =~ m~^na$~i );
1763
 
1764
        $bad = 1 unless ( $path );
1765
        $bad = 1 if ( $path =~ m~^N/A$~i || $path  =~ m~^na$~i );
1766
        $bad = 1 if ( $path =~ m~^/dpkg_archive~ );
395 dpurdie 1767
        $bad = 1 if ( $path =~ m~^CVS~ );
392 dpurdie 1768
        $bad = 1 if ( $path =~ m~^dpkg_archive~ );
1769
        $bad = 1 if ( $path =~ m~^http:~i );
1770
        $bad = 1 if ( $path =~ m~^[A-Za-z]\:~ );
1771
        $bad = 1 if ( $path =~ m~^//~ );
1772
        $bad = 1 if ( $path =~ m~^/blade1/~ );
1773
        $bad = 1 if ( $path =~ m~^/devl/~ );
394 dpurdie 1774
        $bad = 1 if ( $path =~ m~^/*none~i );
1775
        $bad = 1 if ( $path =~ m~^/*NoWhere~i );
1776
        $bad = 1 if ( $path =~ m~^-$~i );
392 dpurdie 1777
        $bad = 1 if ( $path =~ m~[()]~ );
1778
#        $bad = 1 unless ( $path =~ m~^/~ );
1779
    }
1780
    else
1781
    {
1782
        $bad = 1;
1783
    }
1784
    return $bad;
1785
}
1786
 
1787
#-------------------------------------------------------------------------------
1788
# Function        : usedBy
1789
#
1790
# Description     : Given a pvid, determine which release(s) need it
1791
#
1792
# Inputs          : $pvid
1793
#
1794
# Returns         : Nothing
1795
#
1796
sub usedBy
1797
{
1798
    my ($pvid) = @_;
1799
    Error ("PVID is not an essential package") unless ( exists $ScmPackages{$pvid} );
1800
 
1801
    my @releases = @{$ScmPackages{$pvid}{'release'}} if exists($ScmPackages{$pvid}{'release'});
1802
    my @users = @{$ScmPackages{$pvid}{'usedBy'}} if exists($ScmPackages{$pvid}{'usedBy'});
1803
 
1804
    while ( @users )
1805
    {
1806
        my $pv = pop @users;
1807
        push @releases, @{$ScmPackages{$pv}{'release'}} if (exists $ScmPackages{$pv}{'release'});
1808
        push @users, @{$ScmPackages{$pv}{'usedBy'}} if (exists($ScmPackages{$pv}{'usedBy'}));
1809
    }
1810
 
1811
    my %releases;
1812
    my %ireleases;
1813
    my @dreleases = ();
1814
    my @ireleases;
1815
    foreach ( @releases )
1816
    {
1817
        if ( $ScmPackages{$pvid}{tlp}  )
1818
        {
1819
            next if ( exists $releases{$_} );
1820
            push @dreleases, $_;
1821
            $releases{$_} = 1;
1822
        }
1823
        else
1824
        {
1825
            next if ( exists $ireleases{$_} );
1826
            push @ireleases, $_;
1827
            $ireleases{$_} = 1;
1828
        }
1829
    }
1830
    return \@dreleases, \@ireleases;
1831
}
1832
 
1833
#-------------------------------------------------------------------------------
1834
# Function        : smartPackageType
1835
#
1836
# Description     : Have a look at the projects in the package set and
1837
#                   attempt to determine what sort of mechanism to use
1838
#
1839
# Inputs          : pkgid            - Package ID
1840
#
1841
# Returns         : Type, Array of suffixes
1842
#
1843
sub smartPackageType
1844
{
1845
    my ($pkgid) = @_;
1846
    my %suffixes;
1847
 
1848
    #
1849
    #   Suffixes for all packages
1850
    #
1851
    foreach  ( @{$PackageSet{$pkgid}} )
1852
    {
1853
        my $suffix = $ScmPackages{$_}{'suffix'};
1854
        $suffixes{$suffix}++;
1855
    }
1856
 
1857
    my $packageType = 'UNKNOWN';
1858
 
1859
    if ( exists $suffixes{'.cots'} ) {
1860
        $packageType = 'COTS';
1861
 
1862
    } elsif ( exists $suffixes{'.tool'} ) {
1863
        $packageType = 'TOOL';
1864
 
1865
    } elsif ( scalar (keys %suffixes ) == 1 ) {
1866
        $packageType = 'SINGLE_PROJECT';
1867
 
1868
    } else {
1869
        $packageType = 'MULTIPLE_PROJECT';
1870
    }
1871
 
1872
    return $packageType, keys %suffixes;
1873
}
1874
 
394 dpurdie 1875
 
392 dpurdie 1876
#-------------------------------------------------------------------------------
394 dpurdie 1877
# Function        : vcsCleanup
1878
#
1879
# Description     : Cleanup and rewrite a vcstag
1880
#
1881
#                   DUPLICATED IN:
1882
#                       - cc2svn_procdata
2319 dpurdie 1883
#                       - cc2svn_importpackage
394 dpurdie 1884
#
1885
# Inputs          : vcstag
1886
#
1887
# Returns         : Cleaned up vcs tag
1888
#
1889
sub vcsCleanup
1890
{
1891
    my ($tag) = @_;
1892
    $tag =~ tr~\\/~/~;
1893
    if ( $tag =~ m~^CC::~ )
1894
    {
1895
        $tag =~ s~CC::\s+~CC::~;
2319 dpurdie 1896
        $tag =~ s~/build.pl::~::~i;
1897
        $tag =~ s~/src::~::~i;
394 dpurdie 1898
        $tag =~ s~MASS_Dev_Bus/Cbp/~MASS_Dev_Bus/CBP/~i;
1899
        $tag =~ s~MASS_Dev_Bus~MASS_Dev_Bus~i;
1900
        $tag =~ s~/MASS_Dev/Infra~MASS_Dev_Infra~i;
1901
        $tag =~ s~/MASS_Dev/Bus/web~/MASS_Dev_Bus/web~i;
1902
 
1903
        $tag =~ s~/Vastraffik/~/Vasttrafik/~;
1904
        $tag =~ s~/MREF_Package/ergpostmongui$~/MREF_Package/ergpostmongui~i;
395 dpurdie 1905
        $tag =~ s~DPC_SWCode/~DPG_SWCode/~i;
394 dpurdie 1906
 
1907
    }
1908
    return $tag;
1909
}
1910
 
1911
#-------------------------------------------------------------------------------
392 dpurdie 1912
# Function        : extractVob
1913
#
1914
# Description     : Extract the VOB for a package
1915
#
1916
# Inputs          : $entry              - pvid
1917
#
1918
# Returns         : Vob Name
1919
#
1920
sub extractVob
1921
{
1922
    my ($entry) = @_;
1923
 
394 dpurdie 1924
    $ScmPackages{$entry}{'vcstag'} = vcsCleanup($ScmPackages{$entry}{'vcstag'});
392 dpurdie 1925
 
1926
    my $tag = $ScmPackages{$entry}{vcstag};
1927
    my $package = $ScmPackages{$entry}{name};
1928
    if ( $tag =~ m~^SVN::~ )
1929
    {
1930
        $tag =~ m~SVN::(.*)(/tags/|/branches/|/trunk)~;
1931
        return 'SVN', $1;
1932
    }
1933
 
1934
    if ( $tag !~ m~^CC::~ || examineVcsTag ($tag)){
1935
        $ScmPackages{$entry}{BadVob} = 1;
1936
        return undef;
1937
    }
1938
 
1939
    $tag =~ m~^CC::(.*)::(.*)~;
1940
    my $path = '/' . $1;
1941
    $path =~ tr~\\/~/~s;
1942
    my @pelements = split( m'/+', $path);
1943
    my $vob = $pelements[1];
1944
    unless ( $vob )
1945
    {
1946
        $ScmPackages{$entry}{BadVob} = 1;
1947
        return undef;
1948
    }
1949
 
1950
    $ScmPackages{$entry}{VobName} = $vob;
1951
    $ScmPackages{$entry}{VobPath} = $path;
1952
    return $vob, $path;
1953
}
1954
 
1955
#-------------------------------------------------------------------------------
1956
# Function        : getBadLabelData
1957
#
1958
# Description     : Read in a previous log file and determine versions that
1959
#                   have already been examined
1960
#
1961
# Inputs          : 
1962
#
1963
# Returns         : 
1964
#
1965
sub getBadLabelData
1966
{
1967
    my $badFile = 'cc2svn_labeltest.bad.txt';
1968
    Message ("Reading Bad Label: $badFile");
1969
    open (my $fh, '<', $badFile ) || Error ("Cannot open $badFile");
1970
    while ( <$fh> )
1971
    {
1972
        #
1973
        #   Format of data is:
1974
        #       pvid, $name:, $tag, $rv
1975
        #
1976
        chomp;
1977
        next if ( m~^#~ );
1978
        my @data = split (/\s*,\s*/, $_);
1979
        next unless ( $data[0] );
1980
        $ScmPackages{$data[0]}{BadCCView} = 1 if exists ($ScmPackages{$data[0]});
1981
    }
1982
    close $fh;
1983
}
1984
 
1985
#-------------------------------------------------------------------------------
1986
#   Documentation
1987
#
1988
 
1989
=pod
1990
 
1991
=for htmltoc    SYSUTIL::cc2svn::
1992
 
1993
=head1 NAME
1994
 
1995
cc2svn_procdata - Process CC2SVN Essential Package Data
1996
 
1997
=head1 SYNOPSIS
1998
 
1999
  jats cc2svn_procdata [options]
2000
 
2001
 Options:
2002
    -help              - brief help message
2003
    -help -help        - Detailed help message
2004
    -man               - Full documentation
2005
    -usedby=PVID       - Determine 'Releases' that use a specified PVID
2006
    -allpackages       - Generate data for ALL packages
2007
 
2008
=head1 OPTIONS
2009
 
2010
=over 8
2011
 
2012
=item B<-help>
2013
 
2014
Print a brief help message and exits.
2015
 
2016
=item B<-help -help>
2017
 
2018
Print a detailed help message with an explanation for each option.
2019
 
2020
=item B<-man>
2021
 
2022
Prints the manual page and exits.
2023
 
2024
=item B<-usedby=PVID>
2025
 
2026
This option will alter the operation of the program. It will display the
2027
releases that 'use' the specified PVID and then exit.
2028
 
2029
=back
2030
 
2031
=head1 DESCRIPTION
2032
 
2033
This program is a tool used in the conversion of ClearCase VOBS to subversion.
2034
 
2035
=over 8
2036
 
2037
=item *
2038
 
2039
It will process a datafile and generate infiormation used by other tools.
2040
 
2041
=item *
2042
 
2043
It will display suspect package versions.
2044
 
2045
=item *
2046
 
2047
It will generate an HTML file with a great deal of information about the
2048
packages in the conversion.
2049
 
2050
=item *
2051
 
2052
It can backtrack a PVID and report the Release or Releases that need the package
2053
version
2054
 
2055
=back
2056
 
2057
=cut
2058