13
|
1 |
#
|
|
2 |
# Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
|
|
3 |
# All rights reserved.
|
|
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 |
# Nokia Corporation - initial contribution.
|
|
11 |
#
|
|
12 |
# Contributors:
|
|
13 |
#
|
|
14 |
# Description:
|
|
15 |
# Filter class for doing --what and --check operations
|
|
16 |
#
|
|
17 |
|
|
18 |
import os
|
|
19 |
import sys
|
|
20 |
import re
|
|
21 |
import filter_interface
|
|
22 |
|
|
23 |
class FilterWhat(filter_interface.Filter):
|
|
24 |
|
|
25 |
def __init__(self):
|
|
26 |
super(filter_interface.Filter,self).__init__()
|
|
27 |
self.path_prefix_to_strip = None
|
|
28 |
self.path_prefix_to_add_on = None
|
|
29 |
self.check = False
|
|
30 |
|
|
31 |
def print_file(self, line, start, end):
|
|
32 |
"Ensure DOS slashes on Windows"
|
|
33 |
|
|
34 |
"""Use chars between enclosing tags ("<>", "''", etc)
|
|
35 |
start = opening tag, so the line we need
|
|
36 |
actually starts at 'start + 1' """
|
|
37 |
|
|
38 |
abs_filename = line[(start + 1):end]
|
|
39 |
filename = abs_filename
|
|
40 |
|
|
41 |
# Adjust drive letters for case insensitivity on windows
|
|
42 |
|
|
43 |
path_prefix_to_strip = self.path_prefix_to_strip
|
|
44 |
if "win" in self.buildparameters.platform:
|
|
45 |
filename = filename[0].upper()+filename[1:]
|
|
46 |
filename = filename.replace("/","\\")
|
|
47 |
|
|
48 |
if path_prefix_to_strip:
|
|
49 |
if "win" in self.buildparameters.platform:
|
|
50 |
path_prefix_to_strip = path_prefix_to_strip[0].upper()+path_prefix_to_strip[1:].replace("/","\\")
|
|
51 |
if filename.startswith(path_prefix_to_strip):
|
|
52 |
filename = filename[len(path_prefix_to_strip):]
|
|
53 |
if self.path_prefix_to_add_on != None:
|
|
54 |
filename = self.path_prefix_to_add_on + filename
|
|
55 |
|
|
56 |
if self.check:
|
|
57 |
if not os.path.isfile(abs_filename):
|
|
58 |
print "MISSING:", filename
|
|
59 |
self.ok = False
|
|
60 |
else:
|
|
61 |
self.outfile.write(filename+"\n")
|
|
62 |
|
|
63 |
self.prints += 1
|
|
64 |
|
|
65 |
def start_bldinf(self, bldinf):
|
|
66 |
pass
|
|
67 |
|
|
68 |
def end_bldinf(self):
|
|
69 |
pass
|
|
70 |
|
|
71 |
|
|
72 |
def open(self, build_parameters):
|
|
73 |
"initialise"
|
|
74 |
|
|
75 |
|
|
76 |
self.buildparameters = build_parameters
|
|
77 |
if build_parameters.doCheck:
|
|
78 |
self.check = True
|
|
79 |
self.what = build_parameters.doWhat
|
|
80 |
|
|
81 |
self.outfile = sys.stdout
|
|
82 |
self.outfile_close = False
|
|
83 |
|
|
84 |
if "FILTERWHAT_FILE" in os.environ:
|
|
85 |
try:
|
|
86 |
self.outfile = open(os.environ['FILTERWHAT_FILE'],"w+")
|
|
87 |
self.outfile_close = True
|
|
88 |
except Exception,e:
|
|
89 |
raise Exception("The 'What Filter' could not open the output file specified in the FILTER_WHAT environment variable: " + os.environ['FILTERWHAT_FILE'])
|
|
90 |
|
|
91 |
# repetitions is for tracking repeated lines in the output log
|
|
92 |
# when --check and --what are called
|
|
93 |
self.repetitions = {}
|
|
94 |
|
|
95 |
"Regex for old what output"
|
|
96 |
if "win" in self.buildparameters.platform:
|
|
97 |
self.regex = re.compile("^[a-zA-Z]:\S+$")
|
|
98 |
else:
|
|
99 |
self.regex = re.compile("^/\S+$")
|
|
100 |
|
|
101 |
"Regex for targets"
|
|
102 |
self.target_regex = re.compile("^<(build|stringtable|resource|bitmap)>.*")
|
|
103 |
|
|
104 |
"Regex for exports"
|
|
105 |
self.export_regex = re.compile("^<export destination.*")
|
|
106 |
|
|
107 |
"Regex for zip exports"
|
|
108 |
self.zip_export_regex = re.compile("^<member>.*")
|
|
109 |
|
|
110 |
"Regex for determining bld.inf name"
|
|
111 |
self.whatlog_regex = re.compile("^<whatlog *bldinf='(?P<bldinf>[^']*)'.*")
|
|
112 |
self.current_bldinf = ''
|
|
113 |
|
|
114 |
self.prints = 0
|
|
115 |
self.ok = True
|
|
116 |
return self.ok
|
|
117 |
|
|
118 |
def write(self, text):
|
|
119 |
"process some log text"
|
|
120 |
|
|
121 |
for line in text.splitlines():
|
|
122 |
line = line.rstrip()
|
|
123 |
|
|
124 |
# we are normally the ONLY filter running so we have to pass on
|
|
125 |
# any errors and warnings that emerge
|
|
126 |
#
|
|
127 |
if line.startswith("<error"):
|
|
128 |
sys.stderr.write(self.formatError(line))
|
|
129 |
self.ok = False
|
|
130 |
continue
|
|
131 |
if line.startswith("<warning"):
|
|
132 |
sys.stderr.write(self.formatWarning(line))
|
|
133 |
continue
|
|
134 |
|
|
135 |
if not line in self.repetitions:
|
|
136 |
self.repetitions[line] = 0
|
|
137 |
|
|
138 |
if self.repetitions[line] == 0:
|
|
139 |
|
|
140 |
if self.regex.match(line) and (self.what or self.check):
|
|
141 |
"Print the whole line"
|
|
142 |
self.print_file(line, (-1), len(line))
|
|
143 |
|
|
144 |
if self.target_regex.match(line):
|
|
145 |
"Grab the filename between <build> and </build>"
|
|
146 |
start = line.find(">")
|
|
147 |
end = line.rfind("<")
|
|
148 |
|
|
149 |
self.print_file(line, start, end)
|
|
150 |
|
|
151 |
elif self.export_regex.match(line):
|
|
152 |
"Grab the filename between the first set of '' chars"
|
|
153 |
start = line.find("'")
|
|
154 |
end = line.find("'", (start + 1))
|
|
155 |
|
|
156 |
self.print_file(line, start, end)
|
|
157 |
|
|
158 |
elif self.zip_export_regex.match(line):
|
|
159 |
"Grab the filename between <member> and </member>"
|
|
160 |
start = line.find(">")
|
|
161 |
end = line.rfind("<")
|
|
162 |
|
|
163 |
self.print_file(line, start, end)
|
|
164 |
|
|
165 |
"work out what the 'current' bldinf file is"
|
|
166 |
m = self.whatlog_regex.match(line)
|
|
167 |
if m:
|
|
168 |
bi = m.groupdict()['bldinf']
|
|
169 |
if self.current_bldinf != bi:
|
|
170 |
if self.current_bldinf != '':
|
|
171 |
self.end_bldinf()
|
|
172 |
self.current_bldinf = bi
|
|
173 |
if bi != '':
|
|
174 |
self.start_bldinf(bi)
|
|
175 |
|
|
176 |
|
|
177 |
|
|
178 |
self.repetitions[line] += 1
|
|
179 |
|
|
180 |
return self.ok
|
|
181 |
|
|
182 |
def summary(self):
|
|
183 |
if self.prints == 0:
|
|
184 |
if self.what:
|
|
185 |
message = "no WHAT information found"
|
|
186 |
else:
|
|
187 |
message = "no CHECK information found"
|
|
188 |
|
|
189 |
sys.stderr.write(self.formatError(message))
|
|
190 |
self.ok = False
|
|
191 |
return self.ok
|
|
192 |
|
|
193 |
def close(self):
|
|
194 |
if self.outfile_close:
|
|
195 |
self.outfile.close()
|
|
196 |
return self.ok
|
|
197 |
|
|
198 |
|