Subversion Repositories DevTools

Rev

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