| Index: fetch.py
|
| diff --git a/fetch.py b/fetch.py
|
| index c78dfe722b9ca060075b647d8c1624c364375c66..4bfc6cb54a45cfdfe2dc2e80c078beddf6635e0e 100755
|
| --- a/fetch.py
|
| +++ b/fetch.py
|
| @@ -19,6 +19,7 @@ These parameters will be passed through to the recipe's main method.
|
| """
|
|
|
| import json
|
| +import optparse
|
| import os
|
| import subprocess
|
| import sys
|
| @@ -29,7 +30,6 @@ from distutils import spawn
|
|
|
| SCRIPT_PATH = os.path.dirname(os.path.abspath(__file__))
|
|
|
| -
|
| #################################################
|
| # Checkout class definitions.
|
| #################################################
|
| @@ -43,9 +43,9 @@ class Checkout(object):
|
| |root|: the directory into which the checkout will be performed, as returned
|
| by the recipe. This is a relative path from |base|.
|
| """
|
| - def __init__(self, dryrun, spec, root):
|
| + def __init__(self, options, spec, root):
|
| self.base = os.getcwd()
|
| - self.dryrun = dryrun
|
| + self.options = options
|
| self.spec = spec
|
| self.root = root
|
|
|
| @@ -60,7 +60,7 @@ class Checkout(object):
|
|
|
| def run(self, cmd, **kwargs):
|
| print 'Running: %s' % (' '.join(pipes.quote(x) for x in cmd))
|
| - if self.dryrun:
|
| + if self.options.dryrun:
|
| return 0
|
| return subprocess.check_call(cmd, **kwargs)
|
|
|
| @@ -97,8 +97,8 @@ class SvnCheckout(Checkout):
|
|
|
| class GclientGitCheckout(GclientCheckout, GitCheckout):
|
|
|
| - def __init__(self, dryrun, spec, root):
|
| - super(GclientGitCheckout, self).__init__(dryrun, spec, root)
|
| + def __init__(self, options, spec, root):
|
| + super(GclientGitCheckout, self).__init__(options, spec, root)
|
| assert 'solutions' in self.spec
|
| keys = ['solutions', 'target_os', 'target_os_only']
|
| gclient_spec = '\n'.join('%s = %s' % (key, self.spec[key])
|
| @@ -114,11 +114,14 @@ class GclientGitCheckout(GclientCheckout, GitCheckout):
|
|
|
| # Configure and do the gclient checkout.
|
| self.run_gclient('config', '--spec', self.spec['gclient_spec'])
|
| - self.run_gclient('sync')
|
| + if self.options.nohooks:
|
| + self.run_gclient('sync', '--nohooks')
|
| + else:
|
| + self.run_gclient('sync')
|
|
|
| # Configure git.
|
| wd = os.path.join(self.base, self.root)
|
| - if self.dryrun:
|
| + if self.options.dryrun:
|
| print 'cd %s' % wd
|
| self.run_git(
|
| 'submodule', 'foreach',
|
| @@ -129,8 +132,8 @@ class GclientGitCheckout(GclientCheckout, GitCheckout):
|
|
|
| class GclientGitSvnCheckout(GclientGitCheckout, SvnCheckout):
|
|
|
| - def __init__(self, dryrun, spec, root):
|
| - super(GclientGitSvnCheckout, self).__init__(dryrun, spec, root)
|
| + def __init__(self, options, spec, root):
|
| + super(GclientGitSvnCheckout, self).__init__(options, spec, root)
|
| assert 'svn_url' in self.spec
|
| assert 'svn_branch' in self.spec
|
| assert 'svn_ref' in self.spec
|
| @@ -154,7 +157,7 @@ class GclientGitSvnCheckout(GclientGitCheckout, SvnCheckout):
|
| if real_path != self.root:
|
| real_path = os.path.join(self.root, real_path)
|
| wd = os.path.join(self.base, real_path)
|
| - if self.dryrun:
|
| + if self.options.dryrun:
|
| print 'cd %s' % wd
|
| self.run_git('svn', 'init', '--prefix=origin/', '-T',
|
| svn_spec['svn_branch'], svn_spec['svn_url'], cwd=wd)
|
| @@ -173,12 +176,12 @@ CHECKOUT_TYPE_MAP = {
|
| }
|
|
|
|
|
| -def CheckoutFactory(type_name, dryrun, spec, root):
|
| +def CheckoutFactory(type_name, options, spec, root):
|
| """Factory to build Checkout class instances."""
|
| class_ = CHECKOUT_TYPE_MAP.get(type_name)
|
| if not class_:
|
| raise KeyError('unrecognized checkout type: %s' % type_name)
|
| - return class_(dryrun, spec, root)
|
| + return class_(options, spec, root)
|
|
|
|
|
| #################################################
|
| @@ -191,7 +194,16 @@ def usage(msg=None):
|
|
|
| print (
|
| """
|
| -usage: %s [-n|--dry-run] <recipe> [--property=value [--property2=value2 ...]]
|
| +usage: %s [options] <recipe> [--property=value [--property2=value2 ...]]
|
| +
|
| +This script can be used to download the Chromium sources. See
|
| +http://www.chromium.org/developers/how-tos/get-the-code
|
| +for full usage instructions.
|
| +
|
| +Valid options:
|
| + -h, --help, help Print this message.
|
| + --nohooks Don't run hooks after checkout.
|
| + -n, --dryrun Don't run commands, only print them.
|
| """ % os.path.basename(sys.argv[0]))
|
| sys.exit(bool(msg))
|
|
|
| @@ -204,9 +216,18 @@ def handle_args(argv):
|
| usage()
|
|
|
| dryrun = False
|
| - if argv[1] in ('-n', '--dry-run'):
|
| - dryrun = True
|
| + nohooks = False
|
| + while len(argv) >= 2:
|
| + arg = argv[1]
|
| + if not arg.startswith('-'):
|
| + break
|
| argv.pop(1)
|
| + if arg in ('-n', '--dry-run'):
|
| + dryrun = True
|
| + elif arg == '--nohooks':
|
| + nohooks = True
|
| + else:
|
| + usage('Invalid option %s.' % arg)
|
|
|
| def looks_like_arg(arg):
|
| return arg.startswith('--') and arg.count('=') == 1
|
| @@ -217,7 +238,7 @@ def handle_args(argv):
|
|
|
| recipe = argv[1]
|
| props = argv[2:]
|
| - return dryrun, recipe, props
|
| + return optparse.Values({'dryrun':dryrun, 'nohooks':nohooks }), recipe, props
|
|
|
|
|
| def run_recipe_fetch(recipe, props, aliased=False):
|
| @@ -242,11 +263,11 @@ def run_recipe_fetch(recipe, props, aliased=False):
|
| return spec, root
|
|
|
|
|
| -def run(dryrun, spec, root):
|
| +def run(options, spec, root):
|
| """Perform a checkout with the given type and configuration.
|
|
|
| Args:
|
| - dryrun: if True, don't actually execute the commands
|
| + options: Options instance.
|
| spec: Checkout configuration returned by the the recipe's fetch_spec
|
| method (checkout type, repository url, etc.).
|
| root: The directory into which the repo expects to be checkout out.
|
| @@ -255,7 +276,7 @@ def run(dryrun, spec, root):
|
| checkout_type = spec['type']
|
| checkout_spec = spec['%s_spec' % checkout_type]
|
| try:
|
| - checkout = CheckoutFactory(checkout_type, dryrun, checkout_spec, root)
|
| + checkout = CheckoutFactory(checkout_type, options, checkout_spec, root)
|
| except KeyError:
|
| return 1
|
| if checkout.exists():
|
| @@ -269,9 +290,9 @@ def run(dryrun, spec, root):
|
|
|
|
|
| def main():
|
| - dryrun, recipe, props = handle_args(sys.argv)
|
| + options, recipe, props = handle_args(sys.argv)
|
| spec, root = run_recipe_fetch(recipe, props)
|
| - return run(dryrun, spec, root)
|
| + return run(options, spec, root)
|
|
|
|
|
| if __name__ == '__main__':
|
|
|