| # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """This module holds utilities which make writing configs easier.""" |
| |
| import json |
| |
| |
| class Config(object): |
| """Base class for all configs. |
| |
| Provides methods that are expected to be overridden by child classes. Also |
| provides an command-line parsing method that converts the unified command-line |
| interface used in depot_tools to the unified python interface defined here.""" |
| |
| @staticmethod |
| def fetch_spec(_props): |
| """Returns instructions to check out the project, conditioned on |props|.""" |
| raise NotImplementedError |
| |
| @staticmethod |
| def expected_root(_props): |
| """Returns the directory into which the checkout will be performed.""" |
| raise NotImplementedError |
| |
| def handle_args(self, argv): |
| """Passes the command-line arguments through to the appropriate method.""" |
| methods = {'fetch': self.fetch_spec, |
| 'root': self.expected_root} |
| if len(argv) <= 1 or argv[1] not in methods: |
| print 'Must specify a a fetch/root action' |
| return 1 |
| |
| def looks_like_arg(arg): |
| return arg.startswith('--') and arg.count('=') == 1 |
| |
| bad_parms = [x for x in argv[2:] if not looks_like_arg(x)] |
| if bad_parms: |
| print 'Got bad arguments %s' % bad_parms |
| return 1 |
| |
| method = methods[argv[1]] |
| props = dict(x.split('=', 1) for x in (y.lstrip('-') for y in argv[2:])) |
| |
| self.output(method(props)) |
| |
| @staticmethod |
| def output(data): |
| print(json.dumps(data)) |