Commit 3596d585 authored by digit@chromium.org's avatar digit@chromium.org

fetch.py: Add '--nohooks' option.

'fetch chromium' will fail if the build dependencies are not already installed
on the host machine, because it runs 'gclient sync' which, by default, will run
hooks that will try to run build/gyp_chromium (which will then fail).

This introduces a --nohooks option that solve the problem by allowing the
user to do the following:

  1) fetch --nohooks <recipe>
  2) src/build/install-build-deps.sh
  3) fetch <recipe>

BUG=325795
TEST=Run 'fetch --nohooks chromium' in a temporary 'clean' chroot directory.
R=maruel@chromium.org,jochen@chromium.org,scottmg@chromium.org,agable@chromium.org

Review URL: https://codereview.chromium.org/106403003

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@240680 0039d316-1c4b-4281-b951-d872f2087c98
parent 0ee42a68
......@@ -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__':
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment