Subversion Repositories DevTools

Rev

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