Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(482)

Side by Side Diff: build/android/gyp/generate_v14_compatible_resources.py

Issue 661433005: Clearer error message when parsing Android XML resource fails. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # 2 #
3 # Copyright 2013 The Chromium Authors. All rights reserved. 3 # Copyright 2013 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be 4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file. 5 # found in the LICENSE file.
6 6
7 """Convert Android xml resources to API 14 compatible. 7 """Convert Android xml resources to API 14 compatible.
8 8
9 There are two reasons that we cannot just use API 17 attributes, 9 There are two reasons that we cannot just use API 17 attributes,
10 so we are generating another set of resources by this script. 10 so we are generating another set of resources by this script.
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 def IterateXmlElements(node): 58 def IterateXmlElements(node):
59 """minidom helper function that iterates all the element nodes. 59 """minidom helper function that iterates all the element nodes.
60 Iteration order is pre-order depth-first.""" 60 Iteration order is pre-order depth-first."""
61 if node.nodeType == node.ELEMENT_NODE: 61 if node.nodeType == node.ELEMENT_NODE:
62 yield node 62 yield node
63 for child_node in node.childNodes: 63 for child_node in node.childNodes:
64 for child_node_element in IterateXmlElements(child_node): 64 for child_node_element in IterateXmlElements(child_node):
65 yield child_node_element 65 yield child_node_element
66 66
67 67
68 def ParseAndReportErrors(filename):
69 try:
70 return minidom.parse(filename)
71 except Exception:
72 import traceback
73 traceback.print_exc()
Kibeom Kim (inactive) 2014/10/30 07:07:39 Just a question: it looks this is a common practic
Kibeom Kim (inactive) 2014/10/30 07:10:44 Though, having the most important message at the l
74 sys.stderr.write('Failed to parse XML file: %s\n' % filename)
75 sys.exit(1)
76
77
68 def AssertNotDeprecatedAttribute(name, value, filename): 78 def AssertNotDeprecatedAttribute(name, value, filename):
69 """Raises an exception if the given attribute is deprecated.""" 79 """Raises an exception if the given attribute is deprecated."""
70 msg = None 80 msg = None
71 if name in ATTRIBUTES_TO_MAP_REVERSED: 81 if name in ATTRIBUTES_TO_MAP_REVERSED:
72 msg = '{0} should use {1} instead of {2}'.format(filename, 82 msg = '{0} should use {1} instead of {2}'.format(filename,
73 ATTRIBUTES_TO_MAP_REVERSED[name], name) 83 ATTRIBUTES_TO_MAP_REVERSED[name], name)
74 elif name in GRAVITY_ATTRIBUTES and ('left' in value or 'right' in value): 84 elif name in GRAVITY_ATTRIBUTES and ('left' in value or 'right' in value):
75 msg = '{0} should use start/end instead of left/right for {1}'.format( 85 msg = '{0} should use start/end instead of left/right for {1}'.format(
76 filename, name) 86 filename, name)
77 87
(...skipping 15 matching lines...) Expand all
93 def HasStyleResource(dom): 103 def HasStyleResource(dom):
94 """Return True if the dom is a style resource, False otherwise.""" 104 """Return True if the dom is a style resource, False otherwise."""
95 root_node = IterateXmlElements(dom).next() 105 root_node = IterateXmlElements(dom).next()
96 return bool(root_node.nodeName == 'resources' and 106 return bool(root_node.nodeName == 'resources' and
97 list(root_node.getElementsByTagName('style'))) 107 list(root_node.getElementsByTagName('style')))
98 108
99 109
100 def ErrorIfStyleResourceExistsInDir(input_dir): 110 def ErrorIfStyleResourceExistsInDir(input_dir):
101 """If a style resource is in input_dir, raises an exception.""" 111 """If a style resource is in input_dir, raises an exception."""
102 for input_filename in build_utils.FindInDirectory(input_dir, '*.xml'): 112 for input_filename in build_utils.FindInDirectory(input_dir, '*.xml'):
103 dom = minidom.parse(input_filename) 113 dom = ParseAndReportErrors(input_filename)
104 if HasStyleResource(dom): 114 if HasStyleResource(dom):
105 raise Exception('error: style file ' + input_filename + 115 raise Exception('error: style file ' + input_filename +
106 ' should be under ' + input_dir + 116 ' should be under ' + input_dir +
107 '-v17 directory. Please refer to ' 117 '-v17 directory. Please refer to '
108 'http://crbug.com/243952 for the details.') 118 'http://crbug.com/243952 for the details.')
109 119
110 120
111 def GenerateV14LayoutResourceDom(dom, filename, assert_not_deprecated=True): 121 def GenerateV14LayoutResourceDom(dom, filename, assert_not_deprecated=True):
112 """Convert layout resource to API 14 compatible layout resource. 122 """Convert layout resource to API 14 compatible layout resource.
113 123
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 def GenerateV14LayoutResource(input_filename, output_v14_filename, 180 def GenerateV14LayoutResource(input_filename, output_v14_filename,
171 output_v17_filename): 181 output_v17_filename):
172 """Convert API 17 layout resource to API 14 compatible layout resource. 182 """Convert API 17 layout resource to API 14 compatible layout resource.
173 183
174 It's mostly a simple replacement, s/Start/Left s/End/Right, 184 It's mostly a simple replacement, s/Start/Left s/End/Right,
175 on the attribute names. 185 on the attribute names.
176 If the generated resource is identical to the original resource, 186 If the generated resource is identical to the original resource,
177 don't do anything. If not, write the generated resource to 187 don't do anything. If not, write the generated resource to
178 output_v14_filename, and copy the original resource to output_v17_filename. 188 output_v14_filename, and copy the original resource to output_v17_filename.
179 """ 189 """
180 dom = minidom.parse(input_filename) 190 dom = ParseAndReportErrors(input_filename)
181 is_modified = GenerateV14LayoutResourceDom(dom, input_filename) 191 is_modified = GenerateV14LayoutResourceDom(dom, input_filename)
182 192
183 if is_modified: 193 if is_modified:
184 # Write the generated resource. 194 # Write the generated resource.
185 WriteDomToFile(dom, output_v14_filename) 195 WriteDomToFile(dom, output_v14_filename)
186 196
187 # Copy the original resource. 197 # Copy the original resource.
188 build_utils.MakeDirectory(os.path.dirname(output_v17_filename)) 198 build_utils.MakeDirectory(os.path.dirname(output_v17_filename))
189 shutil.copy2(input_filename, output_v17_filename) 199 shutil.copy2(input_filename, output_v17_filename)
190 200
191 201
192 def GenerateV14StyleResource(input_filename, output_v14_filename): 202 def GenerateV14StyleResource(input_filename, output_v14_filename):
193 """Convert API 17 style resources to API 14 compatible style resource. 203 """Convert API 17 style resources to API 14 compatible style resource.
194 204
195 Write the generated style resource to output_v14_filename. 205 Write the generated style resource to output_v14_filename.
196 It's mostly a simple replacement, s/Start/Left s/End/Right, 206 It's mostly a simple replacement, s/Start/Left s/End/Right,
197 on the attribute names. 207 on the attribute names.
198 """ 208 """
199 dom = minidom.parse(input_filename) 209 dom = ParseAndReportErrors(input_filename)
200 GenerateV14StyleResourceDom(dom, input_filename) 210 GenerateV14StyleResourceDom(dom, input_filename)
201 211
202 # Write the generated resource. 212 # Write the generated resource.
203 WriteDomToFile(dom, output_v14_filename) 213 WriteDomToFile(dom, output_v14_filename)
204 214
205 215
206 def GenerateV14LayoutResourcesInDir(input_dir, output_v14_dir, output_v17_dir): 216 def GenerateV14LayoutResourcesInDir(input_dir, output_v14_dir, output_v17_dir):
207 """Convert layout resources to API 14 compatible resources in input_dir.""" 217 """Convert layout resources to API 14 compatible resources in input_dir."""
208 for input_filename in build_utils.FindInDirectory(input_dir, '*.xml'): 218 for input_filename in build_utils.FindInDirectory(input_dir, '*.xml'):
209 rel_filename = os.path.relpath(input_filename, input_dir) 219 rel_filename = os.path.relpath(input_filename, input_dir)
(...skipping 14 matching lines...) Expand all
224 def VerifyV14ResourcesInDir(input_dir, resource_type): 234 def VerifyV14ResourcesInDir(input_dir, resource_type):
225 """Verify that the resources in input_dir is compatible with v14, i.e., they 235 """Verify that the resources in input_dir is compatible with v14, i.e., they
226 don't use attributes that cause crashes on certain devices. Print an error if 236 don't use attributes that cause crashes on certain devices. Print an error if
227 they have.""" 237 they have."""
228 for input_filename in build_utils.FindInDirectory(input_dir, '*.xml'): 238 for input_filename in build_utils.FindInDirectory(input_dir, '*.xml'):
229 exception_message = ('error : ' + input_filename + ' has an RTL attribute, ' 239 exception_message = ('error : ' + input_filename + ' has an RTL attribute, '
230 'i.e., attribute that has "start" or "end" in its name.' 240 'i.e., attribute that has "start" or "end" in its name.'
231 ' Pre-v17 resources should not include it because it ' 241 ' Pre-v17 resources should not include it because it '
232 'can cause crashes on certain devices. Please refer to ' 242 'can cause crashes on certain devices. Please refer to '
233 'http://crbug.com/243952 for the details.') 243 'http://crbug.com/243952 for the details.')
234 dom = minidom.parse(input_filename) 244 dom = ParseAndReportErrors(input_filename)
235 if resource_type in ('layout', 'xml'): 245 if resource_type in ('layout', 'xml'):
236 if GenerateV14LayoutResourceDom(dom, input_filename, False): 246 if GenerateV14LayoutResourceDom(dom, input_filename, False):
237 raise Exception(exception_message) 247 raise Exception(exception_message)
238 elif resource_type == 'values': 248 elif resource_type == 'values':
239 if GenerateV14StyleResourceDom(dom, input_filename, False): 249 if GenerateV14StyleResourceDom(dom, input_filename, False):
240 raise Exception(exception_message) 250 raise Exception(exception_message)
241 251
242 252
243 def AssertNoDeprecatedAttributesInDir(input_dir, resource_type): 253 def AssertNoDeprecatedAttributesInDir(input_dir, resource_type):
244 """Raises an exception if resources in input_dir have deprecated attributes, 254 """Raises an exception if resources in input_dir have deprecated attributes,
245 e.g., paddingLeft, paddingRight""" 255 e.g., paddingLeft, paddingRight"""
246 for input_filename in build_utils.FindInDirectory(input_dir, '*.xml'): 256 for input_filename in build_utils.FindInDirectory(input_dir, '*.xml'):
247 dom = minidom.parse(input_filename) 257 dom = ParseAndReportErrors(input_filename)
248 if resource_type in ('layout', 'xml'): 258 if resource_type in ('layout', 'xml'):
249 GenerateV14LayoutResourceDom(dom, input_filename) 259 GenerateV14LayoutResourceDom(dom, input_filename)
250 elif resource_type == 'values': 260 elif resource_type == 'values':
251 GenerateV14StyleResourceDom(dom, input_filename) 261 GenerateV14StyleResourceDom(dom, input_filename)
252 262
253 263
254 def ParseArgs(): 264 def ParseArgs():
255 """Parses command line options. 265 """Parses command line options.
256 266
257 Returns: 267 Returns:
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 build_utils.MakeDirectory(res_v14_dir) 350 build_utils.MakeDirectory(res_v14_dir)
341 351
342 GenerateV14Resources(options.res_dir, res_v14_dir, options.verify_only) 352 GenerateV14Resources(options.res_dir, res_v14_dir, options.verify_only)
343 353
344 if options.stamp: 354 if options.stamp:
345 build_utils.Touch(options.stamp) 355 build_utils.Touch(options.stamp)
346 356
347 if __name__ == '__main__': 357 if __name__ == '__main__':
348 sys.exit(main()) 358 sys.exit(main())
349 359
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698