Subversion Repositories DevTools

Rev

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

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