Subversion Repositories DevTools

Rev

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

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