common/tools/csvToSysDef.pl
author Simon Howkins <simonh@symbian.org>
Mon, 05 Oct 2009 11:33:00 +0100
changeset 580 0a42a7ed6d8d
parent 344 348670fc497a
child 959 94716c328941
permissions -rw-r--r--
Added XML escaping, so that the output should be well-formed XML even if the input includes '<'s, '>'s, or '&'s.
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 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
    10
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
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
    12
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
    13
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
    14
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
# 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
    16
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
    17
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
    18
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
    19
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
    20
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
    21
{
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
	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
    23
	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
    24
	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
    25
	{
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
		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
    27
		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
    28
	}
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
	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
    31
	{
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
		# 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
    33
		@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
    34
	}
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
	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
    36
	{
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
		# 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
    38
		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
    39
		# 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
    40
		@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
    41
		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
    42
	}
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
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
    45
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
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
    47
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
    48
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
# 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
    50
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
    51
{
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
    52
	# 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
    53
	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
    54
	# 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
    55
	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
    56
	$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
    57
	$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
    58
	$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
    59
	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
    60
	{
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
    61
		# 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
    62
		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
    63
		$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
    64
	}
333
7b0a774a0c87 Made error messages more useful.
Simon Howkins <simonh@symbian.org>
parents: 331
diff changeset
    65
	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
    66
344
348670fc497a Added output of the package definition incorporated for each package.
Simon Howkins <simonh@symbian.org>
parents: 341
diff changeset
    67
	warn "Including $pkgDef for $package->{dst}\n";
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
# 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
    82
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
    83
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
    84
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
    85
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
    86
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
    87
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
    88
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
    89
{
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
	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
    91
	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
    92
333
7b0a774a0c87 Made error messages more useful.
Simon Howkins <simonh@symbian.org>
parents: 331
diff changeset
    93
	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
    94
	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
    95
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
	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
    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
		# 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
    99
		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
   100
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 $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
   102
		$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
   103
		
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
		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
   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
			# 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
   107
			# 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
   108
			$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
   109
		}
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
		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
   111
		{
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
			# 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
   113
			# 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
   114
			$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
   115
		}
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
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
		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
   118
		{
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
			# 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
   120
			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
   121
		}
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
		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
   123
		{
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
			# 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
   125
			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
   126
		}
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
}
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
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
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
   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
	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
   133
	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
   134
	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
   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
	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
   137
	{
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
		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
   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
			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
   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
	}
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 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
   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
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
   148
{
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
	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
   150
	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
   151
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
	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
   153
	$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
   154
	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
   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
		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
   157
		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
   158
	}
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 "<$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
   161
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
   162
	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
   163
		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
   164
			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
   165
			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
   166
			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
   167
			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
   168
			$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
   169
		}
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
		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
   171
			! 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
   172
		}
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
		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
   174
	{
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
   175
		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
   176
	}
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
   177
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
	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
   179
	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
   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
		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
   182
		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
   183
		{
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
			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
   185
		}
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
		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
   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
	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
   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 "/"
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
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
	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
   194
}
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