diff -r 1f07674ec99f -r 5069de517698 common/tools/brag/sbsToBrag.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/tools/brag/sbsToBrag.pl Wed Nov 11 13:22:02 2009 +0000 @@ -0,0 +1,153 @@ +#!perl -w +# +# Copyright (c) 2009 Symbian Foundation Ltd +# 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: +# Symbian Foundation Ltd - initial contribution. +# +# Contributors: +# +# Description: +# Generate the BRAG-compatible XML summary of the Raptor log from the CSV output of the raptor parser + +use strict; + +use FindBin; +use lib "$FindBin::Bin"; + +use XML::Parser; +#use Getopt::Long; + +use ToBrag; + +my $raptorLogGlob = shift or die "First argument must be raptor XML log to read\n"; +shift and die "Only one argument please\n"; + +@ARGV = glob $raptorLogGlob; + +# Start to build structure to be output as XML (same format as XML::Parser would create for us) +my ($doc, $buildStatus) = ToBrag::createDocumentAndRoot("buildStatus"); +# Obtain a phase object +my $buildPhase = ToBrag::ensureChild($buildStatus, "phase", "name", "Build"); + +# Parse the Raptor logs +# (Use XML::Parser in "Stream" mode so we don't have to hold all the data in memory at the same time) +my $xml = XML::Parser->new(Style => "Stream", Pkg => "main"); + +foreach my $log (@ARGV) +{ + $xml->parsefile($log); +} + +print "\n"; +print "\n"; +ToBrag::printTree($doc->[0]); +print "\n"; + +exit (0); + +my $context; +sub StartTag +{ + my $expat = shift; + my $tagName = shift; + my %attrib = %_; + + if ($tagName eq "recipe") + { + $context = {%attrib}; + } + elsif ($tagName eq "status") + { + $context->{"exit"} = $attrib{"exit"}; + } +} +sub EndTag +{ + my $expat = shift; + my $tagName = shift; + + if ($tagName eq "recipe") + { + die unless $context; + + if ($context->{"exit"} ne "ok") + { + # Create a more readable error message + my %errorIdToDetail = ( + tem => {message => "Failed to execute '$context->{source}' invoked via $context->{bldinf}", severity => "major"}, + msvctoolscompile => {message => "Failed to compile $context->{source}", severity => "minor"}, + compile => {message => "Failed to compile $context->{source}", severity => "minor"}, + compile2object => {message => "Failed to compile $context->{source}", severity => "minor"}, + win32compile2object => {message => "Failed to compile $context->{source}", severity => "minor"}, + tools2lib => {message => "Failed to build library $context->{target}", severity => "minor"}, + ar => {message => "Failed to build library $context->{target}", severity => "minor"}, + win32archive => {message => "Failed to build library $context->{target}", severity => "minor"}, + "link" => {message => "Failed to create symbols for $context->{target}", severity => "minor"}, + postlink => {message => "Failed to link $context->{target}", severity => "minor"}, + win32stageonelink => {message => "Failed to link $context->{target} (stage 1)", severity => "minor"}, + win32stagetwolink => {message => "Failed to link $context->{target}", severity => "minor"}, + win32simplelink => {message => "Failed to link $context->{target}", severity => "minor"}, + win32processexports => {message => "Failed to export $context->{source} to $context->{target}", severity => "minor"}, + tracecompile => {message => "Trace compile failure for $context->{target}", severity => "unknown"}, + extension_makefile => {message => "Failed within an extension makefile connected to $context->{bldinf}", severity => "major"}, + ); +# die $context->{name} unless exists $errorIdToDetail{$context->{name}}; + + my $message = $errorIdToDetail{$context->{name}}->{message} || "Unknown failure tag '$context->{name}' ($context->{source} -> $context->{target})"; + $context->{severity} = $errorIdToDetail{$context->{name}}->{severity} || "unknown"; + + # Obtain a step object + my $step = ToBrag::ensureStep($buildPhase, $context->{config}); + # Also create empty tags with severities in a sensible order + ToBrag::ensureFailureSet($step, "critical"); + ToBrag::ensureFailureSet($step, "major"); + ToBrag::ensureFailureSet($step, "minor"); + # Obtain a failures object + my $failureSet = ToBrag::ensureFailureSet($step, $context->{severity}); + + # Now create the failure itself, and add it to this failure set + my $failureItem = bless { + Kids => [ bless { Kids => [ bless { Text => $message }, "Characters" ]}, "effect" ], + }, "failure"; + if ($context->{component}) + { + $context->{bldinf} =~ s{^\w:(/sf/.*?/.*?)/.*$}{$1}; + $failureItem->{package} = $context->{bldinf}; + } + my @causes = grep { $_ && ! m/^\+ / } split("\n", $context->{Chars}); + @causes = map { " $_" } @causes; + if (@causes) + { + my @reportedCauses = @causes[0 .. min($#causes, 49)]; + my $causesItem = bless { + Kids => [ bless { Text => join "\n", @reportedCauses }, "Characters" ] + }, "causes"; + push @{$failureItem->{Kids}}, $causesItem; + my $unreportedCauses = scalar @causes - scalar @reportedCauses; + $failureItem->{unreported_causes} = $unreportedCauses; + } + push @{$failureSet->{Kids}}, $failureItem, $ToBrag::xmlNewline; + } + + $context = undef; + } +} +sub Text +{ + s/^\n*//; + if ($context) + { + $context->{Chars} .= $_; + } +} + +sub min +{ + return ($_[0] < $_[1]) ? $_[0] : $_[1] ; +} +