| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2011 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 """Access the commit queue from the command line. | 6 """Access the commit queue from the command line. |
| 7 """ | 7 """ |
| 8 | 8 |
| 9 __version__ = '0.1' | 9 __version__ = '0.1' |
| 10 | 10 |
| 11 import functools | 11 import functools |
| 12 import json | 12 import json |
| 13 import logging | 13 import logging |
| 14 import optparse | 14 import optparse |
| 15 import os | 15 import os |
| 16 import sys | 16 import sys |
| 17 import urllib2 | 17 import urllib2 |
| 18 | 18 |
| 19 import breakpad # pylint: disable=W0611 | 19 import breakpad # pylint: disable=W0611 |
| 20 | 20 |
| 21 import auth | 21 import auth |
| 22 import fix_encoding | 22 import fix_encoding |
| 23 import rietveld | 23 import rietveld |
| 24 | 24 |
| 25 THIRD_PARTY_DIR = os.path.join(os.path.dirname(__file__), 'third_party') | 25 THIRD_PARTY_DIR = os.path.join(os.path.dirname(__file__), 'third_party') |
| 26 sys.path.insert(0, THIRD_PARTY_DIR) | 26 sys.path.insert(0, THIRD_PARTY_DIR) |
| 27 | 27 |
| 28 from cq_client import cq_pb2 | 28 from cq_client import cq_pb2 |
| 29 from cq_client import validate_config | |
| 30 from protobuf26 import text_format | 29 from protobuf26 import text_format |
| 31 | 30 |
| 32 def usage(more): | 31 def usage(more): |
| 33 def hook(fn): | 32 def hook(fn): |
| 34 fn.func_usage_more = more | 33 fn.func_usage_more = more |
| 35 return fn | 34 return fn |
| 36 return hook | 35 return hook |
| 37 | 36 |
| 38 | 37 |
| 39 def need_issue(fn): | 38 def need_issue(fn): |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 ' '.join(args)) | 180 ' '.join(args)) |
| 182 print json.dumps(get_master_builder_map( | 181 print json.dumps(get_master_builder_map( |
| 183 args[0], | 182 args[0], |
| 184 include_experimental=options.include_experimental, | 183 include_experimental=options.include_experimental, |
| 185 include_triggered=options.include_triggered)) | 184 include_triggered=options.include_triggered)) |
| 186 | 185 |
| 187 CMDbuilders.func_usage_more = '<path-to-cq-config>' | 186 CMDbuilders.func_usage_more = '<path-to-cq-config>' |
| 188 | 187 |
| 189 | 188 |
| 190 def CMDvalidate(parser, args): | 189 def CMDvalidate(parser, args): |
| 191 """Validates a CQ config. | 190 """Validates a CQ config, returns 0 on valid config. |
| 192 | 191 |
| 193 Takes a single argument - path to the CQ config to be validated. Returns 0 on | 192 BUGS: this doesn't do semantic validation, only verifies validity of protobuf. |
| 194 valid config, non-zero on invalid config. Errors and warnings are printed to | 193 But don't worry - bad cq.cfg won't cause outages, luci-config service will |
| 195 screen. | 194 not accept them, will send warning email, and continue using previous |
| 195 version. |
| 196 """ | 196 """ |
| 197 _, args = parser.parse_args(args) | 197 _, args = parser.parse_args(args) |
| 198 if len(args) != 1: | 198 if len(args) != 1: |
| 199 parser.error('Expected a single path to CQ config. Got: %s' % | 199 parser.error('Expected a single path to CQ config. Got: %s' % |
| 200 ' '.join(args)) | 200 ' '.join(args)) |
| 201 | 201 |
| 202 with open(args[0]) as config_file: | 202 config = cq_pb2.Config() |
| 203 cq_config = config_file.read() | 203 try: |
| 204 return 0 if validate_config.IsValid(cq_config) else 1 | 204 with open(args[0]) as config_file: |
| 205 text_config = config_file.read() |
| 206 text_format.Merge(text_config, config) |
| 207 # TODO(tandrii): provide an option to actually validate semantics of CQ |
| 208 # config. |
| 209 return 0 |
| 210 except text_format.ParseError as e: |
| 211 print 'failed to parse cq.cfg: %s' % e |
| 212 return 1 |
| 213 |
| 205 | 214 |
| 206 CMDvalidate.func_usage_more = '<path-to-cq-config>' | 215 CMDvalidate.func_usage_more = '<path-to-cq-config>' |
| 207 | 216 |
| 208 ############################################################################### | 217 ############################################################################### |
| 209 ## Boilerplate code | 218 ## Boilerplate code |
| 210 | 219 |
| 211 | 220 |
| 212 class OptionParser(optparse.OptionParser): | 221 class OptionParser(optparse.OptionParser): |
| 213 """An OptionParser instance with default options. | 222 """An OptionParser instance with default options. |
| 214 | 223 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 return CMDhelp(parser, args) | 294 return CMDhelp(parser, args) |
| 286 | 295 |
| 287 | 296 |
| 288 if __name__ == "__main__": | 297 if __name__ == "__main__": |
| 289 fix_encoding.fix_encoding() | 298 fix_encoding.fix_encoding() |
| 290 try: | 299 try: |
| 291 sys.exit(main()) | 300 sys.exit(main()) |
| 292 except KeyboardInterrupt: | 301 except KeyboardInterrupt: |
| 293 sys.stderr.write('interrupted\n') | 302 sys.stderr.write('interrupted\n') |
| 294 sys.exit(1) | 303 sys.exit(1) |
| OLD | NEW |