Subversion Repositories DevTools

Rev

Rev 3967 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
392 dpurdie 1
########################################################################
2
# Copyright (C) 1998-2012 Vix Technology, All rights reserved
3
#
4
# Module name   : cc2svn_procdata.pl
5
# Module type   : Makefile system
6
# Compiler(s)   : Perl
7
# Environment(s): jats
8
#
9
# Description   : Get all packages that are used in all releases
10
#                 Post process data collected in 23a
11
#
12
#
13
#......................................................................#
14
 
15
require 5.006_001;
16
use strict;
17
use warnings;
18
use JatsError;
19
use JatsEnv;
20
use JatsSystem;
21
use Getopt::Long;
22
use Pod::Usage;                             # required for help support
23
use JatsRmApi;
24
use ConfigurationFile;
25
use HTML::Table;
1270 dpurdie 26
use JatsSvn;
392 dpurdie 27
 
28
use DBI;
29
our $GBE_RM_URL;
395 dpurdie 30
our $GBE_DM_URL;
392 dpurdie 31
 
32
my $VERSION = "1.2.3";                      # Update this
33
my $opt_verbose = 1;
34
my $opt_help = 0;
35
my $opt_manual;
36
my $opt_usedby;
37
my $opt_allpackages;
38
 
39
#
40
#   Package information
41
#
42
our %ScmReleases;
43
our %ScmPackages;
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',
3967 dpurdie 1616
        'JTerm'                                 => 'DPG_SWCode/utilities',
392 dpurdie 1617
 
1618
        'AtmelHAL'                              => 'MASS_Dev_Crypto',
1619
        'Netbula'                               => 'COTS',
1620
        'ObjectiveGrid'                         => 'COTS',
1621
        'lmos'                                  => 'DPG_SWBase',
2429 dpurdie 1622
#        'daf_cd_transap'                        => 'DPG_SWBase',
392 dpurdie 1623
        'basetypes'                             => 'MASS_Dev_Infra',
2429 dpurdie 1624
        'accesscontrol_ejb-api'                 => 'MASS_Dev_Infra/Security',
392 dpurdie 1625
        'tp5000_MUG'                            => 'MREF_Package',
1626
        'udman'                                 => 'MASS_Dev_Infra',
1627
        'emvud'                                 => 'DPG_SWBase/emvud',
1628
        'daf_mmi_ti'                            => 'DPG_SWBase',
2450 dpurdie 1629
        'daf_osa_mos'                           => 'DPG_SWBase/OSA',
392 dpurdie 1630
        'mos_api'                               => 'MOS',
1631
        'tp5700_Manifest'                       => 'MREF_Package',
2931 dpurdie 1632
#        'TRACS'                                 => 'ITSO_TRACS',
1633
        'SSW_Validator'                         => 'ITSO_TRACS/SSW_validator',
1634
        'itso_pcp_main'                         => 'ITSO_TRACS/itso_pcp',
392 dpurdie 1635
 
2931 dpurdie 1636
 
392 dpurdie 1637
        'jboss_config'                          => 'MASS_Dev_Bus/Business' ,
1638
        'jboss_service'                         => 'MASS_Dev_Bus/Business' ,
1197 dpurdie 1639
        'pgres'                                 => 'ITSO_TRACS/DataManagement' ,
395 dpurdie 1640
        'ERGcda_imports'                        => 'MREF_Package',
2764 dpurdie 1641
        'daf_dataman_extras'                    => 'DPG_SWCode/ProjectCD/seattle',
1642
        'daf_paper_variables'                   => 'DPG_SWCode/ProjectCD',
1643
 
2429 dpurdie 1644
        'XmlDocInterface'                       => 'MASS_Dev_Infra',
2450 dpurdie 1645
        'SPOS_IngenicoApp'                      => 'DPG_SWCode',
392 dpurdie 1646
 
3967 dpurdie 1647
        'oracs'                                 => 'MASS_Dev_Bus/web',
1648
        'oradacw'                               => 'MASS_Dev_Bus/web',
1649
        'orabocw'                               => 'MASS_Dev_Bus/web',
1650
        'MetrixOra'                             => 'MASS_Dev_Bus/web',
1651
 
2429 dpurdie 1652
        # Kill single package subdirs
1653
        'application'                           => 'MASS_Dev_Bus',
1654
        'card'                                  => 'MASS_Dev_Bus',
1655
        'cardholder'                            => 'MASS_Dev_Bus',
1656
        'opman-database'                        => 'MASS_Dev_Bus',
1657
        'product'                               => 'MASS_Dev_Bus',
1658
        'VmtInterface'                          => 'MASS_Dev_Bus',
1659
        'systemcd_ejb-api'                      => 'MASS_Dev_Bus/CBP',
1660
        'boi'                                   => 'MASS_Dev_Bus/BOI',
1661
 
1662
        'mrviewer'                              => 'MASS_Dev_Infra/Reports',
1663
        'cdss'                                  => 'MASS_Dev_Infra/Cdss',
1664
        'InfraPSS'                              => 'MASS_Dev_Infra',
2764 dpurdie 1665
 
1666
 
1667
        'vsdev-proftpd-insecure'                => 'SmartSite',
1668
        'obe'                                   => 'ITSO_TRACS/obe',
1669
        'obme'                                  => 'ITSO_TRACS/obe',
1670
        'linuxaudio'                            => 'LinuxDevices/libraries',
1671
 
1672
 
1673
        #
1674
        #   Packages from the LMOS Vob
1675
        #   Too many rules - just hard code the lot of them
1676
        #
1677
        'rolff'                                 => 'DPG_SWBase/Dugite',
1678
        'ftplinux'                              => 'UNKNOWN',
1679
 
1680
        'linux-app-framework'              => 'DPG_SWBase/linux-app-framework',
1681
        'linux-app-upgrade'                => 'DPG_SWBase/linux-app-framework',
1682
        'linux-app-example'                => 'DPG_SWBase/linux-app-framework',
1683
        'linux-app-transfer'               => 'DPG_SWBase/linux-app-framework',
1684
 
1685
        'demo_cp6000'                      => 'LinuxDevices/apps',
1686
        'ivaldemo'                         => 'LinuxDevices/apps',
1687
        'linux-cotral-example'             => 'LinuxDevices/apps',
