common/tools/bc_filter.pl
changeset 910 e460b00fdc7b
equal deleted inserted replaced
909:869f7b50a6f1 910:e460b00fdc7b
       
     1 #!/usr/bin/perl
       
     2 
       
     3 # Copyright (c) 2009 Symbian Foundation Ltd
       
     4 # This component and the accompanying materials are made available
       
     5 # under the terms of the License "Eclipse Public License v1.0"
       
     6 # which accompanies this distribution, and is available
       
     7 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 #
       
     9 # Initial Contributors:
       
    10 # Symbian Foundation Ltd - initial contribution.
       
    11 #	Maciej Seroka, maciejs@symbian.org
       
    12 #
       
    13 # Description:
       
    14 #   This is a tool for filtering static BC header reports.
       
    15 #
       
    16 
       
    17 use strict;
       
    18 use XML::Simple;
       
    19 use File::Copy;
       
    20 use Tie::File;
       
    21 use Data::Dumper;
       
    22 
       
    23 my $report;
       
    24 my $header_list;
       
    25 my $destfile = "stripped_headers_report.xml";
       
    26 my $del_ok_issues = 1; # This variable determines whether to delete OK issues first.
       
    27 my $del_comp_issues = 0; # This variable determies whether to delete Compilation errors.
       
    28 my $del_boost_issues = 1; # This variable determies whether to delete issues for Boost API headers.
       
    29 
       
    30 my $n;
       
    31 my $m;
       
    32 my $file_name;
       
    33 my $delete_node;
       
    34 
       
    35 if ($ARGV[1]) {
       
    36 	$report = $ARGV[0];
       
    37 	$header_list = $ARGV[1];
       
    38 } else { 
       
    39 	die "Missing parameter(s). For example: bc_filter.pl headers_report.xml public_headers.txt"; 
       
    40 }
       
    41 
       
    42 # Parse the input XML into hashrefs.
       
    43 print "Parsing " . $report . "... ";
       
    44 my $current_report = XMLin("./$report", keeproot => 1,
       
    45     forcearray => [ 'header', 'baselineversion', 'currentversion', 'timestamp', 'day', 'month', 'year', 'hour', 'minute', 'second', #
       
    46 	'haversion', 'formatversion', 'cmdlineparms', 'parm', 'pname', 'pvalue', 'knownissuesversion', 'os', 'version', 'buildweek', 'issuelist',#
       
    47 	'headerfile', 'filename', 'comparefilename', 'status', 'comment', 'issue', 'checksum', 'shortname', 'issueid', 'typeid', 'identityid', #
       
    48 	'identitydescription', 'typestring', 'cause', 'documentation', 'ignoreinformation', 'linenumber', 'severity', 'scseverity'], keyattr => [] );
       
    49 print "complete \n";
       
    50 
       
    51 # Load Public API definitions
       
    52 my @lines;
       
    53 tie @lines, 'Tie::File', $header_list or die ("Cannot tie file \"$header_list\". $!\n");
       
    54 
       
    55 # Get number of header files
       
    56 my $header_num = @{$current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}};
       
    57 print "Number of all header files with issues: $header_num \n";
       
    58 
       
    59 # Delete known issues.
       
    60 if ($del_ok_issues) {
       
    61 	$n = 0;
       
    62 	while ($n < $header_num) {
       
    63 		$file_name = $current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}->[$n]->{'shortname'}->[0];
       
    64 		# Delete the node if known issue.
       
    65 		if ($current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}->[$n]->{'status'}->[0] eq "OK") {
       
    66 			print "Known issue: $file_name ...deleted\n";
       
    67 			splice(@{$current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}},$n, 1);
       
    68 			$header_num--;
       
    69 		} else {
       
    70 #			print "Unknown issue: $file_name \n";
       
    71 			$n++;
       
    72 		}
       
    73 	}
       
    74 	# Get number of header files again
       
    75 	$header_num = @{$current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}};
       
    76 	print "Number of remaining header files with issues: $header_num \n";
       
    77 }
       
    78 
       
    79 # Delete compilation issues.
       
    80 # Assumption: Compilation issue is always the top issue (and probably the only one)
       
    81 if ($del_comp_issues) {
       
    82 	$n = 0;
       
    83 	while ($n < $header_num) {
       
    84 		$file_name = $current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}->[$n]->{'shortname'}->[0];
       
    85 		if (($current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}->[$n]->{'issue'}->[0]->{'typestring'}->[0] eq "has compilation errors") && #
       
    86 			($current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}->[$n]->{'status'}->[0] ne "OK")) { # Delete the node if compilation error.
       
    87 			print "$file_name has compilation errors \n";
       
    88 			splice(@{$current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}},$n, 1);
       
    89 			$header_num--;
       
    90 		} else {
       
    91 			$n++;
       
    92 		}
       
    93 	}
       
    94 	# Get number of header files again
       
    95 	$header_num = @{$current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}};
       
    96 	print "Number of header files with non-compilation issues: $header_num \n";
       
    97 }
       
    98 
       
    99 # Delete Boost API related issues (Boost API headers are not present in any of the Public SDK!).
       
   100 if ($del_boost_issues) {
       
   101 	$n = 0;
       
   102 	while ($n < $header_num) {
       
   103 		$file_name = $current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}->[$n]->{'shortname'}->[0];
       
   104 		# Delete the node if Boost API header.
       
   105 		if ($file_name =~ m/\\boost/) {
       
   106 			print "Boost API: $file_name \n";
       
   107 			splice(@{$current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}},$n, 1);
       
   108 			$header_num--;
       
   109 		} else {
       
   110 			$n++;
       
   111 		}
       
   112 	}
       
   113 	# Get number of header files again
       
   114 	$header_num = @{$current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}};
       
   115 	print "Number of non-Boost API header files: $header_num \n";
       
   116 }
       
   117 
       
   118 # Delete non-public API issues.
       
   119 $n = 0;
       
   120 while ($n < $header_num) {
       
   121 	$file_name = $current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}->[$n]->{'shortname'}->[0];
       
   122 	$m = 0;
       
   123 	$delete_node = 1;
       
   124 	foreach (@lines) { # Check against header list.
       
   125 		if (lc($file_name) eq lc(@lines[$m])) {	# Mark the node to NOT be deleted.
       
   126 			$delete_node = 0;
       
   127 			last;
       
   128 		}
       
   129 		$m++;
       
   130 	}
       
   131 	# Delete the node if non-public issue.
       
   132 	if ($delete_node) {
       
   133 		print "Header file: $file_name not found in Public API definition file... deleted\n";
       
   134 		splice(@{$current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}},$n, 1);
       
   135 		$header_num--;
       
   136 	} else {
       
   137 		$n++;
       
   138 	}
       
   139 }
       
   140 
       
   141 # Get number of header files again
       
   142 $header_num = @{$current_report->{'bbcresults'}->{'issuelist'}->[0]->{'headerfile'}};
       
   143 print "Final number of header files with issues: $header_num \n";
       
   144 
       
   145 # Close Public API definition file.
       
   146 untie @lines;
       
   147 
       
   148 # Write new XML to dest file.
       
   149 open OUT,">$destfile" or die("Cannot open file \"$destfile\" for writing. $!\n");
       
   150 print OUT XMLout($current_report, keeproot => 1);
       
   151 close OUT;
       
   152 
       
   153 # Insert:	<?xml version="1.0" encoding="ASCII" standalone="no" ?>
       
   154 #			<?xml-stylesheet type="text/xsl" href="BBCResults.xsl"?>
       
   155 tie @lines, 'Tie::File', $destfile or die ("Cannot tie file \"$destfile\". $!\n");
       
   156 unshift @lines, "<?xml-stylesheet type=\"text/xsl\" href=\"BBCResults.xsl\"?>";
       
   157 unshift @lines, "<?xml version=\"1.0\" encoding=\"ASCII\" standalone=\"no\" ?>";
       
   158 untie @lines;