common/tools/analysis/find_collisions.pl
author MattD <mattd@symbian.org>
Thu, 30 Jul 2009 12:29:27 +0100
changeset 288 58affcc6c40e
parent 230 75af1c9cfd87
permissions -rw-r--r--
Yarp.pl - Added manual XML parsing. Memory leaks using XML::Simple cause perl to run out of memory when parsing a large raptor log.

#!/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:
#
# Description:
# Adds info form a file to a CSV

use strict;

main();

sub main()
{
  my $csvfile = shift @ARGV;

  if(! -e $csvfile)
  {
    die "cannot find $csvfile\n";
  }

  open(CSV,"<$csvfile") or die "Couldn't open $csvfile\n";
  my $header = <CSV>;
  $header =~ s/\n//;
  print RESULTS $header.",status\n";
  my @fields = split(',',$header);
  my $targetindex = 0;
  my $counter = 0;
  my $bldinfindex = 0;
  my $makefileindex = 0;
  my $typeindex = 0;
  my $extindex = 0;
  my %failed;
  my %bldinffiles;
  
  my %targets;
  
  foreach my $column (@fields)
  {
      if($column =~ m/target/)
      {
          $targetindex = $counter;
      }
      elsif($column =~ m/bldinf/)
      {
        $bldinfindex = $counter;
      }
      elsif($column =~ m/makefile/)
      {
        $makefileindex = $counter;
      }
      elsif($column =~ m/type/)
      {
        $typeindex = $counter;
      }
      elsif($column =~ m/extension/)
      {
        $extindex = $counter;
      }
      ++$counter;
  }
#        print "\ntarget:$targetindex\tbuildinf:$bldinfindex\n";
    #header
  my $resultsfile = $csvfile."_collisions.csv"; 
  open(RESULTS, ">$resultsfile") or die "Coudn't open $resultsfile";
  
  print RESULTS "Collision,target,extension,type,source1,source2\n";
  while(my $line = <CSV>)
      {
      $line =~ s/\n//;
      @fields = split(',',$line);
      my $target = $fields[$targetindex];
      $target = lc($target);
      my $makefile = $fields[$makefileindex];
      my $bldinf =   $fields[$bldinfindex];
                
      if(defined $targets{$target})
        {
          my $currentmakefile = $targets{$target};
          if($makefile eq "")
          {
            $makefile = $bldinf;
          }
          if (!($currentmakefile eq $makefile))
            {
            my $type = $fields[$typeindex]; #DODGY - smoe custom makefiles also clash with export headers...
            my $ext = $fields[$extindex];
            my $collision = "-";
            if($type eq "export")
            {
              $collision = diffcollision($target,$currentmakefile,$makefile);
            }   
            print RESULTS "$collision,$target,$ext,$type,$currentmakefile,$makefile\n";
            }
        }
      else
        {
          if($makefile eq "")
          {
             $targets{$target} = $bldinf;
          }
          else
          {
            $targets{$target} = $makefile;
          }  
        }      
      }
  close RESULTS;    
  close CSV;
}

sub diffcollision($$$)
{
  my $target = shift;
  my $left = shift;
  my $right = shift;
  
  $target =~ s/\//\\/g;
  $left  =~ s/\//\\/g;
  $right =~ s/\//\\/g;  
  my $ret = "unknown";
  if(!-e $target)
  {
    $ret = "missing";
  }
  else
  {
    if(-e $left && -e $right)
    {
      my $leftdiff = 1;
      my $rightdiff = 1;
      open(DIFF,"fc $left $target|") or die "couldn't execute fc";
      print "fc $left $target\n";
      
      while(my $line = <DIFF>)
      {
        
        if($line =~ m/FC:\sno\sdifferences\sencountered/i)
        {
          $leftdiff = 0;
        }
        print "\t$line";
      }
      close DIFF;

      open(DIFF,"fc $right $target|") or die "couldn't execute fc";
      print "fc $right $target\n";
      while( my $line = <DIFF>)
      {
        if($line =~ m/FC:\sno\sdifferences\sencountered/i)
        {
          $rightdiff = 0;
        }
        print "\t$line";
      }
      close DIFF;

     if($leftdiff && !$rightdiff )
        {$ret = "match right";}
     elsif($rightdiff && !$leftdiff)
        {$ret = "match left";}
     elsif($rightdiff && $leftdiff)
        {$ret = "match neither";}
     elsif(!$rightdiff && !$leftdiff)
        {$ret = "match both";}                  
    }
  
    
  }
  return $ret; 
}