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