diff -r 22486c9c7b15 -r 378360dbbdba releasing/cbrtools/perl/LatestVer --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/releasing/cbrtools/perl/LatestVer Wed Jun 30 11:35:58 2010 +0800 @@ -0,0 +1,293 @@ +#!perl -w +# Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# +# + +use strict; +use FindBin; +use lib "$FindBin::Bin"; +use Getopt::Long; +use IniData; +use EnvDb; +use CommandController; + + +# +# Globals. +# + +my $verbose = 0; +my $iniData = IniData->New(); +my $commandController = CommandController->New($iniData, 'LatestVer'); +my $envDb; # this is only created when needed, by the EnvDb() function +my $listAll; +my $userComp; +my $everyComponent; +my $versionFilter; + + +# +# Main. +# + +ProcessCommandLine(); +PrintLatestVersions(); + +# +# Subs. +# + +sub ProcessCommandLine { + Getopt::Long::Configure ("bundling"); + my $help; + GetOptions('h' => \$help, 'a:i' => \$listAll, 'v+' => \$verbose, 'f=s' => \$versionFilter); + + if ($help) { + Usage(0); + } + + $userComp = shift @ARGV || undef; + + unless ($#ARGV == -1) { + print "Error: Invalid arguments\n"; + Usage(1); + } +} + +sub Usage { + my $exitCode = shift; + + Utils::PrintDeathMessage($exitCode, "\nUsage: latestver [options] [component] + +options: + +-h help +-a lists all versions in descending date order +-a 6 list the most recent six versions +-v verbose output (-vv very verbose, -vvv very very verbose) +-f only show versions whose version numbers match that text\n"); +} + +sub PrintLatestVersions { + # Convert the version number filter from glob-style to perl-style RE + if (defined $versionFilter) { + require Text::Glob; + # Surprisingly complicated to convert a glob-style to a perl-style RE + # Hence we use a module. Not entirely convinced that Text::Glob + # does a particularly good job (e.g. the pattern t_make*[0] doesn't work) + # but it's better than my attempts, and should suffice for most cases. + $versionFilter = Text::Glob::glob_to_regex($versionFilter); + } + + # First work out what components we need to process + my @compsToProcess; + if ($userComp) { + @compsToProcess = ($userComp); + } else { + # Call listcomponents with remote flag set as 0 and continue flag set as 1 + @compsToProcess = sort @{$iniData->PathData->ListComponents(0,1)}; + } + + # Second work out what versions we need to process + my @compVersions; # contains lots of [ comp_name, reldata ] + foreach my $compName (@compsToProcess) { + foreach (@{GetRelevantRelDataObjects($compName, $versionFilter)}) { + push @compVersions, [ $compName, $_ ]; + } + } + + die "No versions were found.\n" unless (@compVersions); + + # Third work out how verbose to make the output, and do it! + if ($verbose) { + my @tableData; + InsertTableHeadings(\@tableData); + AddTableEntry($$_[0], \@tableData, $$_[1]) foreach (@compVersions); + print "\n"; + $iniData->TableFormatter->PrintTable(\@tableData, 1); + } else { + PrintMinimalVerbosity($$_[0], $$_[1]) foreach (@compVersions); + } +} + +sub PrintMinimalVerbosity { + my $comp = shift; + my $reldata = shift; + + my $ver = $reldata->Version(); + if ($userComp) { + print "$ver\n"; + } else { + print "$comp: $ver\n"; + } +} + +sub GetRelevantRelDataObjects { + my $comp = shift; + my $ver = shift; + + my $shownum = $listAll; + $shownum = 1 unless defined $listAll; + + my $relDataObjects = RelData->OpenSet($iniData, $comp, $verbose, $ver); + $relDataObjects ||= []; + splice(@$relDataObjects, $shownum) unless (scalar @$relDataObjects == 0) || ($shownum==0) || ($shownum > @$relDataObjects); # if showNum==0, we got just -a so show all + + return $relDataObjects; +} + +sub InsertTableHeadings { + my $tableData = shift; + + my @headings; + @headings = ('Version', 'Internal version', 'Project', 'Releaser', 'Date'); + if ($verbose > 1) { + @headings = ('', @headings); + } + if ($verbose > 2) { + @headings = (@headings, 'Local path', 'Remote path'); + } + if (!$userComp) { + @headings = ('Component', @headings); + } + push @$tableData, \@headings; +} + +sub AddTableEntry { + my $comp = shift; + my $tableData = shift; + my $relData = shift; + + my @fields; + + my $ver = $relData->Version(); + my $releaser = $relData->NotesSource()->{releaser}; + chomp $releaser; + my $project = $iniData->PathData->ComponentProject($comp, $ver); + @fields = ($ver, $relData->InternalVersion(), $project, $releaser, $relData->NotesSource()->{date}); + + # We're being very verbose, so add a 'status' field + if ($verbose > 1) { + my $status = ""; + # "Installed" flag + # + my $installedversion = EnvDb()->Version($comp); + $status .= "I" if ($installedversion && $installedversion eq $ver); + + # "Exported" flag + my $remotePath||=""; + eval { + my $remoteSite = $iniData->RemoteSite(0); # 0 = not verbose + if ($remoteSite) { + $remotePath = $iniData->PathData->RemoteArchivePathForExistingComponent + ($comp, $ver, $remoteSite); + $status .= "E" if ($remotePath && $remoteSite->FileExists("$remotePath/$comp$ver.zip") ); + } + }; + + unshift @fields, $status; + + if ($verbose > 2) { + # We're being extravagently verbose, so add two 'location' fields which will + # wrap off the end of the line - sigh. + my $localPath = '"'. $iniData->PathData->LocalArchivePathForExistingComponent + ($comp, $ver) .'"'; + $remotePath = '"'.$remotePath.'"' if ($remotePath); + $remotePath ||= ''; + $localPath ||= ''; + @fields = (@fields, $localPath, $remotePath); + } + } + + # If we're listing several components, stick a field on the front + # saying which component we're talking about in this case + if (!$userComp) { + unshift @fields, $comp; + } + push @$tableData, \@fields; +} + +sub EnvDb { + $envDb ||= EnvDb->Open($iniData, $verbose); +} + +__END__ + +=head1 NAME + +LatestVer - Prints the latest version of a particular component. + +=head1 SYNOPSIS + + latestver [options] [component] + +options: + + -h help + -a lists all versions in descending date order + -a lists the most recent 'n' versions in descending date order + -v verbose output (-vv very verbose, -vvv very very verbose) + -f filter the versions displayed + +=head1 DESCRIPTION + +Prints the latest version of a particular component, or all known components if the component name is omitted. Optionally prints all versions in descending date order. + +If verbose output is requested, the internal version number, storage area ("project"), releaser's name and release time is also displayed. + +If very verbose output is requested, and the remote site is set in the reltools.ini file, a "flags" column will be shown with two possible letters: + +=over 4 + +=item I + +This version is installed on your machine. + +=item E + +This version is exported. + +=back + +Using the -vv option may significantly increase the time this tool takes to run. + +If very very verbose is requested the local path is also output to screen. + +If you specify a -f version string then only versions whose version numbers contain that wildcard will be shown. The wildcard should be a glob-style regular expression (for example "*chinese*"). It is case-insensitive. + +If very very verbose output is requested, two more fields will show the location of the release on the local and remote archives. + +=head1 KNOWN BUGS + +None. + +=head1 COPYRIGHT + + Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). + All rights reserved. + This component and the accompanying materials are made available + under the terms of the License "Eclipse Public License v1.0" + which accompanies this distribution, and is available + at the URL "http://www.eclipse.org/legal/epl-v10.html". + + Initial Contributors: + Nokia Corporation - initial contribution. + + Contributors: + + Description: + + +=cut