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