OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Pretty-prints the histograms.xml file, alphabetizing tags, wrapping text | 6 """Pretty-prints the histograms.xml file, alphabetizing tags, wrapping text |
7 at 80 chars, enforcing standard attribute ordering, and standardizing | 7 at 80 chars, enforcing standard attribute ordering, and standardizing |
8 indentation. | 8 indentation. |
9 | 9 |
10 This is quite a bit more complicated than just calling tree.toprettyxml(); | 10 This is quite a bit more complicated than just calling tree.toprettyxml(); |
11 we need additional customization, like special attribute ordering in tags | 11 we need additional customization, like special attribute ordering in tags |
12 and wrapping text nodes, so we implement our own full custom XML pretty-printer. | 12 and wrapping text nodes, so we implement our own full custom XML pretty-printer. |
13 """ | 13 """ |
14 | 14 |
15 from __future__ import with_statement | 15 from __future__ import with_statement |
16 | 16 |
17 import diffutil | 17 import diffutil |
18 import json | 18 import json |
19 import logging | 19 import logging |
20 import os | |
20 import shutil | 21 import shutil |
21 import sys | 22 import sys |
22 import textwrap | 23 import textwrap |
23 import xml.dom.minidom | 24 import xml.dom.minidom |
24 | 25 |
26 sys.path.insert(1, os.path.join(sys.path[0], '..', '..', 'python')) | |
Ilya Sherman
2013/12/27 21:48:05
Hmm, I hadn't noticed that this was needed to supp
| |
27 from google import path_utils | |
25 | 28 |
26 WRAP_COLUMN = 80 | 29 WRAP_COLUMN = 80 |
27 | 30 |
28 # Desired order for tag attributes; attributes listed here will appear first, | 31 # Desired order for tag attributes; attributes listed here will appear first, |
29 # and in the same order as in these lists. | 32 # and in the same order as in these lists. |
30 # { tag_name: [attribute_name, ...] } | 33 # { tag_name: [attribute_name, ...] } |
31 ATTRIBUTE_ORDER = { | 34 ATTRIBUTE_ORDER = { |
32 'enum': ['name', 'type'], | 35 'enum': ['name', 'type'], |
33 'histogram': ['name', 'enum', 'units'], | 36 'histogram': ['name', 'enum', 'units'], |
34 'int': ['value', 'label'], | 37 'int': ['value', 'label'], |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
309 tree = xml.dom.minidom.parseString(raw_xml) | 312 tree = xml.dom.minidom.parseString(raw_xml) |
310 tree = TransformByAlphabetizing(tree) | 313 tree = TransformByAlphabetizing(tree) |
311 return PrettyPrintNode(tree) | 314 return PrettyPrintNode(tree) |
312 | 315 |
313 | 316 |
314 def main(): | 317 def main(): |
315 logging.basicConfig(level=logging.INFO) | 318 logging.basicConfig(level=logging.INFO) |
316 | 319 |
317 presubmit = ('--presubmit' in sys.argv) | 320 presubmit = ('--presubmit' in sys.argv) |
318 | 321 |
322 script_dir = path_utils.ScriptDir() | |
323 | |
319 logging.info('Loading histograms.xml...') | 324 logging.info('Loading histograms.xml...') |
320 with open('histograms.xml', 'rb') as f: | 325 with open(os.path.join(script_dir, 'histograms.xml'), 'rb') as f: |
321 xml = f.read() | 326 xml = f.read() |
322 | 327 |
323 # Check there are no CR ('\r') characters in the file. | 328 # Check there are no CR ('\r') characters in the file. |
324 if '\r' in xml: | 329 if '\r' in xml: |
325 logging.info('DOS-style line endings (CR characters) detected - these are ' | 330 logging.info('DOS-style line endings (CR characters) detected - these are ' |
326 'not allowed. Please run dos2unix histograms.xml') | 331 'not allowed. Please run dos2unix histograms.xml') |
327 sys.exit(1) | 332 sys.exit(1) |
328 | 333 |
329 logging.info('Pretty-printing...') | 334 logging.info('Pretty-printing...') |
330 try: | 335 try: |
331 pretty = PrettyPrint(xml) | 336 pretty = PrettyPrint(xml) |
332 except Error: | 337 except Error: |
333 logging.error('Aborting parsing due to fatal errors.') | 338 logging.error('Aborting parsing due to fatal errors.') |
334 sys.exit(1) | 339 sys.exit(1) |
335 | 340 |
336 if xml == pretty: | 341 if xml == pretty: |
337 logging.info('histograms.xml is correctly pretty-printed.') | 342 logging.info('histograms.xml is correctly pretty-printed.') |
338 sys.exit(0) | 343 sys.exit(0) |
339 if presubmit: | 344 if presubmit: |
340 logging.info('histograms.xml is not formatted correctly; run ' | 345 logging.info('histograms.xml is not formatted correctly; run ' |
341 'pretty_print.py to fix.') | 346 'pretty_print.py to fix.') |
342 sys.exit(1) | 347 sys.exit(1) |
343 if not diffutil.PromptUserToAcceptDiff( | 348 if not diffutil.PromptUserToAcceptDiff( |
344 xml, pretty, | 349 xml, pretty, |
345 'Is the prettified version acceptable?'): | 350 'Is the prettified version acceptable?'): |
346 logging.error('Aborting') | 351 logging.error('Aborting') |
347 return | 352 return |
348 | 353 |
349 logging.info('Creating backup file histograms.before.pretty-print.xml') | 354 logging.info('Creating backup file histograms.before.pretty-print.xml') |
350 shutil.move('histograms.xml', 'histograms.before.pretty-print.xml') | 355 shutil.move(os.path.join(script_dir, 'histograms.xml'), |
356 os.path.join(script_dir, 'histograms.before.pretty-print.xml')) | |
Ilya Sherman
2013/12/27 21:48:05
nit: Please declare named constants for the file n
gavinp
2014/01/06 17:36:07
Done. I did this with automatic variables though i
Ilya Sherman
2014/01/06 23:22:36
This is fine, thanks.
| |
351 | 357 |
352 logging.info('Writing new histograms.xml file') | 358 logging.info('Writing new histograms.xml file') |
353 with open('histograms.xml', 'wb') as f: | 359 with open(os.path.join(script_dir, 'histograms.xml'), 'wb') as f: |
354 f.write(pretty) | 360 f.write(pretty) |
355 | 361 |
356 | 362 |
357 if __name__ == '__main__': | 363 if __name__ == '__main__': |
358 main() | 364 main() |
OLD | NEW |