| 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(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 import xml.dom.minidom | 21 import xml.dom.minidom |
| 22 | 22 |
| 23 import print_style | 23 import print_style |
| 24 | 24 |
| 25 sys.path.insert(1, os.path.join(sys.path[0], '..', '..', 'python')) | 25 sys.path.insert(1, os.path.join(sys.path[0], '..', '..', 'python')) |
| 26 from google import path_utils | 26 from google import path_utils |
| 27 | 27 |
| 28 # Import the metrics/common module. | 28 # Import the metrics/common module. |
| 29 sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common')) | 29 sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common')) |
| 30 import diff_util | 30 import diff_util |
| 31 import presubmit_util |
| 31 | 32 |
| 32 # Tags whose children we want to alphabetize. The key is the parent tag name, | 33 # Tags whose children we want to alphabetize. The key is the parent tag name, |
| 33 # and the value is a pair of the tag name of the children we want to sort, | 34 # and the value is a pair of the tag name of the children we want to sort, |
| 34 # and a key function that maps each child node to the desired sort key. | 35 # and a key function that maps each child node to the desired sort key. |
| 35 ALPHABETIZATION_RULES = { | 36 ALPHABETIZATION_RULES = { |
| 36 'histograms': ('histogram', lambda n: n.attributes['name'].value.lower()), | 37 'histograms': ('histogram', lambda n: n.attributes['name'].value.lower()), |
| 37 'enums': ('enum', lambda n: n.attributes['name'].value.lower()), | 38 'enums': ('enum', lambda n: n.attributes['name'].value.lower()), |
| 38 'enum': ('int', lambda n: int(n.attributes['value'].value)), | 39 'enum': ('int', lambda n: int(n.attributes['value'].value)), |
| 39 'histogram_suffixes_list': ( | 40 'histogram_suffixes_list': ( |
| 40 'histogram_suffixes', lambda n: n.attributes['name'].value.lower()), | 41 'histogram_suffixes', lambda n: n.attributes['name'].value.lower()), |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 Args: | 124 Args: |
| 124 raw_xml: The contents of the histograms XML file, as a string. | 125 raw_xml: The contents of the histograms XML file, as a string. |
| 125 | 126 |
| 126 Returns: | 127 Returns: |
| 127 The pretty-printed version. | 128 The pretty-printed version. |
| 128 """ | 129 """ |
| 129 tree = xml.dom.minidom.parseString(raw_xml) | 130 tree = xml.dom.minidom.parseString(raw_xml) |
| 130 tree = TransformByAlphabetizing(tree) | 131 tree = TransformByAlphabetizing(tree) |
| 131 return print_style.GetPrintStyle().PrettyPrintNode(tree) | 132 return print_style.GetPrintStyle().PrettyPrintNode(tree) |
| 132 | 133 |
| 133 | |
| 134 def main(): | 134 def main(): |
| 135 logging.basicConfig(level=logging.INFO) | 135 presubmit_util.DoPresubmitMain(sys.argv, 'histograms.xml', |
| 136 | 136 'histograms.before.pretty-print.xml', |
| 137 presubmit = ('--presubmit' in sys.argv) | 137 'pretty_print.py', PrettyPrint) |
| 138 | |
| 139 histograms_filename = 'histograms.xml' | |
| 140 histograms_backup_filename = 'histograms.before.pretty-print.xml' | |
| 141 | |
| 142 # If there is a histograms.xml in the current working directory, use that. | |
| 143 # Otherwise, use the one residing in the same directory as this script. | |
| 144 histograms_dir = os.getcwd() | |
| 145 if not os.path.isfile(os.path.join(histograms_dir, histograms_filename)): | |
| 146 histograms_dir = path_utils.ScriptDir() | |
| 147 | |
| 148 histograms_pathname = os.path.join(histograms_dir, histograms_filename) | |
| 149 histograms_backup_pathname = os.path.join(histograms_dir, | |
| 150 histograms_backup_filename) | |
| 151 | |
| 152 logging.info('Loading %s...' % os.path.relpath(histograms_pathname)) | |
| 153 with open(histograms_pathname, 'rb') as f: | |
| 154 xml = f.read() | |
| 155 | |
| 156 # Check there are no CR ('\r') characters in the file. | |
| 157 if '\r' in xml: | |
| 158 logging.info('DOS-style line endings (CR characters) detected - these are ' | |
| 159 'not allowed. Please run dos2unix %s' % histograms_filename) | |
| 160 sys.exit(1) | |
| 161 | |
| 162 logging.info('Pretty-printing...') | |
| 163 try: | |
| 164 pretty = PrettyPrint(xml) | |
| 165 except Error: | |
| 166 logging.error('Aborting parsing due to fatal errors.') | |
| 167 sys.exit(1) | |
| 168 | |
| 169 if xml == pretty: | |
| 170 logging.info('%s is correctly pretty-printed.' % histograms_filename) | |
| 171 sys.exit(0) | |
| 172 if presubmit: | |
| 173 logging.info('%s is not formatted correctly; run pretty_print.py to fix.' % | |
| 174 histograms_filename) | |
| 175 sys.exit(1) | |
| 176 if not diff_util.PromptUserToAcceptDiff( | |
| 177 xml, pretty, | |
| 178 'Is the prettified version acceptable?'): | |
| 179 logging.error('Aborting') | |
| 180 return | |
| 181 | |
| 182 logging.info('Creating backup file %s' % histograms_backup_filename) | |
| 183 shutil.move(histograms_pathname, histograms_backup_pathname) | |
| 184 | |
| 185 logging.info('Writing new %s file' % histograms_filename) | |
| 186 with open(histograms_pathname, 'wb') as f: | |
| 187 f.write(pretty) | |
| 188 | |
| 189 | 138 |
| 190 if __name__ == '__main__': | 139 if __name__ == '__main__': |
| 191 main() | 140 main() |
| OLD | NEW |