Subversion Repositories DevTools

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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