1688
        'lmos_utest'                       => 'LinuxDevices/apps',
1689
        'ublox-agps-example'               => 'LinuxDevices/apps',
1690
        'fdt-ads5121'                      => 'LinuxDevices/bootstrap',
1691
        'fdt-viper'                        => 'LinuxDevices/bootstrap',
1692
        'linux-grub'                       => 'LinuxDevices/bootstrap',
1693
        'romboot'                          => 'LinuxDevices/bootstrap',
1694
        'u-boot'                           => 'LinuxDevices/bootstrap',
1695
        'u-boot-cobra'                     => 'LinuxDevices/bootstrap',
1696
        'u-boot-hk'                        => 'LinuxDevices/bootstrap',
1697
        'u-boot_viper'                     => 'LinuxDevices/bootstrap',
1698
        'uboot-cobra-tools'                => 'LinuxDevices/bootstrap',
1699
        'uboot-viper-tools'                => 'LinuxDevices/bootstrap',
1700
        'viper-platform-setup'             => 'LinuxDevices/bootstrap',
1701
        'coalesce'                         => 'LinuxDevices/dams',
1702
        'dams_eb5600'                      => 'LinuxDevices/dams',
1703
        'dams_ival'                        => 'LinuxDevices/dams',
1704
        'dams_pcp5700'                     => 'LinuxDevices/dams',
1705
        'dams_tp5600'                      => 'LinuxDevices/dams',
1706
        'demo_msp_lnx_viper'               => 'LinuxDevices/devkit',
1707
        'devkit-tool'                      => 'LinuxDevices/devkit',
1708
        'idp_lnx_viper'                    => 'LinuxDevices/devkit',
1709
        'ival-devkit'                      => 'LinuxDevices/devkit',
1710
        'linux_infra_eb5600'               => 'LinuxDevices/devkit',
1711
        'linux_infra_tp5600'               => 'LinuxDevices/devkit',
1712
        'drivers_api_viper'                => 'LinuxDevices/drivers',
1713
        'gprsmodem-firmware'               => 'LinuxDevices/drivers',
1714
        'linux_driver_csc_cobra'           => 'LinuxDevices/drivers',
1715
        'linux_driver_csc_viper'           => 'LinuxDevices/drivers',
1716
        'linux_driver_ip_over_rs485'       => 'LinuxDevices/drivers',
1717
        'linux_drivers_api'                => 'LinuxDevices/drivers',
1718
        'linux_drivers_cobra'              => 'LinuxDevices/drivers',
1719
        'linux_drivers_eb5600'             => 'LinuxDevices/drivers',
1720
        'linux_drivers_etx86'              => 'LinuxDevices/drivers',
1721
        'linux_drivers_serpent-api'        => 'LinuxDevices/drivers',
1722
        'linux_drivers_tp5600'             => 'LinuxDevices/drivers',
1723
        'linux_drivers_viper'              => 'LinuxDevices/drivers',
1724
        'svgalib'                          => 'LinuxDevices/drivers',
1725
        'usb_gadget_host'                  => 'LinuxDevices/drivers',
1726
        'viper-pic-firmware'               => 'LinuxDevices/drivers',
1727
        'viper-tipsoc-firmware'            => 'LinuxDevices/drivers',
1728
        'viper_csc'                        => 'LinuxDevices/drivers',
1729
        'busybox_cobra'                    => 'LinuxDevices/filesystems',
1730
        'cobra_day0fs_base'                => 'LinuxDevices/filesystems',
1731
        'day0-cotral'                      => 'LinuxDevices/filesystems',
1732
        'e2fsimage'                        => 'LinuxDevices/filesystems',
1733
        'e2fsprogs'                        => 'LinuxDevices/filesystems',
1734
        'ERGDay0UpgradeServer'             => 'LinuxDevices/filesystems',
1735
        'linux_day0fs_base'                => 'LinuxDevices/filesystems',
1736
        'linux_day0fs_cobra'               => 'LinuxDevices/filesystems',
1737
        'linux_day0fs_cp6100_sl6087_fwup'  => 'LinuxDevices/filesystems',
1738
        'linux_day0fs_eb5600'              => 'LinuxDevices/filesystems',
1739
        'linux_day0fs_etx86'               => 'LinuxDevices/filesystems',
1740
        'linux_day0fs_tp5600'              => 'LinuxDevices/filesystems',
1741
        'linux_day0fs_viper'               => 'LinuxDevices/filesystems',
1742
        'linux_day0fs_viper_demo'          => 'LinuxDevices/filesystems',
1743
        'linux_day0fs_viper_dev'           => 'LinuxDevices/filesystems',
1744
        'ERGviper-kernel'                  => 'LinuxDevices/kernel',
1745
        'linux_kernel_bcp4600'             => 'LinuxDevices/kernel',
1746
        'linux_kernel_cobra'               => 'LinuxDevices/kernel',
1747
        'linux_kernel_eb5600'              => 'LinuxDevices/kernel',
1748
        'linux_kernel_etx86'               => 'LinuxDevices/kernel',
1749
        'linux_kernel_tp5600'              => 'LinuxDevices/kernel',
1750
        'linux_kernel_viper'               => 'LinuxDevices/kernel',
1751
        'libviper-mtp'                     => 'LinuxDevices/libraries',
1752
        'libviper-sam'                     => 'LinuxDevices/libraries',
1753
        'libviper-util'                    => 'LinuxDevices/libraries',
1754
        'setMAC'                           => 'LinuxDevices/libraries',
1755
        'support_serpent'                  => 'LinuxDevices/libraries',
1756
        'support_serpent-api'              => 'LinuxDevices/libraries',
1757
        'support_serpent-so'               => 'LinuxDevices/libraries',
1758
        'viper_setmac'                     => 'LinuxDevices/libraries',
1759
        'libviper-mcr'                     => 'LinuxDevices/mcr',
1760
        'linux-mcrfirmware'                => 'LinuxDevices/mcr',
1761
        'mcr400-firmware'                  => 'LinuxDevices/mcr',
1762
        'mcr400_emulator'                  => 'LinuxDevices/mcr',
1763
        'mcrdemo'                          => 'LinuxDevices/mcr',
1764
        'alsa'                             => 'LinuxDevices/opensource',
1765
        'can-utils'                        => 'LinuxDevices/opensource',
1766
        'canbus-j1708-monitor'             => 'LinuxDevices/opensource',
1767
        'dfbtool'                          => 'LinuxDevices/opensource',
1768
        'directfb'                         => 'LinuxDevices/opensource',
1769
        'expat-linux'                      => 'LinuxDevices/opensource',
1770
        'freetype'                         => 'LinuxDevices/opensource',
1771
        'gpsd'                             => 'LinuxDevices/opensource',
1772
        'iniparser'                        => 'LinuxDevices/opensource',
1773
        'iptables'                         => 'LinuxDevices/opensource',
1774
        'irda-utils'                       => 'LinuxDevices/opensource',
1775
        'libftdi'                          => 'LinuxDevices/opensource',
1776
        'libid3tag'                        => 'LinuxDevices/opensource',
1777
        'libjpeg'                          => 'LinuxDevices/opensource',
1778
        'libmad'                           => 'LinuxDevices/opensource',
1779
        'libmodbus'                        => 'LinuxDevices/opensource',
1780
        'libmysql'                         => 'LinuxDevices/opensource',
1781
        'linux-glibc'                      => 'LinuxDevices/opensource',
1782
        'linux-glibc-dbg'                  => 'LinuxDevices/opensource',
1783
        'lrzsz'                            => 'LinuxDevices/opensource',
1784
        'madplay'                          => 'LinuxDevices/opensource',
1785
        'mkimage'                          => 'LinuxDevices/opensource',
1786
        'mtd-utils'                        => 'LinuxDevices/opensource',
1787
        'ncurses'                          => 'LinuxDevices/opensource',
1788
        'openntpd'                         => 'LinuxDevices/opensource',
1789
        'oprofile'                         => 'LinuxDevices/opensource',
1790
        'oprofile-dev'                     => 'LinuxDevices/opensource',
1791
        'pmctst'                           => 'LinuxDevices/opensource',
1792
        'popt'                             => 'LinuxDevices/opensource',
1793
        'ppp'                              => 'LinuxDevices/opensource',
1794
        'rsync'                            => 'LinuxDevices/opensource',
1795
        'smcroute'                         => 'LinuxDevices/opensource',
1796
        'sshpass'                          => 'LinuxDevices/opensource',
1797
        'strace'                           => 'LinuxDevices/opensource',
1798
        'tcpdump'                          => 'LinuxDevices/opensource',
1799
        'tslib'                            => 'LinuxDevices/opensource',
1800
        'AT91load'                         => 'LinuxDevices/programingUtils',
1801
        'CobraLoad'                        => 'LinuxDevices/programingUtils',
1802
        'ERGAT91load_bcp4600'              => 'LinuxDevices/programingUtils',
1803
        'ERGAT91load_eb5600'               => 'LinuxDevices/programingUtils',
1804
        'ERGAT91load_tp5600'               => 'LinuxDevices/programingUtils',
1805
        'flash_copier_eb5600'              => 'LinuxDevices/programingUtils',
1806
        'flash_copier_pcp5700'             => 'LinuxDevices/programingUtils',
1807
        'flash_copier_tp5600'              => 'LinuxDevices/programingUtils',
1808
        'SDCardCopy'                       => 'LinuxDevices/programingUtils',
1809
        'ViperLoad'                        => 'LinuxDevices/programingUtils',
1810
        'arm-926ejs-linux-gnueabi'         => 'LinuxDevices/toolchain',
1811
        'binutils'                         => 'LinuxDevices/toolchain',
1812
        'crosstool-ng'                     => 'LinuxDevices/toolchain',
1813
        'gdb'                              => 'LinuxDevices/toolchain',
1814
        'imageviewer'                      => 'LinuxDevices/utilities',
1815
        'imgput'                           => 'LinuxDevices/utilities',
1816
        'thrash'                           => 'LinuxDevices/utilities',
1817
        'webviewer'                        => 'LinuxDevices/utilities',
1818
        'haserl'                           => 'LinuxDevices/webserver',
1819
        'lua'                              => 'LinuxDevices/webserver',
1820
        'thttpd'                           => 'LinuxDevices/webserver',
1821
        'compat-wireless'                  => 'LinuxDevices/wireless',
1822
        'hostapd-experimental'             => 'LinuxDevices/wireless',
1823
        'rt2571'                           => 'LinuxDevices/wireless',
1824
        'rt2870-firmware'                  => 'LinuxDevices/wireless',
1825
        'rt3070'                           => 'LinuxDevices/wireless',
1826
        'wireless_tools'                   => 'LinuxDevices/wireless',
1827
        'wpa-supplicant'                   => 'LinuxDevices/wireless',
1828
        'zd1211-firmware'                  => 'LinuxDevices/wireless',
1829
 
2931 dpurdie 1830
        # Plan to move these (and a few others too)
1831
        'dropbear'                         => 'LinuxDevices/opensource',
2764 dpurdie 1832
        'debian_dpkg'                      => 'LinuxDevices/opensource',
1833
        'openobex'                         => 'LinuxDevices/opensource',
1834
        'dtc'                              => 'LinuxDevices/opensource',
3045 dpurdie 1835
        'linux_gnu_tools'                  => 'LinuxDevices/toolchain',
2931 dpurdie 1836
            'watchdog'                         => 'LinuxDevices/opensource',
1837
            'zlib_linux'                       => 'LinuxDevices/opensource',
1838
            'sktcat'                           => 'LinuxDevices/opensource',
1839
            'mono'                             => 'LinuxDevices/opensource',
1840
            'libpng'                           => 'LinuxDevices/opensource',
2764 dpurdie 1841
 
2931 dpurdie 1842
        'viper-support'                    => 'LinuxDevices/libraries',
1843
        'linux_types'                      => 'LinuxDevices/libraries',
1844
 
1845
        'busybox'                          => 'LinuxDevices/filesystems',
1846
        'day0-upgrade'                     => 'LinuxDevices/filesystems',
392 dpurdie 1847
    );
1848
 
