common/tools/csvToSysDef.pl
author Simon Howkins <simonh@symbian.org>
Fri, 07 Aug 2009 14:33:52 +0100
changeset 340 aee074ee2646
parent 335 15307a7772ea
child 341 2ba361491037
permissions -rw-r--r--
Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package). Added sorting of the attributes when outputting the system definition, to match the de facto standard in the system definition we started with.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
     1
#!perl -w
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
     2
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
     3
use strict;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
     4
331
f7c6fc4239ac Fixed paths and drives for executing script.
Simon Howkins <simonh@symbian.org>
parents: 330
diff changeset
     5
use FindBin;
f7c6fc4239ac Fixed paths and drives for executing script.
Simon Howkins <simonh@symbian.org>
parents: 330
diff changeset
     6
use lib "$FindBin::Bin/lib";
f7c6fc4239ac Fixed paths and drives for executing script.
Simon Howkins <simonh@symbian.org>
parents: 330
diff changeset
     7
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
     8
use XML::Parser;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
     9
use Data::Dumper;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    10
use Text::CSV;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    11
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    12
my $sourcesCSV = shift or die "First arg must be source csv file";
331
f7c6fc4239ac Fixed paths and drives for executing script.
Simon Howkins <simonh@symbian.org>
parents: 330
diff changeset
    13
my $backupBaseDir = shift or die "Second arg must be path to tree of package_definitions to use if not found in the source packages";
f7c6fc4239ac Fixed paths and drives for executing script.
Simon Howkins <simonh@symbian.org>
parents: 330
diff changeset
    14
shift and die "No more than two arguments please";
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    15
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    16
# Load CSV
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    17
open my $csvText, "<", $sourcesCSV or die;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    18
my $csv = Text::CSV->new();
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    19
my @keys;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    20
my @packages;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    21
while (my $line = <$csvText>)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    22
{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    23
	chomp $line;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    24
	next unless $line;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    25
	unless ($csv->parse($line))
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    26
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    27
		my $err = $csv->error_input();
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    28
		die "Failed to parse line '$line': $err";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    29
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    30
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    31
	if (! @keys)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    32
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    33
		# First line - note the column names
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    34
		@keys =  $csv->fields();
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    35
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    36
	else
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    37
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    38
		# Already got the keys, so get the data
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    39
		my %package;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    40
		# Read into a hash slice
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    41
		@package{@keys} = $csv->fields();
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    42
		push @packages, \%package;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    43
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    44
}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    45
close $csvText;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    46
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    47
my $parser = new XML::Parser(Style => "Objects") or die;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    48
my $outTree;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    49
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    50
# For each package in CSV...
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    51
foreach my $package (@packages)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    52
{
335
15307a7772ea If a package does not have a definition in the sources.csv then it won't get built, so don't try to incorporate it into the system definition.
Simon Howkins <simonh@symbian.org>
parents: 333
diff changeset
    53
	# If the sources.csv does not include a sys def for this package, it doesn't get built
15307a7772ea If a package does not have a definition in the sources.csv then it won't get built, so don't try to incorporate it into the system definition.
Simon Howkins <simonh@symbian.org>
parents: 333
diff changeset
    54
	next unless $package->{sysdef};
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    55
	# If it's in the "backup" location, use that one (ie our copy overrides the package's own copy)
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    56
	my $pkgDef = "$package->{dst}/$package->{sysdef}";
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    57
	$pkgDef =~ s{^/sf/}{};
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    58
	$pkgDef =~ s{/[^/]*$}{};
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    59
	$pkgDef = "$backupBaseDir/$pkgDef/package_definition.xml";
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    60
	if (!-f $pkgDef)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    61
	{
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    62
		# Not there, so look for the pkg defn in the root of the package tree
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    63
		warn "Warning: Package $package->{dst} does not appear on the local system\n" unless -d $package->{dst};
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    64
		$pkgDef = "$package->{dst}/$package->{sysdef}";
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    65
	}
333
7b0a774a0c87 Made error messages more useful.
Simon Howkins <simonh@symbian.org>
parents: 331
diff changeset
    66
	die "Unable to locate any package_definition at all for $package->{dst}" unless -f $pkgDef;
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    67
333
7b0a774a0c87 Made error messages more useful.
Simon Howkins <simonh@symbian.org>
parents: 331
diff changeset
    68
	my $pkgTree = eval { $parser->parsefile($pkgDef) } or die "Failed to parse $pkgDef : $@";
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    69
	if (!$outTree)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    70
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    71
		# The first file is taken verbatim
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    72
		$outTree = $pkgTree;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    73
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    74
	else
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    75
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    76
		# Merge into output Tree
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    77
		mergeTrees($outTree->[0], $pkgTree->[0]);
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    78
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    79
}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    80
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    81
#print Data::Dumper->Dump([$outTree->[0]], ["tree"]);
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    82
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    83
# Output total tree
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    84
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    85
printTree($outTree->[0]);
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    86
print "\n";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    87
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    88
exit;
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    89
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    90
sub mergeTrees
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    91
{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    92
	my $baseTree = shift or die;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    93
	my $extrasTree = shift or die;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    94
333
7b0a774a0c87 Made error messages more useful.
Simon Howkins <simonh@symbian.org>
parents: 331
diff changeset
    95
	die ("Package Definitions do not match: ".(ref $baseTree)." vs ".(ref $extrasTree)) unless ref $baseTree eq ref $extrasTree;
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    96
	return if ref $baseTree eq "main::Characters";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    97
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    98
	foreach my $extraChild (@{$extrasTree->{Kids}})
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    99
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   100
		# Work out whether this child should be merged with a namesake, or appended
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   101
		my $mergeIt = undef;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   102
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   103
		my $extraChildTag = ref $extraChild;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   104
		$extraChildTag =~ s{^main::}{};
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   105
		
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   106
		if ($extraChildTag =~ m{^(SystemDefinition|systemModel)$})
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   107
		{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   108
			# Should be merged if there's already one there
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   109
#			warn "Always merge $extraChildTag";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   110
			# Look for a namesake in the base
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   111
			$mergeIt = matchTag($baseTree->{Kids}, $extraChild, undef);
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   112
		}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   113
		elsif ($extraChildTag =~ m{layer|block|package|collection|component})
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   114
		{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   115
			# Should be merged if there is another tag with the same "name" attribute
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   116
#			warn "Sometimes merge $extraChildTag";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   117
			# Look for a namesake in the base
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   118
			$mergeIt = matchTag($baseTree->{Kids}, $extraChild, "name");
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   119
		}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   120
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   121
		if ($mergeIt)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   122
		{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   123
			# Merge children
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   124
			mergeTrees($mergeIt, $extraChild);
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   125
		}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   126
		else
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   127
		{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   128
			# Add this child
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   129
			push @{$baseTree->{Kids}}, $extraChild;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   130
		}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   131
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   132
}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   133
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   134
sub matchTag
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   135
{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   136
	my $peers = shift;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   137
	my $outsider = shift;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   138
	my $attr = shift;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   139
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   140
	foreach my $peer (@$peers)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   141
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   142
		if (ref $peer eq ref $outsider && (!defined $attr || $peer->{$attr} eq $outsider->{$attr}))
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   143
		{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   144
			return $peer;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   145
		}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   146
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   147
	
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   148
	return undef;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   149
}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   150
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   151
sub printTree
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   152
{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   153
	my $tree = shift or die;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   154
	die unless ref $tree;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   155
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   156
	my $tagName = ref $tree;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   157
	$tagName =~ s{^main::}{};
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   158
	if ($tagName eq "Characters")
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   159
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   160
		print $tree->{Text};
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   161
		return;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   162
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   163
	
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   164
	print "<$tagName";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   165
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   166
	foreach my $attr (
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   167
		sort {
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   168
			my $order = "name long-name tech_domain level span schema levels filter introduced deprecated purpose class plugin origin-model bldFile mrp version priority";
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   169
			my $ixA = index $order, $a;
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   170
			my $ixB = index $order, $b;
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   171
			die "$a $b" if $ixA + $ixB == -2;
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   172
			$ixA - $ixB;
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   173
		}
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   174
		grep {
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   175
			! ref $tree->{$_}
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   176
		}
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   177
		keys %$tree)
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   178
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   179
		print " $attr=\"$tree->{$attr}\"";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   180
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   181
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   182
	my $children = $tree->{Kids};
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   183
	if (scalar @$children)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   184
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   185
		print ">";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   186
		foreach my $child (@$children)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   187
		{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   188
			printTree($child);
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   189
		}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   190
		print "</$tagName";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   191
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   192
	else
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   193
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   194
		print "/"
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   195
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   196
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   197
	print ">";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   198
}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   199