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