Subversion Repositories DevTools

Rev

Rev 2449 | Rev 2553 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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