| 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__':
 | 
| 
 |