diff -r 247e27021cd0 -r f2ac8aeae6bb common/tools/analysis/yarp.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/tools/analysis/yarp.pl Mon Jun 08 15:59:51 2009 +0100 @@ -0,0 +1,161 @@ +#!/usr/bin/perl +# 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: +# Matt Davies +# +# Description: +# YARP - Yet Another Recipe Parser +# This tool parses Raptor logs looking for failures, and writes a CSV file of the results +# +# Usage: +# perl yarp.pl +# +# Notes: +# Currently it won't tell you any info about why it fails, with the exception of arm licence issues. +# It also uses a lot of memory, so while there is a subroutine for doing multiple files, it's not used, and is out of date. +# Writing output to a file is hacked in, so it's not too pretty. + +use strict; +use XML::Simple; +use Data::Dumper; + +my @header = qw(line layer component name armlicence platform phase code bldinf mmp target source); + +main(); + + +sub main() +{ + my $filename = shift @ARGV; + my $output = shift @ARGV; + open(OUT,">$output") or die "Coudn't open $output\n"; + foreach my $key (@header) + { + print OUT $key.","; + } + print OUT "\n"; + + parsefile($filename); + close OUT; +} +sub scandir() +{ + my $path = shift @ARGV; + my @files = glob($path."/*compile.log"); + + foreach my $filename (@files) + { +# print $filename."\n"; + parsefile($filename); + } +} + +sub parsefile($filename) +{ + my $filename = shift; +# print "Scanning $filename\n"; + open(FILE,"<$filename") or die "Couldn't open filename\n"; + my $recipe; + my %attempts; + my %licenceattempts; + my $counter = 0; + my $licence = 0; + while( my $line = ) + { + ++$counter; + if($line =~ m/^/) + { + $recipe = XMLin($line.""); + $recipe->{'line'} = $counter; +# print Dumper($recipe); + } + elsif($line =~ m/<\/recipe>/) + { + if(defined $recipe) + { +# if($recipe->{'exit'} !~ m/ok/) + if($recipe->{'exit'} =~ m/failed/) + { +# if($recipe->{'target'} =~ m/\S:epoc32\//i) +# && $recipe->{'target'} !~ m/\S:epoc32\/build/i) + { + DumpRecipe($recipe); + + } + } + $recipe = undef; + } + } + elsif($line =~ m/Error:\sC3397E:\s/) #ARM Licence error code... + { + ++$licence; + if(defined $recipe) + { + $recipe->{'armlicence'} = 1; + } + } + elsif($line =~ m/()/) + { + my $status = XMLin($1); + if(defined $recipe) + { + $recipe->{'exit'} = $status->{'exit'}; + $recipe->{'attempt'} = $status->{'attempt'}; + if(defined $status->{'code'}) + { + $recipe->{'code'} = $status->{'code'}; + } + if(!defined $attempts{$status->{'attempt'}}) + { + $attempts{$status->{'attempt'}} = 0; + } + $attempts{$status->{'attempt'}} = $attempts{$status->{'attempt'}} + 1; + if(defined $recipe->{'armlicence'}) + { + if(!defined $licenceattempts{$status->{'attempt'}}) + { + $licenceattempts{$status->{'attempt'}} = 0; + } + $licenceattempts{$status->{'attempt'}} = $licenceattempts{$status->{'attempt'}} + 1; + } + } + } + } + close FILE; + print OUT "\n\nSummaries\n\n"; + foreach my $attempt (sort keys %attempts) + { + print OUT "Overall attempts: $attempt,".$attempts{$attempt}.",\n"; + } + foreach my $attempt (sort keys %licenceattempts) + { + print OUT "ARM Licence Fail attempts: $attempt,".$licenceattempts{$attempt}.",\n"; + } + print OUT "Total ARM Licence failures,$licence\n"; + + +} + +sub DumpRecipe($) +{ + my $recipe = shift; + foreach my $key (@header) + { + if(defined $recipe->{$key}) + { + print OUT $recipe->{$key}; + } + print OUT ","; + } + print OUT "\n"; + #print Dumper($recipe); + +}