|
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; |