1849
    my %VobRename = (
2764 dpurdie 1850
        'LMOS'                      => 'LinuxDevices',
1851
        'MANUFACTURING'             => 'Manufacturing',
1852
        'MREF_Package'              => 'MREF_Package',
1853
        'MASS_Dev'                  => 'MASS_Dev_Bus',
2931 dpurdie 1854
        's4k_tracs'                 => 'ITSO_TRACS',
2764 dpurdie 1855
        'MASS_Dev_Tools'            => 'DevTools',
1197 dpurdie 1856
 
2764 dpurdie 1857
        'GMPTE2005'                 => 'ITSO_TRACS',
1858
        'GMPTE2005_obe'             => 'ITSO_TRACS/obe/dummyDir',
1859
        'UK_ITSO_COMPLIANT'         => 'ITSO_TRACS',
2429 dpurdie 1860
 
1861
        'MASS_Dev_Infra/security'   => 'MASS_Dev_Infra/Security',
1862
        'MASS_Dev_Infra/web'        => 'MASS_Dev_Infra/Web',
1863
        'MASS_Dev_Infra/cdss'       => 'MASS_Dev_Infra/Cdss',
2764 dpurdie 1864
 
1865
        'TRACS/faresets'            => 'ITSO_TRACS/faresets',
1866
        'ProjectCD'                 => 'DPG_SWCode/ProjectCD',
1867
 
392 dpurdie 1868
    );
1869
 
2429 dpurdie 1870
    my %PreferredPath = (
1871
        'MASS_Dev_Bus/Reports'      => 1,
1872
        'MASS_Dev_Bus/CBP'          => 1,
1873
        'MASS_Dev_Bus/Business'     => 1,
2764 dpurdie 1874
        'MASS_Dev_Bus/CIPP'         => 1,
2429 dpurdie 1875
 
1876
        'MASS_Dev_Infra/ProjectSpecific' => 1,
1877
    );
1878
 
392 dpurdie 1879
    # default is 1
1880
    my %VobDepth = (
1881
        'DPG_SWBase'                => 2,
1197 dpurdie 1882
        'ITSO_TRACS'                => 2,
1451 dpurdie 1883
        'ITSO_TRACS/Packages'       => 1,
392 dpurdie 1884
        'MASS_Dev_Bus'              => 2,
1885
        'MASS_Dev_Infra'            => 2,
1886
        'MPR'                       => 2,
2764 dpurdie 1887
        'DPG_SWCode/ProjectCD'      => 3,
392 dpurdie 1888
        'TRACS'                     => 2,
1889
        'VIX-PAYMENTS'              => 2,
1890
        'WINCE500'                  => 2,
1891
        'DAMS_mos_diag'             => 2,
1892
        'MASS_Dev_Bus/Financial'    => 3,
2764 dpurdie 1893
        'SmartSite'                 => 2,
392 dpurdie 1894
    );
1895
 
1896
    return ('SVN') if ( $PackageData{$pkgid}{isSVN} );
1897
    my $name = $PackageData{$pkgid}{name};
1898
 
1899
    # If only one VOB
1900
    #
1901
    my $path = '';
1902
    unless ( $PackageData{$pkgid}{BadVob} || $PackageData{$pkgid}{MultiVob} )
1903
    {
1197 dpurdie 1904
        my @paths = reverse sort keys %{$PackageData{$pkgid}{vobPath}};
392 dpurdie 1905
        $path = $paths[0] if exists $paths[0];
1906
    }
1907
 
1908
    #
1909
    #   Some path cleanup
1910
    #
1911
    if ( $path )
1912
    {
2429 dpurdie 1913
        $path =~ s~\s+~~i;
1914
        $path =~ s~/build.pl$~~i;
1915
        $path =~ s~/src$~~i;
395 dpurdie 1916
        $path =~ s~DPC_SWCode/~DPG_SWCode/~i;
392 dpurdie 1917
        $path =~ s~MASS_Dev/Bus/~MASS_Dev_Bus/~i;
1918
        $path =~ s~MASS_Dev_Bus/Cbp/~MASS_Dev_Bus/CBP/~i;
2429 dpurdie 1919
        $path =~ s~MASS_Dev_Bus/WebServices~MASS_Dev_Bus/WebServices~i;
392 dpurdie 1920
        $path =~ s~/Vastraffik/~/Vasttrafik/~;
1921
        $path =~ s~/MREF_Package/ergpostmongui$~/MREF_Package/ergpostmongui~i;
1922
    }
1923
 
1924
    #
1925
    #   Brute force VOB renaming
1926
    #
1927
    foreach my $name ( keys %VobRename  )
1928
    {
1929
        my $newName = $VobRename{$name};
1930
        $path =~ s~^/$name/~/$newName/~i;
1197 dpurdie 1931
        $path =~ s~^/$name$~/$newName~i;
392 dpurdie 1932
    }
1933
 
2764 dpurdie 1934
    $PackageData{$pkgid}{mappingPath} = $path;
1935
 
395 dpurdie 1936
    return $Named{$name}  if ( exists $Named{$name} );
1937
 
1938
    return 'DevTools/ant'  if ( $name =~ m~^ant~ );
1939
    return 'DevTools/ant'  if ( $name =~ m~^jant~ );
1940
 
1941
    return 'MASS_Dev_Dataman' if ( $name =~ m~^dm_~ );
1942
 
1943
    return 'MPR/EMV/emvl2' if ( $name =~ m~^cp[sf]-~ );
1944
 
1945
    return 'COTS' if ( $PackageData{$pkgid}{type} eq 'COTS' && ! exists $PackageData{$pkgid}{vobs}{'LMOS'});
1946
 
1947
    #
1948
    #   Must resolve Multivobs
1949
    #
1950
    if ( $PackageData{$pkgid}{MultiVob} )
1951
    {
1952
        $path = resolveMultiVob($name, $pkgid );
1953
    }
1954
 
392 dpurdie 1955
    my $vob = '';
1956
    my @pathBase;
1957
    my @pathFull;
1958
    $path =~ s~/$~~g;
1959
    $path =~ s~^/~~g;
1960
    @pathFull = split( '/', $path);
1961
    $vob = $pathFull[0] || $path;
1962
    push @pathFull, $vob unless ( @pathFull );
1963
 
1964
    @pathBase = @pathFull;
1965
    delete $pathBase[-1];
1966
    push @pathBase, $vob unless ( @pathBase );
1967
 
1968
#print "Full: @pathFull\n";
1969
#print "Base: @pathBase\n";
1970
 
