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