switch to 4 space indent
Leave the recipes/ code at 2 space to match the rest of the recipes
project in other repos.
Reformatted using:
files=( $(
git ls-tree -r --name-only HEAD | \
grep -Ev -e '^(third_party|recipes)/' | \
grep '\.py$';
git grep -l '#!/usr/bin/env.*python' | grep -v '\.py$'
) )
parallel ./yapf -i -- "${files[@]}"
~/chromiumos/chromite/contrib/reflow_overlong_comments "${files[@]}"
The files that still had strings that were too long were manually
reformatted because they were easy and only a few issues.
autoninja.py
clang_format.py
download_from_google_storage.py
fix_encoding.py
gclient_utils.py
git_cache.py
git_common.py
git_map_branches.py
git_reparent_branch.py
gn.py
my_activity.py
owners_finder.py
presubmit_canned_checks.py
reclient_helper.py
reclientreport.py
roll_dep.py
rustfmt.py
siso.py
split_cl.py
subcommand.py
subprocess2.py
swift_format.py
upload_to_google_storage.py
These files still had lines (strings) that were too long, so the pylint
warnings were suppressed with a TODO.
auth.py
gclient.py
gclient_eval.py
gclient_paths.py
gclient_scm.py
gerrit_util.py
git_cl.py
presubmit_canned_checks.py
presubmit_support.py
scm.py
Change-Id: Ia6535c4f2c48d46b589ec1e791dde6c6b2ea858f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/4836379
Commit-Queue: Josip Sokcevic <sokcevic@chromium.org>
Auto-Submit: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Josip Sokcevic <sokcevic@chromium.org>
diff --git a/fetch.py b/fetch.py
index 80f8927..fcfdf78 100755
--- a/fetch.py
+++ b/fetch.py
@@ -2,7 +2,6 @@
# 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.
-
"""
Tool to perform checkouts in one easy command line!
@@ -31,14 +30,14 @@
from distutils import spawn
-
SCRIPT_PATH = os.path.dirname(os.path.abspath(__file__))
+
#################################################
# Checkout class definitions.
#################################################
class Checkout(object):
- """Base class for implementing different types of checkouts.
+ """Base class for implementing different types of checkouts.
Attributes:
|base|: the absolute path of the directory in which this script is run.
@@ -47,212 +46,230 @@
|root|: the directory into which the checkout will be performed, as returned
by the config. This is a relative path from |base|.
"""
- def __init__(self, options, spec, root):
- self.base = os.getcwd()
- self.options = options
- self.spec = spec
- self.root = root
+ def __init__(self, options, spec, root):
+ self.base = os.getcwd()
+ self.options = options
+ self.spec = spec
+ self.root = root
- def exists(self):
- """Check does this checkout already exist on desired location"""
+ def exists(self):
+ """Check does this checkout already exist on desired location"""
- def init(self):
- pass
+ def init(self):
+ pass
- def run(self, cmd, return_stdout=False, **kwargs):
- print('Running: %s' % (' '.join(pipes.quote(x) for x in cmd)))
- if self.options.dry_run:
- return ''
- if return_stdout:
- return subprocess.check_output(cmd, **kwargs).decode()
+ def run(self, cmd, return_stdout=False, **kwargs):
+ print('Running: %s' % (' '.join(pipes.quote(x) for x in cmd)))
+ if self.options.dry_run:
+ return ''
+ if return_stdout:
+ return subprocess.check_output(cmd, **kwargs).decode()
- try:
- subprocess.check_call(cmd, **kwargs)
- except subprocess.CalledProcessError as e:
- # If the subprocess failed, it likely emitted its own distress message
- # already - don't scroll that message off the screen with a stack trace
- # from this program as well. Emit a terse message and bail out here;
- # otherwise a later step will try doing more work and may hide the
- # subprocess message.
- print('Subprocess failed with return code %d.' % e.returncode)
- sys.exit(e.returncode)
- return ''
+ try:
+ subprocess.check_call(cmd, **kwargs)
+ except subprocess.CalledProcessError as e:
+ # If the subprocess failed, it likely emitted its own distress
+ # message already - don't scroll that message off the screen with a
+ # stack trace from this program as well. Emit a terse message and
+ # bail out here; otherwise a later step will try doing more work and
+ # may hide the subprocess message.
+ print('Subprocess failed with return code %d.' % e.returncode)
+ sys.exit(e.returncode)
+ return ''
class GclientCheckout(Checkout):
+ def run_gclient(self, *cmd, **kwargs):
+ if not spawn.find_executable('gclient'):
+ cmd_prefix = (sys.executable, os.path.join(SCRIPT_PATH,
+ 'gclient.py'))
+ else:
+ cmd_prefix = ('gclient', )
+ return self.run(cmd_prefix + cmd, **kwargs)
- def run_gclient(self, *cmd, **kwargs):
- if not spawn.find_executable('gclient'):
- cmd_prefix = (sys.executable, os.path.join(SCRIPT_PATH, 'gclient.py'))
- else:
- cmd_prefix = ('gclient',)
- return self.run(cmd_prefix + cmd, **kwargs)
-
- def exists(self):
- try:
- gclient_root = self.run_gclient('root', return_stdout=True).strip()
- return (os.path.exists(os.path.join(gclient_root, '.gclient')) or
- os.path.exists(os.path.join(os.getcwd(), self.root, '.git')))
- except subprocess.CalledProcessError:
- pass
- return os.path.exists(os.path.join(os.getcwd(), self.root))
+ def exists(self):
+ try:
+ gclient_root = self.run_gclient('root', return_stdout=True).strip()
+ return (os.path.exists(os.path.join(gclient_root, '.gclient'))
+ or os.path.exists(
+ os.path.join(os.getcwd(), self.root, '.git')))
+ except subprocess.CalledProcessError:
+ pass
+ return os.path.exists(os.path.join(os.getcwd(), self.root))
class GitCheckout(Checkout):
-
- def run_git(self, *cmd, **kwargs):
- print('Running: git %s' % (' '.join(pipes.quote(x) for x in cmd)))
- if self.options.dry_run:
- return ''
- return git_common.run(*cmd, **kwargs)
+ def run_git(self, *cmd, **kwargs):
+ print('Running: git %s' % (' '.join(pipes.quote(x) for x in cmd)))
+ if self.options.dry_run:
+ return ''
+ return git_common.run(*cmd, **kwargs)
class GclientGitCheckout(GclientCheckout, GitCheckout):
+ def __init__(self, options, spec, root):
+ super(GclientGitCheckout, self).__init__(options, spec, root)
+ assert 'solutions' in self.spec
- def __init__(self, options, spec, root):
- super(GclientGitCheckout, self).__init__(options, spec, root)
- assert 'solutions' in self.spec
+ def _format_spec(self):
+ def _format_literal(lit):
+ if isinstance(lit, str):
+ return '"%s"' % lit
+ if isinstance(lit, list):
+ return '[%s]' % ', '.join(_format_literal(i) for i in lit)
+ return '%r' % lit
- def _format_spec(self):
- def _format_literal(lit):
- if isinstance(lit, str):
- return '"%s"' % lit
- if isinstance(lit, list):
- return '[%s]' % ', '.join(_format_literal(i) for i in lit)
- return '%r' % lit
- soln_strings = []
- for soln in self.spec['solutions']:
- soln_string = '\n'.join(' "%s": %s,' % (key, _format_literal(value))
- for key, value in soln.items())
- soln_strings.append(' {\n%s\n },' % soln_string)
- gclient_spec = 'solutions = [\n%s\n]\n' % '\n'.join(soln_strings)
- extra_keys = ['target_os', 'target_os_only', 'cache_dir']
- gclient_spec += ''.join('%s = %s\n' % (key, _format_literal(self.spec[key]))
- for key in extra_keys if key in self.spec)
- return gclient_spec
+ soln_strings = []
+ for soln in self.spec['solutions']:
+ soln_string = '\n'.join(' "%s": %s,' %
+ (key, _format_literal(value))
+ for key, value in soln.items())
+ soln_strings.append(' {\n%s\n },' % soln_string)
+ gclient_spec = 'solutions = [\n%s\n]\n' % '\n'.join(soln_strings)
+ extra_keys = ['target_os', 'target_os_only', 'cache_dir']
+ gclient_spec += ''.join('%s = %s\n' %
+ (key, _format_literal(self.spec[key]))
+ for key in extra_keys if key in self.spec)
+ return gclient_spec
- def init(self):
- # Configure and do the gclient checkout.
- self.run_gclient('config', '--spec', self._format_spec())
- sync_cmd = ['sync']
- if self.options.nohooks:
- sync_cmd.append('--nohooks')
- if self.options.nohistory:
- sync_cmd.append('--no-history')
- if self.spec.get('with_branch_heads', False):
- sync_cmd.append('--with_branch_heads')
- self.run_gclient(*sync_cmd)
+ def init(self):
+ # Configure and do the gclient checkout.
+ self.run_gclient('config', '--spec', self._format_spec())
+ sync_cmd = ['sync']
+ if self.options.nohooks:
+ sync_cmd.append('--nohooks')
+ if self.options.nohistory:
+ sync_cmd.append('--no-history')
+ if self.spec.get('with_branch_heads', False):
+ sync_cmd.append('--with_branch_heads')
+ self.run_gclient(*sync_cmd)
- # Configure git.
- wd = os.path.join(self.base, self.root)
- if self.options.dry_run:
- print('cd %s' % wd)
- self.run_git(
- 'submodule', 'foreach',
- 'git config -f $toplevel/.git/config submodule.$name.ignore all',
- cwd=wd)
- if not self.options.nohistory:
- self.run_git(
- 'config', '--add', 'remote.origin.fetch',
- '+refs/tags/*:refs/tags/*', cwd=wd)
- self.run_git('config', 'diff.ignoreSubmodules', 'dirty', cwd=wd)
+ # Configure git.
+ wd = os.path.join(self.base, self.root)
+ if self.options.dry_run:
+ print('cd %s' % wd)
+ self.run_git(
+ 'submodule',
+ 'foreach',
+ 'git config -f $toplevel/.git/config submodule.$name.ignore all',
+ cwd=wd)
+ if not self.options.nohistory:
+ self.run_git('config',
+ '--add',
+ 'remote.origin.fetch',
+ '+refs/tags/*:refs/tags/*',
+ cwd=wd)
+ self.run_git('config', 'diff.ignoreSubmodules', 'dirty', cwd=wd)
CHECKOUT_TYPE_MAP = {
- 'gclient': GclientCheckout,
- 'gclient_git': GclientGitCheckout,
- 'git': GitCheckout,
+ 'gclient': GclientCheckout,
+ 'gclient_git': GclientGitCheckout,
+ 'git': GitCheckout,
}
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_(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_(options, spec, root)
+
def handle_args(argv):
- """Gets the config name from the command line arguments."""
+ """Gets the config name from the command line arguments."""
- configs_dir = os.path.join(SCRIPT_PATH, 'fetch_configs')
- configs = [f[:-3] for f in os.listdir(configs_dir) if f.endswith('.py')]
- configs.sort()
+ configs_dir = os.path.join(SCRIPT_PATH, 'fetch_configs')
+ configs = [f[:-3] for f in os.listdir(configs_dir) if f.endswith('.py')]
+ configs.sort()
- parser = argparse.ArgumentParser(
- formatter_class=argparse.RawDescriptionHelpFormatter,
- description='''
+ parser = argparse.ArgumentParser(
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ description='''
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.''',
- epilog='Valid fetch configs:\n' + \
- '\n'.join(map(lambda s: ' ' + s, configs))
- )
+ epilog='Valid fetch configs:\n' + \
+ '\n'.join(map(lambda s: ' ' + s, configs))
+ )
- parser.add_argument('-n', '--dry-run', action='store_true', default=False,
- help='Don\'t run commands, only print them.')
- parser.add_argument('--nohooks',
- '--no-hooks',
- action='store_true',
- default=False,
- help='Don\'t run hooks after checkout.')
- parser.add_argument(
- '--nohistory',
- '--no-history',
- action='store_true',
- default=False,
- help='Perform shallow clones, don\'t fetch the full git history.')
- parser.add_argument('--force', action='store_true', default=False,
- help='(dangerous) Don\'t look for existing .gclient file.')
- parser.add_argument(
- '-p',
- '--protocol-override',
- type=str,
- default=None,
- help='Protocol to use to fetch dependencies, defaults to https.')
+ parser.add_argument('-n',
+ '--dry-run',
+ action='store_true',
+ default=False,
+ help='Don\'t run commands, only print them.')
+ parser.add_argument('--nohooks',
+ '--no-hooks',
+ action='store_true',
+ default=False,
+ help='Don\'t run hooks after checkout.')
+ parser.add_argument(
+ '--nohistory',
+ '--no-history',
+ action='store_true',
+ default=False,
+ help='Perform shallow clones, don\'t fetch the full git history.')
+ parser.add_argument(
+ '--force',
+ action='store_true',
+ default=False,
+ help='(dangerous) Don\'t look for existing .gclient file.')
+ parser.add_argument(
+ '-p',
+ '--protocol-override',
+ type=str,
+ default=None,
+ help='Protocol to use to fetch dependencies, defaults to https.')
- parser.add_argument('config', type=str,
- help="Project to fetch, e.g. chromium.")
- parser.add_argument('props', metavar='props', type=str,
- nargs=argparse.REMAINDER, default=[])
+ parser.add_argument('config',
+ type=str,
+ help="Project to fetch, e.g. chromium.")
+ parser.add_argument('props',
+ metavar='props',
+ type=str,
+ nargs=argparse.REMAINDER,
+ default=[])
- args = parser.parse_args(argv[1:])
+ args = parser.parse_args(argv[1:])
- # props passed to config must be of the format --<name>=<value>
- looks_like_arg = lambda arg: arg.startswith('--') and arg.count('=') == 1
- bad_param = [x for x in args.props if not looks_like_arg(x)]
- if bad_param:
- print('Error: Got bad arguments %s' % bad_param)
- parser.print_help()
- sys.exit(1)
+ # props passed to config must be of the format --<name>=<value>
+ looks_like_arg = lambda arg: arg.startswith('--') and arg.count('=') == 1
+ bad_param = [x for x in args.props if not looks_like_arg(x)]
+ if bad_param:
+ print('Error: Got bad arguments %s' % bad_param)
+ parser.print_help()
+ sys.exit(1)
- return args
+ return args
+
def run_config_fetch(config, props, aliased=False):
- """Invoke a config's fetch method with the passed-through args
+ """Invoke a config's fetch method with the passed-through args
and return its json output as a python object."""
- config_path = os.path.abspath(
- os.path.join(SCRIPT_PATH, 'fetch_configs', config))
- if not os.path.exists(config_path + '.py'):
- print("Could not find a config for %s" % config)
- sys.exit(1)
+ config_path = os.path.abspath(
+ os.path.join(SCRIPT_PATH, 'fetch_configs', config))
+ if not os.path.exists(config_path + '.py'):
+ print("Could not find a config for %s" % config)
+ sys.exit(1)
- cmd = [sys.executable, config_path + '.py', 'fetch'] + props
- result = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
+ cmd = [sys.executable, config_path + '.py', 'fetch'] + props
+ result = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
- spec = json.loads(result.decode("utf-8"))
- if 'alias' in spec:
- assert not aliased
- return run_config_fetch(
- spec['alias']['config'], spec['alias']['props'] + props, aliased=True)
- cmd = [sys.executable, config_path + '.py', 'root']
- result = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
- root = json.loads(result.decode("utf-8"))
- return spec, root
+ spec = json.loads(result.decode("utf-8"))
+ if 'alias' in spec:
+ assert not aliased
+ return run_config_fetch(spec['alias']['config'],
+ spec['alias']['props'] + props,
+ aliased=True)
+ cmd = [sys.executable, config_path + '.py', 'root']
+ result = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
+ root = json.loads(result.decode("utf-8"))
+ return 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:
options: Options instance.
@@ -260,45 +277,48 @@
method (checkout type, repository url, etc.).
root: The directory into which the repo expects to be checkout out.
"""
- assert 'type' in spec
- checkout_type = spec['type']
- checkout_spec = spec['%s_spec' % checkout_type]
+ assert 'type' in spec
+ checkout_type = spec['type']
+ checkout_spec = spec['%s_spec' % checkout_type]
- # Use sso:// by default if the env is cog
- if not options.protocol_override and \
- (any(os.getcwd().startswith(x) for x in [
- '/google/src/cloud', '/google/cog/cloud'])):
- options.protocol_override = 'sso'
+ # Use sso:// by default if the env is cog
+ if not options.protocol_override and \
+ (any(os.getcwd().startswith(x) for x in [
+ '/google/src/cloud', '/google/cog/cloud'])):
+ options.protocol_override = 'sso'
- # Update solutions with protocol_override field
- if options.protocol_override is not None:
- for solution in checkout_spec['solutions']:
- solution['protocol_override'] = options.protocol_override
+ # Update solutions with protocol_override field
+ if options.protocol_override is not None:
+ for solution in checkout_spec['solutions']:
+ solution['protocol_override'] = options.protocol_override
- try:
- checkout = CheckoutFactory(checkout_type, options, checkout_spec, root)
- except KeyError:
- return 1
- if not options.force and checkout.exists():
- print('Your current directory appears to already contain, or be part of, ')
- print('a checkout. "fetch" is used only to get new checkouts. Use ')
- print('"gclient sync" to update existing checkouts.')
- print()
- print('Fetch also does not yet deal with partial checkouts, so if fetch')
- print('failed, delete the checkout and start over (crbug.com/230691).')
- return 1
- return checkout.init()
+ try:
+ checkout = CheckoutFactory(checkout_type, options, checkout_spec, root)
+ except KeyError:
+ return 1
+ if not options.force and checkout.exists():
+ print(
+ 'Your current directory appears to already contain, or be part of, '
+ )
+ print('a checkout. "fetch" is used only to get new checkouts. Use ')
+ print('"gclient sync" to update existing checkouts.')
+ print()
+ print(
+ 'Fetch also does not yet deal with partial checkouts, so if fetch')
+ print('failed, delete the checkout and start over (crbug.com/230691).')
+ return 1
+ return checkout.init()
def main():
- args = handle_args(sys.argv)
- spec, root = run_config_fetch(args.config, args.props)
- return run(args, spec, root)
+ args = handle_args(sys.argv)
+ spec, root = run_config_fetch(args.config, args.props)
+ return run(args, spec, root)
if __name__ == '__main__':
- try:
- sys.exit(main())
- except KeyboardInterrupt:
- sys.stderr.write('interrupted\n')
- sys.exit(1)
+ try:
+ sys.exit(main())
+ except KeyboardInterrupt:
+ sys.stderr.write('interrupted\n')
+ sys.exit(1)