diff -r 22486c9c7b15 -r 378360dbbdba releasing/cbrtools/perl/MergeEnvironments --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/releasing/cbrtools/perl/MergeEnvironments Wed Jun 30 11:35:58 2010 +0800 @@ -0,0 +1,219 @@ +#!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: +# MergeTwoEnvironments +# + +use strict; +use FindBin; +use lib "$FindBin::Bin"; +use RelData; +use IniData; +use MrpData; +use EnvDb; +use Getopt::Long; +use Data::Dumper; +use Utils; + +# Process command-line options +Getopt::Long::Configure ("bundling"); +my ($help, $verbose, $project, $releasenotes, $dummyrun, $internalver, $force); +GetOptions("h" => \$help, "v+" => \$verbose, "w=s" => \$project, "r=s" => \$releasenotes, "d" => \$dummyrun, "i=s" => \$internalver, 'f' => \$force); +$verbose ||= 0; +$internalver ||= "-"; + + +# Get the name and version of the new environment +my ($newcomp, $newver, @argsleft) = @ARGV; +print "Using \"$newcomp\" \"$newver\"\n" if ($verbose); + +# Eat up the environments to merge +my @envstomerge; +while (scalar @argsleft) { + my ($oldcomp, $oldver, $prefix); + ($oldcomp, $oldver, $prefix, @argsleft) = @argsleft; + print "Adding \"$oldcomp\" \"$oldver\" prefix \"$prefix\"\n" if ($verbose); + push @envstomerge, { + comp => $oldcomp, + ver => $oldver, + prefix => $prefix + }; + die "You must provide a component, version and environment for each environment you want to merge" unless $oldcomp && $oldver && defined $prefix; + # In fact, a blank (but defined) prefix might be worth having so we'll let them get away with that +} + +print < newcomp newver {oldcomp oldver prefix} ... + +The {oldcomp oldver prefix} section must be repeated at least twice + +Options: + +-r the release.src file to use (mandatory) +-h show this help +-w make the reldata in this project +-v verbose +-f (deprecated) +-d dummy run (just report the environment to be produced) +-i internal version number of the release we're creating +ENDHELP + +die "You must specify a release notes file" unless $releasenotes; +die "Release notes file \"$releasenotes\" doesn't exist" unless -e $releasenotes; + +############################################################################## + +# Create objects that the Release Tools need +my $iniData = New IniData; +my $envDb = Open EnvDb($iniData); + +# The final environment we're going to use +my %newenv; + +foreach my $mergeenv (@envstomerge) { + my $env = ReadEnvironmentFromRelData($mergeenv->{comp}, $mergeenv->{ver}); + my %copy = %$env; + + # Delete things according to the prefix + foreach (keys %copy) { + my $prefix = $mergeenv->{prefix}; + delete $copy{$_} if ($copy{$_} !~ m/^$prefix/i); + } + + %newenv = (%copy, %newenv); +} + +# Finally make sure our new component itself is in the environment +$newenv{$newcomp} = $newver; + +if ($verbose || $dummyrun) { + print "Have combined the two environments. Results are:\n"; + print Dumper(\%newenv); +} + +CreateNewRelease($newcomp, $newver, \%newenv, $project) unless $dummyrun; + +exit; + +############################################################################## +sub ReadEnvironmentFromRelData { + my $comp = shift; + my $ver = shift; + print "Reading environment from \"$comp\", \"$ver\"...\n" if ($verbose); + my $rd = Open RelData($iniData, $comp, $ver, 2) or die "Couldn't open reldata for \"$comp\" \"$ver\""; + return $rd->Environment; +} + +sub CreateNewRelease { + my $comp = shift; + my $ver = shift; + my $env = shift; + my $project = shift; + + my $fakeMrpName = Utils::PrependEpocRoot("\\__reltools_tmp_mrp"); + WriteFakeMrp($fakeMrpName, $comp, $releasenotes); + + my $mrpData = New MrpData($fakeMrpName, + $ver, + $internalver, + $iniData, + $verbose, # verbosity + 0); # fixLibs + + unlink($fakeMrpName); + + my $dir = $iniData->PathData->LocalArchivePathForNewComponent($comp, $ver, $project); + print "Making directory \"$dir\"\n" if ($verbose); + Utils::MakeDir($dir); + print "Writing out reldata\n"; + my $relData = New RelData($iniData, + $mrpData, + $releasenotes, + $env, + "MergeTwoEnvironments", + $verbose, # verbosity + undef, # dontPersist + $project); + print "$comp $ver created.\n"; +} + +sub WriteFakeMrp { + my $name = shift; + my $comp = shift; + my $relnotes = shift; + open(FILE, ">$name") or die "Couldn't write to \"$name\" because $!"; + print FILE "component $comp\nnotes_source $relnotes\n"; + close FILE; +} + +__END__ + +=head1 NAME + +MergeEnvironments - Merge the environments of several existing releases into a new release + +=head1 SYNOPSIS + +MergeEnvironments newcomp newver {oldcomp oldver prefix} ... + +The {oldcomp oldver prefix} section must be repeated at least twice. + +Options: + + -r the release.src file to use (mandatory) + -h help + -w make the new release in this project (only applicable for new-style archive-path arrangements) + -v verbose (-vv = very verbose) + -f (deprecated) + -d dummy run (just report the environment to be produced) + -i internal version number of the release we're creating + +=head1 DESCRIPTION + +This tool will merge several environments to produce a new one. It reads the environment from two existing components, and produces another one. This new component just contains an environment; it has no binaries nor source. + +It is expected that you will then use C to validate against that environment. + +=head1 KNOWN BUGS + +Not really a defect, but it's limiting that you can only merge the environments based on the prefix of the version number. It would be nice to have more flexible criteria. + +The command line syntax is not intuitive. This may be fixed one day. + +But much more likely, the whole issue will go away with Release Tools 3, when validation will be substantially changed. + +=head1 STATUS + +Supported. If you find a problem, please report it to us. + +=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