Rev 2026 | Blame | Compare with Previous | Last modification | View Log | RSS feed
######################################################################### Copyright ( C ) 2004 ERG Limited, All rights reserved## Module name : jats.sh# Module type : Makefile system# Compiler(s) : n/a# Environment(s): jats## Description : Get package information# for a package name and version as specified on the# command line.## Determine the package id# Locate all packages that have the same package name# Create a hash of previous versions# Create a JPG showing the version history##......................................................................#require 5.006_001;use strict;use warnings;use JatsError;use JatsRmApi;#use Data::Dumper;use Cwd;use DBI;use Getopt::Long;use Pod::Usage; # required for help supportmy $RM_DB;my $opt_repo = 'https://auperasvn01.aupera.erggroup.com/svn/DevTools';my $vob_prefix = $ENV{'GBE_UNIX'} ? '/vobs' : '/vobs';my $opt_package;################################################################################# Global data#my $VERSION = "1.0.0";my %ReleasePackages; # Packages in the releasemy %BuildPackages; # Packages for this buildmy $last_pv_id;my $pkg_id;my %versions;## Options#my $opt_help = 0;my $opt_manual = 0;my $opt_verbose = 0;my $result = GetOptions ("help+" => \$opt_help, # flag, multiple use allowed"manual" => \$opt_manual, # flag"verbose+" => \$opt_verbose, # flag);## Process help and manual options#pod2usage(-verbose => 0, -message => "Version: $VERSION") if ($opt_help == 1 || ! $result);pod2usage(-verbose => 1) if ($opt_help == 2 );pod2usage(-verbose => 2) if ($opt_manual || ($opt_help > 2));## Configure the error reporting process now that we have the user options#ErrorConfig( 'name' =>'PLAY9c','verbose' => $opt_verbose );unless ( $ARGV[0] ){Error( "Specify a package as 'name'" );}$opt_package = $ARGV[0];Verbose( "Base Package: $opt_package");## Body of the process#GetPkgIdByName ( $opt_package );GetData_by_pkg_id ( $pkg_id );## Process the 'versions' hash and add back references### Find start# Entry with no previous#foreach my $entry ( keys(%versions) ){foreach ( @{ $versions{$entry}{next}} ){$versions{$_}{last} = $entry;}}my @startPoints;my $last_entry = 0;foreach my $entry ( keys(%versions) ){unless ( exists $versions{$entry}{last} ){push @startPoints, $entry;}if ( $entry > $last_entry ){$last_entry = $entry;}}## Walk backwards from the LAST entry and mark the main path through the tree#my $entry = $last_entry;while ( $entry ){$versions{$entry}{'main'} = 1;$entry = $versions{$entry}{last};}DebugDumpData ("Versions", \%versions );DebugDumpData ("Starts", \@startPoints );foreach my $entry (sort {$a <=> $b} keys(%versions) ){print GetVname($entry),"\n";}## Walk the tree#foreach my $entry (sort {$a <=> $b} @startPoints ){walkEntries( $entry );}#foreach my $entry ( sort {$a <=> $b} keys(%versions) )#{# my @versions;# my $me = GetVname($entry);# my $next_count = 1+ $#{ $versions{$entry}{next}};# my $type = '';# if ( $next_count <= 0 ) {# $type = 'Terminal';# } elsif ( $next_count > 1 ) {# $type = 'Branch Point';# }## print "$entry, $me, $type\n";#}my $filebase = "$ARGV[0]_versions";open (FH, ">$filebase.dot" ) or die "Cannot open output";print FH "digraph world {\n";#print FH "\trankdir=LR;\n";print FH "\tnode[fontsize=24];\n";sub Aprint{print join ' ', @_;}sub walkEntries{my ($entry) = @_;my $branchRoot;return if ( exists $versions{$entry}{done} );$versions{$entry}{done} = 1;if ( $versions{$entry}{branchRoot} ){print "--First Entry in Branch:",GetVname($entry)," Base:",GetVname($versions{$entry}{branchRoot}),"\n";}print "Process: ",GetVname($entry), "\n";if ( $#{ $versions{$entry}{next}} >= 1 ){print "Process Branch Point: $entry: ",GetVname($entry),"\n";$branchRoot = $entry;}my $opt_label = $opt_package . '_' . GetVname($entry);$versions{$entry}{vcsTag} =~ m~^(.+?)::(.*?)(::(.+))?$~;my $opt_path = $2;my $cc_label = $4;Aprint ( 'jats vcsrelease', "-label=" . $versions{$entry}{vcsTag} , '-extract', '-extract', '-root=.' , '-noprefix', "\n");my @import_args;if ( $versions{$entry}{branchRoot} ){my $base_label = GetVname($versions{$entry}{branchRoot} );my $view = "SvnImportDir";Aprint ( 'jats svnrelease', "-label=$opt_repo/$opt_package/tags/${opt_package}_$base_label", "-view=$view", "-branch=$opt_label",'-extract', '-extract', '-root=.' , '-noprefix', "\n");push @import_args, '-reuse',"-workspace=$view";}else{push @import_args, '-reuse';}Aprint ( 'jats svn', 'import', @import_args ,"-package=$opt_repo/$opt_package", "-dir=$cc_label$vob_prefix$opt_path", "-label=$opt_label", "\n" );foreach my $subentry ( @{$versions{$entry}{next}} ){$versions{$subentry}{branchRoot} = $entry if ($branchRoot);walkEntries( $subentry );}}sub walkEntries_old{my ($entry) = @_;my $branchRoot;return if ( exists $versions{$entry}{done} );$versions{$entry}{done} = 1;if ( $versions{$entry}{branchRoot} ){print "--First Entry in Branch:",GetVname($entry)," Base:",GetVname($versions{$entry}{branchRoot}),"\n";}print "Process: ",GetVname($entry), "\n";if ( $#{ $versions{$entry}{next}} >= 1 ){print "Process Branch Point: $entry: ",GetVname($entry),"\n";$branchRoot = $entry;}my $opt_label = $opt_package . '_' . GetVname($entry);$versions{$entry}{vcsTag} =~ m~^(.+?)::(.*?)(::(.+))?$~;my $opt_path = $2;my $cc_label = $4;Aprint ( 'jats vcsrelease', "-label=" . $versions{$entry}{vcsTag} , '-extract', '-extract', '-root=.' , '-noprefix', "\n");my @import_args;if ( $versions{$entry}{branchRoot} ){my $base_label = GetVname($versions{$entry}{branchRoot} );my $view = "SvnImportDir";Aprint ( 'jats svnrelease', "-label=$opt_repo/$opt_package/tags/${opt_package}_$base_label", "-view=$view", "-branch=$opt_label",'-extract', '-extract', '-root=.' , '-noprefix', "\n");push @import_args, '-reuse',"-workspace=$view";}else{push @import_args, '-reuse';}Aprint ( 'jats svn', 'import', @import_args ,"-package=$opt_repo/$opt_package", "-dir=$cc_label$vob_prefix$opt_path", "-label=$opt_label", "\n" );foreach my $subentry ( @{$versions{$entry}{next}} ){$versions{$subentry}{branchRoot} = $entry if ($branchRoot);walkEntries( $subentry );}}sub GetVname{my ($entry) = @_;my $me = $versions{$entry}{vname};unless ( $me ){$me = 'Unknown-' . $entry;}return $me;}foreach my $entry ( sort keys(%versions) ){my @versions;my $me = GetVname($entry);foreach ( @{ $versions{$entry}{next}} ){push @versions, GetVname( $_);}print FH "\t", pentry($me) ," -> { ", plist ( ' ; ', @versions ), " }\n";# print FH "\t", pentry($me) ,"[label=\"$me\\nmain\"];\n" if ($versions{$entry}{main});print FH "\t", pentry($me) ,"[shape=rectangle];\n" if ($versions{$entry}{main});}print FH "\n};\n";close FH;## Convert DOT to a SVG#print "Generating graphical images\n";system( "dot $filebase.dot -Tjpg -o$filebase.jpg" ); # -vsystem( "dot $filebase.dot -Tsvg -o$filebase.svg" ); # -v## Display a list of terminal packages# These are packages that are not used by any other package#print "\n";print "Generated: $filebase.dot\n";print "Generated: $filebase.jpg\n";print "Generated: $filebase.svg\n";exit 0;#-------------------------------------------------------------------------------# Function : GetPkgIdByName## Description :## Inputs : pkg_name## Returns :#sub GetPkgIdByName{my ( $pkg_name ) = @_;my (@row);my $pv_id;## Establish a connection to Release Manager#connectRM(\$RM_DB) unless ( $RM_DB );## Extract data from Release Manager#my $m_sqlstr = "SELECT pkg.PKG_NAME, pkg.PKG_ID" ." FROM RELEASE_MANAGER.PACKAGES pkg" ." WHERE pkg.PKG_NAME = \'$pkg_name\'";my $sth = $RM_DB->prepare($m_sqlstr);if ( defined($sth) ){if ( $sth->execute( ) ){if ( $sth->rows ){while ( @row = $sth->fetchrow_array ){Verbose( "DATA: " . join(',', @row) );$pkg_id = $row[1] || 0;last;}}else{Warning("GetPkgIdByName:No Data for: $pkg_name");}$sth->finish();}}else{Error("GetPkgIdByName:Prepare failure" );}}#-------------------------------------------------------------------------------# Function : GetData_by_pkg_id## Description :## Inputs : pv_id## Returns :#sub GetData_by_pkg_id{my ( $pkg_id ) = @_;my (@row);## Establish a connection to Release Manager#connectRM(\$RM_DB) unless ( $RM_DB );## Extract data from Release Manager#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)"." FROM RELEASE_MANAGER.PACKAGES pkg, RELEASE_MANAGER.PACKAGE_VERSIONS pv" ." WHERE pv.PKG_ID = \'$pkg_id\' AND pkg.PKG_ID = pv.PKG_ID";my $sth = $RM_DB->prepare($m_sqlstr);if ( defined($sth) ){if ( $sth->execute( ) ){if ( $sth->rows ){while ( @row = $sth->fetchrow_array ){Verbose( "DATA: " . join(',', @row) );my $pkg_name = $row[0] || 'Unknown';my $pkg_ver = $row[1] || 'Unknown';my $pv_id = $row[3] || 'Unknown';my $last_pv_id = $row[4] || 'Unknown';my $created = $row[5] || 'Unknown';my $vcstag = $row[6] || 'Unknown';print "$pkg_name, $pkg_ver, $pv_id, $last_pv_id, $created\n";## Add data to the hash# Remove entries that address themselves#push (@{$versions{$last_pv_id}{next}}, $pv_id) unless ($pv_id == $last_pv_id) ;$versions{$pv_id}{vname} = $pkg_ver;$versions{$pv_id}{vcsTag} = $vcstag;# last;}}$sth->finish();}}else{Error("GetData:Prepare failure" );}}#-------------------------------------------------------------------------------# Function : plist## Description : Generate an entry list as text# Replace "." with "_" since DOT doesn't like .'s# Seperate the arguments## Inputs : $pref - Prefix string# @_ - An array of entries to process## Returns : A string#sub plist{my $pref = shift;my $result = "";foreach ( @_ ){$_ =~ s~\.~_~g;$result .= '"' . $_ . '"' . $pref;}return $result;}sub pentry{my $result = "";foreach ( @_ ){next unless ( $_ );$_ =~ s~\.~_~g;$result .= '"' . $_ . '"'}return $result;}