2764 dpurdie 1971
    if ( $vob eq 'LinuxDevices' )
1972
    {
1973
        return 'UNKNOWN';
1974
    }
1975
 
1976
 
395 dpurdie 1977
    return 'MOS/images'  if (($vob eq 'COTS' || $vob eq 'MOS') &&  $name =~ m~^mos_~ && $name =~ m~\d\d\d\d~);
392 dpurdie 1978
 
1979
    return 'COTS' if ( $vob =~ m~^COTS_~ );
1980
    return 'COTS' if ( $vob eq 'COTS' );
1981
 
1982
    return 'DPG_SWBase/Demos'  if ($vob eq 'DPG_SWBase' &&  $name =~ m~^demo_~ );
1983
    return 'DPG_SWBase/Demos'  if ( $name =~ m~^qt_demo~ );
1984
 
1985
    return 'DPG_SWBase/daf_utils'  if ( $name =~ m~^time_ce~ );
1986
    return 'DPG_SWBase/daf_utils'  if ( $name =~ m~^daf_utils~ );
1987
    return 'DPG_SWBase/daf_utils'  if ( $name =~ m~^daf_bertlv~ );
1988
    return 'DPG_SWBase'            if ( $name =~ m~^daf_br_compiler~ );
1989
    return 'DPG_SWBase'            if ( $name =~ m~^hcp5000icons$~ );
1990
 
1991
    return 'DPG_SWBase/daf_components'  if ( $vob eq 'DPG_SWBase' && $name =~ m~^daf_component_~ );
1992
    return 'DPG_SWBase/daf_transap'  if ( $path =~ m~/transap$~ || $path =~ m~/transap/~ );
1993
#   return 'DPG_SWBase/daf'  if ( $vob eq 'DPG_SWBase' && $name =~ m~^daf_~ );
1994
    return 'DPG_SWBase/IDC'  if ( $vob =~ m~DPG_SW~ && $name =~ m~^IDC~ );
1995
 
1996
    return 'DPG_SWCode/dac'  if ( $name =~ m~^dac_~ );
1997
    return 'DPG_SWCode/ddu'  if ( $name =~ m~^ddu_~ );
1998
    return 'DPG_SWCode/utilities'  if ( $vob eq 'DPG_SWCode' && $path =~ m/utilities/ );
1999
 
2000
    if ( $name =~ m~^VIX~ || $name =~ m~^ERG~ )
2001
    {
2002
        return 'MREF_Package'
395 dpurdie 2003
            if ( $vob =~ m~^CORE~ || $vob =~ m~^MASS~ || $vob =~ m~^MREF~ );
392 dpurdie 2004
    }
2005
 
2006
#    if ( $vob ne 'MREF_Package' )
2007
#    {
2008
#print "---- $name, $path\n" if ( $name =~ m~^VIX~ );
2009
#print "---- $name, $path\n" if ( $name =~ m~^ERG~ );
2010
#    }
2011
 
2012
    #
2013
    #   ProjectCd is badly done
2014
    #   Many packages are in named directories, some are not.
2015
    #
2764 dpurdie 2016
    if ( defined $pathFull[1] && $pathFull[1] eq 'ProjectCD' )
392 dpurdie 2017
    {
2764 dpurdie 2018
        push @pathBase, $pathFull[2] if ( defined $pathFull[2]  );
392 dpurdie 2019
    }
2020
 
395 dpurdie 2021
    #
2022
    #   Detect core_xxx packages
2023
    #
2024
    if ( $vob eq 'MASS_Dev_Infra' && $path =~ m~/core_~ )
2025
    {
2026
        return "$vob/Core";
2027
    }
2028
 
392 dpurdie 2029
    return "UNKNOWN"
2030
        unless ( $vob );
2031
 
2032
    #
2429 dpurdie 2033
    #   Can we map the package into a preferred path
2034
    #
2035
    foreach my $ppath ( sort keys %PreferredPath )
2036
    {
2037
        if ( $path =~ m~${ppath}(/|$)~i )
2038
        {
2039
#print "---- Preferred path: $name, $ppath\n";
2040
            return $ppath;
2041
        }
2042
 
2043
        #
2044
        #   Try a little harder
2045
        #
2046
        foreach my $tpath  ( keys %{$PackageData{$pkgid}{vobPath}} )
2047
        {
2048
            if ( $tpath =~ m~${ppath}(/|$)~i )
2049
            {
2050
#print "---- Preferred path: $name, $ppath\n";
2051
                return $ppath;
2052
            }
2053
        }
2054
    }
2055
 
2056
    #
2764 dpurdie 2057
    #   Last resort
392 dpurdie 2058
    #   Determine depth for this path
2059
    #
2060
    my $depth = 1;
2061
    foreach ( reverse sort keys %VobDepth)
2062
    {
2063
        if ( $path =~ m~^$_~ )
2064
        {
2065
            $depth = $VobDepth{$_};
2066
            last;
2067
        }
2068
    }
2429 dpurdie 2069
 
392 dpurdie 2070
#print "--Joining: $name, $depth, @pathBase\n";
2071
    return pathJoin($depth, $path, $name, @pathBase);
2072
}
2073
 
2074
sub pathJoin
2075
{
2076
    my ($num, $path, $name, @data) = @_;
2077
    my $val = '';
2078
    my $char = '';
2079
    for( my $ii = 0; $ii < $num; $ii++)
2080
    {
2081
        last unless ( defined $data[$ii] );
2082
        $val = $val . $char . $data[$ii];
2083
        $char = '/'
2084
    }
2085
#print "----$path, $name: $num, @data --> $val\n";
2086
    return $val;
2087
}
2088
 
395 dpurdie 2089
 
