Subversion Repositories DevTools

Rev

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

Rev Author Line No. Line
392 dpurdie 1
########################################################################
2
# Copyright ( C ) 2004 ERG Limited, All rights reserved
3
#
4
# Module name   : jats.sh
5
# Module type   : Makefile system
6
# Compiler(s)   : n/a
7
# Environment(s): jats
8
#
9
# Description   : Get package information
10
#                 for a package name and version as specified on the
11
#                 command line.
12
#
13
#                 Determine the package id
14
#                 Locate all packages that have the same package name
15
#                 Create a hash of previous versions
16
#                 Create a JPG showing the version history
17
#
18
#......................................................................#
19
 
20
require 5.006_001;
21
use strict;
22
use warnings;
23
use JatsError;
24
use JatsRmApi;
25
 
26
 
27
#use Data::Dumper;
28
use Cwd;
29
use DBI;
30
use Getopt::Long;
31
use Pod::Usage;                             # required for help support
32
my $RM_DB;
33
 
34
my $opt_repo = 'https://auperasvn01.aupera.erggroup.com/svn/DevTools';
35
my $vob_prefix = $ENV{'GBE_UNIX'} ? '/vobs' : '/vobs';
36
my $opt_package;
37
 
38
################################################################################
39
#   Global data
40
#
41
my $VERSION = "1.0.0";
42
my %ReleasePackages;            # Packages in the release
43
my %BuildPackages;              # Packages for this build
44
my $last_pv_id;
45
my $pkg_id;
46
my %versions;
47
 
48
 
49
#
50
#   Options
51
#
52
my $opt_help = 0;
53
my $opt_manual = 0;
54
my $opt_verbose = 0;
55
 
56
my $result = GetOptions (
57
                "help+"     => \$opt_help,          # flag, multiple use allowed
58
                "manual"    => \$opt_manual,        # flag
59
                "verbose+"  => \$opt_verbose,       # flag
60
                );
61
 
62
#
63
#   Process help and manual options
64
#
65
pod2usage(-verbose => 0, -message => "Version: $VERSION")  if ($opt_help == 1  || ! $result);
66
pod2usage(-verbose => 1)  if ($opt_help == 2 );
67
pod2usage(-verbose => 2)  if ($opt_manual || ($opt_help > 2));
68
 
69
#
70
#   Configure the error reporting process now that we have the user options
71
#
72
ErrorConfig( 'name'    =>'PLAY9c',
73
             'verbose' => $opt_verbose );
74
 
75
unless ( $ARGV[0] )
76
{
77
    Error( "Specify a package as 'name'" );
78
}
79
$opt_package = $ARGV[0];
80
Verbose( "Base Package: $opt_package");
81
 
82
#
83
#   Body of the process
84
#
85
GetPkgIdByName ( $opt_package );
86
GetData_by_pkg_id ( $pkg_id );
87
 
88
#
89
# Process the 'versions' hash and add back references
90
#
91
 
92
#
93
#   Find start
94
#   Entry with no previous
95
#
96
foreach my $entry ( keys(%versions) )
97
{
98
    foreach ( @{ $versions{$entry}{next}} )
99
    {
100
        $versions{$_}{last} = $entry;
101
    }
102
}
103
my @startPoints;
104
my $last_entry = 0;
105
foreach my $entry ( keys(%versions) )
106
{
107
    unless ( exists $versions{$entry}{last} )
108
    {
109
        push @startPoints, $entry;
110
    }
111
 
112
    if ( $entry > $last_entry )
113
    {
114
        $last_entry = $entry;
115
    }
116
}
117
 
118
#
119
#   Walk backwards from the LAST entry and mark the main path through the tree
120
#
121
my $entry = $last_entry;
122
while ( $entry )
123
{
124
    $versions{$entry}{'main'} = 1;
125
    $entry = $versions{$entry}{last};
126
}
127
 
128
DebugDumpData ("Versions", \%versions );
129
DebugDumpData ("Starts", \@startPoints );
130
 
131
foreach my $entry (sort {$a <=> $b} keys(%versions) )
132
{
133
    print GetVname($entry),"\n";
134
}
135
 
136
 
