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