392 dpurdie 2090
#-------------------------------------------------------------------------------
395 dpurdie 2091
# Function        : resolveMultiVob
2092
#
2093
# Description     : Time to resolve multivob issues
2094
#
2095
# Inputs          : $name           - Package Name
2096
#                   $pkgid          - Package ID
2097
#
2098
#
2099
# Returns         : Resulved path
2100
#
2101
sub resolveMultiVob
2102
{
2103
    my ($name, $pkgid) = @_;
2104
    my $path = '';
2105
 
2106
my %preferredVob = (
2107
        'uiconv'        => 'DPG_SWBase',
2108
        'gnupg'         => 'COTS',
2109
    );
2110
 
2111
 
2112
    my $pvob = $preferredVob{$name};
2113
    unless ( defined $pvob )
2114
    {
2115
        if ( exists ($PackageData{$pkgid}{vobs}{MASS_Dataman}) && exists ($PackageData{$pkgid}{vobs}{MASS_Dev_Dataman})  )
2116
        {
2117
            $pvob = 'MASS_Dev_Dataman';
2118
        }
2119
 
2120
        if ( exists ($PackageData{$pkgid}{vobs}{DPG_SWBase}) && exists ($PackageData{$pkgid}{vobs}{DPG_SWCode})  )
2121
        {
2122
            $pvob = 'DPG_SWCode';
2123
        }
2124
 
2125
        if ( exists ($PackageData{$pkgid}{vobs}{MREF_Package}) )
2126
        {
2127
            $pvob = 'MREF_Package';
2128
        }
2129
 
2130
        if ( exists ($PackageData{$pkgid}{vobs}{MASS_Dev}) && exists ($PackageData{$pkgid}{vobs}{MASS_Dev_Bus}))
2131
        {
2132
            $pvob = 'MASS_Dev_Bus';
2133
        }
2134
 
2135
        if ( exists ($PackageData{$pkgid}{vobs}{s4k_obe}) && exists ($PackageData{$pkgid}{vobs}{GMPTE2005}))
2136
        {
2137
            $pvob = 'GMPTE2005';
2138
        }
2139
 
2140
        if ( exists ($PackageData{$pkgid}{vobs}{s4k_obe}) && exists ($PackageData{$pkgid}{vobs}{GMPTE2005_obe}))
2141
        {
2142
            $pvob = 'GMPTE2005_obe';
2143
        }
2144
 
2145
        if ( exists ($PackageData{$pkgid}{vobs}{TRACS}) && exists ($PackageData{$pkgid}{vobs}{GMPTE2005}))
2146
        {
2147
            $pvob = 'GMPTE2005';
2148
        }
2149
 
2150
        if ( exists ($PackageData{$pkgid}{vobs}{MASS_Dev_Infra}) && exists ($PackageData{$pkgid}{vobs}{MASS_Dev_Tools}))
2151
        {
2152
            $pvob = 'MASS_Dev_Infra';
2153
        }
2154
 
2155
        if ( exists ($PackageData{$pkgid}{vobs}{COTS}) && exists ($PackageData{$pkgid}{vobs}{MOS}))
2156
        {
2157
            $pvob = 'MOS';
2158
        }
2159
 
2160
        if ( exists ($PackageData{$pkgid}{vobs}{COTS}) && exists ($PackageData{$pkgid}{vobs}{MPR}))
2161
        {
2162
            $pvob = 'MPR';
2163
        }
2164
 
2165
        if ( exists ($PackageData{$pkgid}{vobs}{COTS}) && exists ($PackageData{$pkgid}{vobs}{COTS_Java}))
2166
        {
2167
            $pvob = 'COTS';
2168
        }
2169
    }
2170
 
2171
    if ( defined $pvob )
2172
    {
2173
        if ( exists $PackageData{$pkgid}{vobResolver}{$pvob} )
2174
        {
2175
            $path = $PackageData{$pkgid}{vobResolver}{$pvob} ;
2176
        }
2177
    }
2178
    else
2179
    {
2180
        Message ("Unresolved multivob: $PackageData{$pkgid}{name}");
2181
#DebugDumpData("DATA", \$PackageData{$pkgid} );
2182
#exit 1;
2183
    $path = 'UNKNOWN';
2184
    }
2185
 
2186
    return $path;
2187
}
2188
 
2189
 
2190
#-------------------------------------------------------------------------------
392 dpurdie 2191
# Function        : examineVcsTag
2192
#
2193
# Description     : Examine a VCS Tag and determine if it looks like rubbish
2194
#
2195
# Inputs          : Tag to examine
2196
#
2197
# Returns         : Badness
2198
#
2199
sub examineVcsTag
2200
{
2201
    my ($vcstag) = @_;
2202
    my $bad = 0;
2203
    if ( $vcstag =~ m~^CC::(.*?)(::(.+))?$~ )
2204
    {
2205
        my $path = $1  || '';
2206
        my $label = $2 || '';
2207
#print "$vcstag, $bad, $path, $label\n";
2208
        $bad = 1 unless ( $label );
2209
        $bad = 1 if ( $label =~ m~^N/A$~i || $label  =~ m~^na$~i );
2210
 
2211
        $bad = 1 unless ( $path );
2212
        $bad = 1 if ( $path =~ m~^N/A$~i || $path  =~ m~^na$~i );
2764 dpurdie 2213
        $bad = 1 if ( $path =~ m~^/dpkg_archive~ || $path  =~ m~^dpkg_archive~ );
2214
        $bad = 1 if ( $path =~ m~^/devl/~ || $path  =~ m~^devl/~ );
395 dpurdie 2215
        $bad = 1 if ( $path =~ m~^CVS~ );
392 dpurdie 2216
        $bad = 1 if ( $path =~ m~^http:~i );
2217
        $bad = 1 if ( $path =~ m~^[A-Za-z]\:~ );
2218
        $bad = 1 if ( $path =~ m~^//~ );
2219
        $bad = 1 if ( $path =~ m~^/blade1/~ );
2220
        $bad = 1 if ( $path =~ m~^/devl/~ );
394 dpurdie 2221
        $bad = 1 if ( $path =~ m~^/*none~i );
2222
        $bad = 1 if ( $path =~ m~^/*NoWhere~i );
2223
        $bad = 1 if ( $path =~ m~^-$~i );
2764 dpurdie 2224
        $bad = 1 if ( $path =~ m~^cvsserver:~ );
2225
        $bad = 1 if ( $path =~ m~,\s*module:~ );
392 dpurdie 2226
        $bad = 1 if ( $path =~ m~[()]~ );
2227
#        $bad = 1 unless ( $path =~ m~^/~ );
2228
    }
2229
    else
2230
    {
2231
        $bad = 1;
2232
    }
2233
    return $bad;
2234
}
2235
 
2236
#-------------------------------------------------------------------------------
2237
# Function        : usedBy
2238
#
2239
# Description     : Given a pvid, determine which release(s) need it
2240
#
2241
# Inputs          : $pvid
2242
#
2243
# Returns         : Nothing
2244
#
2245
sub usedBy
2246
{
2247
    my ($pvid) = @_;
2248
    Error ("PVID is not an essential package") unless ( exists $ScmPackages{$pvid} );
2249
 
2250
    my @releases = @{$ScmPackages{$pvid}{'release'}} if exists($ScmPackages{$pvid}{'release'});
2251
    my @users = @{$ScmPackages{$pvid}{'usedBy'}} if exists($ScmPackages{$pvid}{'usedBy'});
2252
 
2253
    while ( @users )
2254
    {
2255
        my $pv = pop @users;
2256
        push @releases, @{$ScmPackages{$pv}{'release'}} if (exists $ScmPackages{$pv}{'release'});
2257
        push @users, @{$ScmPackages{$pv}{'usedBy'}} if (exists($ScmPackages{$pv}{'usedBy'}));
2258
    }
2259
 
2260
    my %releases;
2261
    my %ireleases;
2262
    my @dreleases = ();
2263
    my @ireleases;
2264
    foreach ( @releases )
2265
    {
2266
        if ( $ScmPackages{$pvid}{tlp}  )
2267
        {
2268
            next if ( exists $releases{$_} );
2269
            push @dreleases, $_;
2270
            $releases{$_} = 1;
2271
        }
2272
        else
2273
        {
2274
            next if ( exists $ireleases{$_} );
2275
            push @ireleases, $_;
2276
            $ireleases{$_} = 1;
2277
        }
2278
    }
2279
    return \@dreleases, \@ireleases;
2280
}
2281
 
2282
#-------------------------------------------------------------------------------
2283
# Function        : smartPackageType
2284
#
2285
# Description     : Have a look at the projects in the package set and
2286
#                   attempt to determine what sort of mechanism to use
2287
#
2288
# Inputs          : pkgid            - Package ID
2289
#
2290
# Returns         : Type, Array of suffixes
2291
#
2292
sub smartPackageType
2293
{
2294
    my ($pkgid) = @_;
2295
    my %suffixes;
2296
 
2297
    #
2298
    #   Suffixes for all packages
2299
    #
2300
    foreach  ( @{$PackageSet{$pkgid}} )
2301
    {
2302
        my $suffix = $ScmPackages{$_}{'suffix'};
2303
        $suffixes{$suffix}++;
2304
    }
2305
 
2306
    my $packageType = 'UNKNOWN';
2307
 
2308
    if ( exists $suffixes{'.cots'} ) {
2309
        $packageType = 'COTS';
2310
 
2311
    } elsif ( exists $suffixes{'.tool'} ) {
2312
        $packageType = 'TOOL';
2313
 
2314
    } elsif ( scalar (keys %suffixes ) == 1 ) {
2315
        $packageType = 'SINGLE_PROJECT';
2316
 
2317
    } else {
2318
        $packageType = 'MULTIPLE_PROJECT';
2319
    }
2320
 
2321
    return $packageType, keys %suffixes;
2322
}
2323
 
394 dpurdie 2324
 
392 dpurdie 2325
#-------------------------------------------------------------------------------
394 dpurdie 2326
# Function        : vcsCleanup
2327
#
2328
# Description     : Cleanup and rewrite a vcstag
2329
#
2330
#                   DUPLICATED IN:
2331
#                       - cc2svn_procdata
2429 dpurdie 2332
#                       - cc2svn_importpackage
394 dpurdie 2333
#
2334
# Inputs          : vcstag
2335
#
2336
# Returns         : Cleaned up vcs tag
2337
#
2338
sub vcsCleanup
2339
{
2340
    my ($tag) = @_;
2764 dpurdie 2341
    $tag =~ tr~\\/~/~;                              # Force use of /
2342
    $tag =~ s~/+$~~;                                # Trailing /
394 dpurdie 2343
    if ( $tag =~ m~^CC::~ )
2344
    {
2764 dpurdie 2345
        $tag =~ s~CC::/VOB:/~CC::/~;                # Kill stuff
2429 dpurdie 2346
        $tag =~ s~CC::load\s+~CC::~;                # Load rule
2347
        $tag =~ s~CC::\s+~CC::~;                    # Leading white space
2348
        $tag =~ s~CC::[A-Za-z]\:/~CC::/~;           # Leading driver letter
2349
        $tag =~ s~CC::/+~CC::/~;                    # Multiple initial /'s
2350
        $tag =~ s~/build.pl::~::~i;
2351
        $tag =~ s~/src::~::~i;
394 dpurdie 2352
        $tag =~ s~MASS_Dev_Bus/Cbp/~MASS_Dev_Bus/CBP/~i;
2353
        $tag =~ s~MASS_Dev_Bus~MASS_Dev_Bus~i;
2354
        $tag =~ s~/MASS_Dev/Infra~MASS_Dev_Infra~i;
2355
        $tag =~ s~/MASS_Dev/Bus/web~/MASS_Dev_Bus/web~i;
2356
 
2357
        $tag =~ s~/Vastraffik/~/Vasttrafik/~;
2358
        $tag =~ s~/MREF_Package/ergpostmongui$~/MREF_Package/ergpostmongui~i;
395 dpurdie 2359
        $tag =~ s~DPC_SWCode/~DPG_SWCode/~i;
394 dpurdie 2360
    }
2361
    return $tag;
2362
}
2363
 
2364
#-------------------------------------------------------------------------------
392 dpurdie 2365
# Function        : extractVob
2366
#
2367
# Description     : Extract the VOB for a package
2368
#
2369
# Inputs          : $entry              - pvid
2370
#
2371
# Returns         : Vob Name
2372
#
2373
sub extractVob
2374
{
2375
    my ($entry) = @_;
2376
 
394 dpurdie 2377
    $ScmPackages{$entry}{'vcstag'} = vcsCleanup($ScmPackages{$entry}{'vcstag'});
392 dpurdie 2378
 
2379
    my $tag = $ScmPackages{$entry}{vcstag};
2380
    my $package = $ScmPackages{$entry}{name};
2381
    if ( $tag =~ m~^SVN::~ )
2382
    {
2383
        $tag =~ m~SVN::(.*)(/tags/|/branches/|/trunk)~;
2384
        return 'SVN', $1;
2385
    }
2386
 
2387
    if ( $tag !~ m~^CC::~ || examineVcsTag ($tag)){
2388
        $ScmPackages{$entry}{BadVob} = 1;
2389
        return undef;
2390
    }
2391
 
2392
    $tag =~ m~^CC::(.*)::(.*)~;
2393
    my $path = '/' . $1;
2394
    $path =~ tr~\\/~/~s;
2395
    my @pelements = split( m'/+', $path);
2396
    my $vob = $pelements[1];
2397
    unless ( $vob )
2398
    {
2399
        $ScmPackages{$entry}{BadVob} = 1;
2400
        return undef;
2401
    }
2402
 
2403
    $ScmPackages{$entry}{VobName} = $vob;
2404
    $ScmPackages{$entry}{VobPath} = $path;
2405
    return $vob, $path;
2406
}
2407
 
2408
#-------------------------------------------------------------------------------
2409
# Function        : getBadLabelData
2410
#
2411
# Description     : Read in a previous log file and determine versions that
2412
#                   have already been examined
2413
#
2414
# Inputs          : 
2415
#
2416
# Returns         : 
2417
#
2418
sub getBadLabelData
2419
{
2420
    my $badFile = 'cc2svn_labeltest.bad.txt';
2421
    Message ("Reading Bad Label: $badFile");
2422
    open (my $fh, '<', $badFile ) || Error ("Cannot open $badFile");
2423
    while ( <$fh> )
2424
    {
2425
        #
2426
        #   Format of data is:
2427
        #       pvid, $name:, $tag, $rv
2428
        #
2429
        chomp;
2430
        next if ( m~^#~ );
2431
        my @data = split (/\s*,\s*/, $_);
2432
        next unless ( $data[0] );
2433
        $ScmPackages{$data[0]}{BadCCView} = 1 if exists ($ScmPackages{$data[0]});
2434
    }
2435
    close $fh;
2436
}
2437
 
2438
#-------------------------------------------------------------------------------
2450 dpurdie 2439
# Function        : getProtectedPackages
2440
#
2441
# Description     : Read in protected package data
2442
#
2443
# Inputs          : 
2444
#
2445
# Returns         : 
2446
#
2447
sub getProtectedPackages
2448
{
2449
    my $badFile = 'cc2svn_protected.txt';
2450
    Message ("Reading Protected Package: $badFile");
2451
    open (my $fh, '<', $badFile ) || Error ("Cannot open $badFile");
2764 dpurdie 2452
    my $section_comment;
2450 dpurdie 2453
    while ( <$fh> )
2454
    {
2455
        #
2456
        #   Format of data is:
2457
        #       packageName     - protected
2458
        #      -packageName     - Known Broken
2459
        #
2764 dpurdie 2460
        #   Line Comment is '#'
2461
        #   Package Comment is delimted by White space
2462
        #   Section Comment is [ comment ]
2463
        #
2450 dpurdie 2464
        s~\s+$~~;
2465
        s~^\s+~~;
2466
        next if ( m~^#~ );
2764 dpurdie 2467
        if ( m~^\s*\[\s*(.*?)\s*\]~ )
2468
        {
2469
            $section_comment = $1;
2470
            next;
2471
        }
2472
 
2450 dpurdie 2473
        $_ .= ' ';
2474
        my @data = split (/ /, $_, 2);
2475
        next unless ( $data[0] );
2476
        my $name = $data[0];
2764 dpurdie 2477
        my $comment = $data[1];
2478
        $comment =~ s~^\s+#~~;
2479
        $comment =~ s~^\s+~~;
2480
        $comment =~ s~\s+$~~;
2481
        $comment = $comment || $section_comment;
2450 dpurdie 2482
        my $mode = 'Protected';
2483
        if ( $name =~ m~^-(.*)~ )
2484
        {
2485
            $name = $1;
2486
            $mode = 'Broken'
2487
        }
2764 dpurdie 2488
        $Protected{$name}{mode} = $mode;
2489
        $Protected{$name}{comment} = $comment if ( $comment );
2450 dpurdie 2490
    }
2491
    close $fh;
2492
#    DebugDumpData('%Protected', \%Protected );
2493
}
2494
 
2495
#-------------------------------------------------------------------------------
392 dpurdie 2496
#   Documentation
2497
#
2498
 
2499
=pod
2500
 
2501
=for htmltoc    SYSUTIL::cc2svn::
2502
 
2503
=head1 NAME
2504
 
2505
cc2svn_procdata - Process CC2SVN Essential Package Data
2506
 
2507
=head1 SYNOPSIS
2508
 
2509
  jats cc2svn_procdata [options]
2510
 
2511
 Options:
2512
    -help              - brief help message
2513
    -help -help        - Detailed help message
2514
    -man               - Full documentation
2515
    -usedby=PVID       - Determine 'Releases' that use a specified PVID
2516
    -allpackages       - Generate data for ALL packages
2517
 
2518
=head1 OPTIONS
2519
 
2520
=over 8
2521
 
2522
=item B<-help>
2523
 
2524
Print a brief help message and exits.
2525
 
2526
=item B<-help -help>
2527
 
2528
Print a detailed help message with an explanation for each option.
2529
 
2530
=item B<-man>
2531
 
2532
Prints the manual page and exits.
2533
 
2534
=item B<-usedby=PVID>
2535
 
2536
This option will alter the operation of the program. It will display the
2537
releases that 'use' the specified PVID and then exit.
2538
 
2539
=back
2540
 
2541
=head1 DESCRIPTION
2542
 
2543
This program is a tool used in the conversion of ClearCase VOBS to subversion.
2544
 
2545
=over 8
2546
 
2547
=item *
2548
 
2549
It will process a datafile and generate infiormation used by other tools.
2550
 
2551
=item *
2552
 
2553
It will display suspect package versions.
2554
 
2555
=item *
2556
 
2557
It will generate an HTML file with a great deal of information about the
2558
packages in the conversion.
2559
 
2560
=item *
2561
 
2562
It can backtrack a PVID and report the Release or Releases that need the package
2563
version
2564
 
2565
=back
2566
 
2567
=cut
2568