137
#
138
#   Walk the tree
139
#
140
foreach my $entry (sort {$a <=> $b} @startPoints )
141
{
142
    walkEntries( $entry );
143
}
144
 
145
#foreach my $entry ( sort {$a <=> $b} keys(%versions) )
146
#{
147
#    my @versions;
148
#    my $me = GetVname($entry);
149
#    my $next_count = 1+ $#{ $versions{$entry}{next}};
150
#    my $type = '';
151
#    if ( $next_count <= 0 ) {
152
#        $type = 'Terminal';
153
#    } elsif ( $next_count > 1 ) {
154
#        $type = 'Branch Point';
155
#    }
156
#
157
#    print "$entry, $me, $type\n";
158
#}
159
 
160
 
161
 
162
my $filebase = "$ARGV[0]_versions";
163
open (FH, ">$filebase.dot" ) or die "Cannot open output";
164
print FH "digraph world {\n";
165
#print FH "\trankdir=LR;\n";
166
print FH "\tnode[fontsize=24];\n";
167
 
168
sub Aprint
169
{
170
    print join ' ', @_;
171
}
172
 
173
sub walkEntries
174
{
175
    my ($entry) = @_;
176
    my $branchRoot;
177
 
178
    return if ( exists $versions{$entry}{done} );
179
    $versions{$entry}{done} = 1;
180
 
181
    if ( $versions{$entry}{branchRoot}  )
182
    {
183
        print "--First Entry in Branch:",GetVname($entry)," Base:",GetVname($versions{$entry}{branchRoot}),"\n";
184
    }
185
 
186
    print "Process:  ",GetVname($entry), "\n";
187
    if ( $#{ $versions{$entry}{next}} >= 1 )
188
    {
189
        print "Process Branch Point: $entry: ",GetVname($entry),"\n";
190
        $branchRoot = $entry;
191
    }
192
 
193
 
194
    my $opt_label = $opt_package . '_' . GetVname($entry);
195
    $versions{$entry}{vcsTag} =~ m~^(.+?)::(.*?)(::(.+))?$~;
196
    my $opt_path = $2;
197
    my $cc_label = $4;
198
 
199
    Aprint ( 'jats vcsrelease', "-label=" . $versions{$entry}{vcsTag} , '-extract', '-extract', '-root=.' , '-noprefix', "\n");
200
    my @import_args;
201
    if ( $versions{$entry}{branchRoot}  )
202
    {
203
        my $base_label = GetVname($versions{$entry}{branchRoot} );
204
        my $view = "SvnImportDir";
205
        Aprint ( 'jats svnrelease', "-label=$opt_repo/$opt_package/tags/${opt_package}_$base_label", "-view=$view", "-branch=$opt_label",'-extract', '-extract', '-root=.' , '-noprefix', "\n");
206
        push @import_args, '-reuse',"-workspace=$view";
207
 
208
    }
209
    else
210
    {
211
        push @import_args, '-reuse';
212
    }
213
 
214
    Aprint ( 'jats svn', 'import', @import_args ,"-package=$opt_repo/$opt_package", "-dir=$cc_label$vob_prefix$opt_path", "-label=$opt_label", "\n" );
215
 
216
 
217
    foreach my $subentry ( @{$versions{$entry}{next}}  )
218
    {
219
        $versions{$subentry}{branchRoot} = $entry if ($branchRoot);
220
        walkEntries( $subentry );
221
    }
222
}
223
 
224
sub walkEntries_old
225
{
226
    my ($entry) = @_;
227
    my $branchRoot;
228
 
229
    return if ( exists $versions{$entry}{done} );
230
    $versions{$entry}{done} = 1;
231
 
232
    if ( $versions{$entry}{branchRoot}  )
233
    {
234
        print "--First Entry in Branch:",GetVname($entry)," Base:",GetVname($versions{$entry}{branchRoot}),"\n";
235
    }
236
 
237
    print "Process:  ",GetVname($entry), "\n";
238
    if ( $#{ $versions{$entry}{next}} >= 1 )
239
    {
240
        print "Process Branch Point: $entry: ",GetVname($entry),"\n";
241
        $branchRoot = $entry;
242
    }
243
 
244
 
245
    my $opt_label = $opt_package . '_' . GetVname($entry);
246
    $versions{$entry}{vcsTag} =~ m~^(.+?)::(.*?)(::(.+))?$~;
247
    my $opt_path = $2;
248
    my $cc_label = $4;
249
 
250
    Aprint ( 'jats vcsrelease', "-label=" . $versions{$entry}{vcsTag} , '-extract', '-extract', '-root=.' , '-noprefix', "\n");
251
    my @import_args;
252
    if ( $versions{$entry}{branchRoot}  )
253
    {
254
        my $base_label = GetVname($versions{$entry}{branchRoot} );
255
        my $view = "SvnImportDir";
256
        Aprint ( 'jats svnrelease', "-label=$opt_repo/$opt_package/tags/${opt_package}_$base_label", "-view=$view", "-branch=$opt_label",'-extract', '-extract', '-root=.' , '-noprefix', "\n");
257
        push @import_args, '-reuse',"-workspace=$view";
258
 
259
    }
260
    else
261
    {
262
        push @import_args, '-reuse';
263
    }
264
 
265
    Aprint ( 'jats svn', 'import', @import_args ,"-package=$opt_repo/$opt_package", "-dir=$cc_label$vob_prefix$opt_path", "-label=$opt_label", "\n" );
266
 
267
 
268
    foreach my $subentry ( @{$versions{$entry}{next}}  )
269
    {
270
        $versions{$subentry}{branchRoot} = $entry if ($branchRoot);
271
        walkEntries( $subentry );
272
    }
273
}
274
 
275
sub GetVname
276
{
277
    my ($entry) = @_;
278
    my $me = $versions{$entry}{vname};
279
    unless ( $me )
280
    {
281
        $me = 'Unknown-' . $entry;
282
    }
283
    return $me;
284
}
285
 
286
foreach my $entry ( sort keys(%versions) )
287
{
288
    my @versions;
289
    my $me = GetVname($entry);
290
    foreach ( @{ $versions{$entry}{next}} )
291
    {
292
        push @versions, GetVname( $_);
293
    }
294
 
295
    print FH "\t", pentry($me)  ," -> { ", plist ( ' ; ', @versions ), " }\n";
296
#    print FH "\t", pentry($me)  ,"[label=\"$me\\nmain\"];\n" if ($versions{$entry}{main});
297
    print FH "\t", pentry($me)  ,"[shape=rectangle];\n" if ($versions{$entry}{main});
298
 
299
}
300
 
301
 
302
print FH "\n};\n";
303
close FH;
304
 
305
#
306
#   Convert DOT to a SVG
307
#
308
print "Generating graphical images\n";
309
system( "dot $filebase.dot -Tjpg -o$filebase.jpg" );  # -v
310
system( "dot $filebase.dot -Tsvg -o$filebase.svg" );  # -v
311
 
312
#
313
#   Display a list of terminal packages
314
#   These are packages that are not used by any other package
315
#
316
print "\n";
317
print "Generated: $filebase.dot\n";
318
print "Generated: $filebase.jpg\n";
319
print "Generated: $filebase.svg\n";
320
 
321
 
322
exit 0;
323
 
324
 
325
#-------------------------------------------------------------------------------
326
# Function        : GetPkgIdByName
327
#
328
# Description     :
329
#
330
# Inputs          : pkg_name
331
#
332
# Returns         :
333
#
334
sub GetPkgIdByName
335
{
336
    my ( $pkg_name ) = @_;
337
    my (@row);
338
    my $pv_id;
339
 
340
    #
341
    #   Establish a connection to Release Manager
342
    #
343
    connectRM(\$RM_DB) unless ( $RM_DB );
344
 
345
    #
346
    #   Extract data from Release Manager
347
    #
348
    my $m_sqlstr = "SELECT pkg.PKG_NAME, pkg.PKG_ID" .
349
                   " FROM RELEASE_MANAGER.PACKAGES pkg" .
350
                   " WHERE pkg.PKG_NAME = \'$pkg_name\'";
351
 
352
    my $sth = $RM_DB->prepare($m_sqlstr);
353
    if ( defined($sth) )
354
    {
355
        if ( $sth->execute( ) )
356
        {
357
            if ( $sth->rows )
358
            {
359
                while ( @row = $sth->fetchrow_array )
360
                {
361
                    Verbose( "DATA: " . join(',', @row) );
362
                    $pkg_id = $row[1] || 0;
363
                    last;
364
                }
365
            }
366
            else
367
            {
368
                Warning("GetPkgIdByName:No Data for: $pkg_name");
369
            }
370
            $sth->finish();
371
        }
372
    }
373
    else
374
    {
375
        Error("GetPkgIdByName:Prepare failure" );
376
    }
377
}
378
 
379
#-------------------------------------------------------------------------------
380
# Function        : GetData_by_pkg_id
381
#
382
# Description     :
383
#
384
# Inputs          : pv_id
385
#
386
# Returns         :
387
#
388
sub GetData_by_pkg_id
389
{
390
    my ( $pkg_id ) = @_;
391
    my (@row);
392
 
393
    #
394
    #   Establish a connection to Release Manager
395
    #
396
    connectRM(\$RM_DB) unless ( $RM_DB );
397
 
398
    #
399
    #   Extract data from Release Manager
400
    #
401
    my $m_sqlstr = "SELECT pkg.PKG_NAME, pv.PKG_VERSION, pkg.PKG_ID, pv.PV_ID, pv.LAST_PV_ID, pv.CREATED_STAMP, release_manager.PK_RMAPI.return_vcs_tag(pv.PV_ID)".
402
                   " FROM RELEASE_MANAGER.PACKAGES pkg, RELEASE_MANAGER.PACKAGE_VERSIONS pv" .
403
                   " WHERE pv.PKG_ID = \'$pkg_id\' AND pkg.PKG_ID = pv.PKG_ID";
404
 
405
 
406
    my $sth = $RM_DB->prepare($m_sqlstr);
407
    if ( defined($sth) )
408
    {
409
        if ( $sth->execute( ) )
410
        {
411
            if ( $sth->rows )
412
            {
413
                while ( @row = $sth->fetchrow_array )
414
                {
415
                    Verbose( "DATA: " . join(',', @row) );
416
                    my $pkg_name = $row[0] || 'Unknown';
417
                    my $pkg_ver = $row[1] || 'Unknown';
418
                    my $pv_id = $row[3] || 'Unknown';
419
                    my $last_pv_id = $row[4] || 'Unknown';
420
                    my $created =  $row[5] || 'Unknown';
421
                    my $vcstag =  $row[6] || 'Unknown';
422
                    print "$pkg_name, $pkg_ver, $pv_id, $last_pv_id, $created\n";
423
 
424
                    #
425
                    #   Add data to the hash
426
                    #       Remove entries that address themselves
427
                    #
428
                    push (@{$versions{$last_pv_id}{next}}, $pv_id) unless ($pv_id == $last_pv_id) ;
429
                    $versions{$pv_id}{vname} = $pkg_ver;
430
                    $versions{$pv_id}{vcsTag} = $vcstag;
431
 
432
#                    last;
433
                }
434
            }
435
            $sth->finish();
436
        }
437
    }
438
    else
439
    {
440
        Error("GetData:Prepare failure" );
441
    }
442
}
443
 
444
#-------------------------------------------------------------------------------
445
# Function        : plist
446
#
447
# Description     : Generate an entry list as text
448
#                   Replace "." with "_" since DOT doesn't like .'s
449
#                   Seperate the arguments
450
#
451
# Inputs          : $pref       - Prefix string
452
#                   @_          - An array of entries to process
453
#
454
# Returns         : A string
455
#
456
sub plist
457
{
458
    my $pref = shift;
459
    my $result = "";
460
    foreach  ( @_ )
461
    {
462
        $_ =~ s~\.~_~g;
463
        $result .= '"' . $_ . '"' . $pref;
464
    }
465
    return $result;
466
}
467
 
468
sub pentry
469
{
470
 
471
    my $result = "";
472
    foreach  ( @_ )
473
    {
474
        next unless ( $_ );
475
        $_ =~ s~\.~_~g;
476
        $result .= '"' . $_ . '"'
477
    }
478
    return $result;
479
}
480
 
481