| Index: trychange.py
|
| diff --git a/trychange.py b/trychange.py
|
| index 2389bb0939e76edefc071d54251922de33a213f9..8ea8df198d4b181faddfa0f1eba9490677b9efe1 100755
|
| --- a/trychange.py
|
| +++ b/trychange.py
|
| @@ -19,12 +19,13 @@ import sys
|
| import tempfile
|
| import urllib
|
|
|
| -import breakpad
|
| +try:
|
| + import breakpad
|
| +except ImportError:
|
| + pass
|
|
|
| -import gcl
|
| import gclient_utils
|
| import scm
|
| -import presubmit_support
|
|
|
| __version__ = '1.2'
|
|
|
| @@ -65,38 +66,6 @@ class NoTryServerAccess(Exception):
|
| return self.args[0] + '\n' + HELP_STRING
|
|
|
|
|
| -def GetTryServerSettings():
|
| - """Grab try server settings local to the repository."""
|
| - def _SafeResolve(host):
|
| - try:
|
| - return socket.getaddrinfo(host, None)
|
| - except socket.gaierror:
|
| - return None
|
| -
|
| - settings = {}
|
| - settings['http_port'] = gcl.GetCodeReviewSetting('TRYSERVER_HTTP_PORT')
|
| - settings['http_host'] = gcl.GetCodeReviewSetting('TRYSERVER_HTTP_HOST')
|
| - settings['svn_repo'] = gcl.GetCodeReviewSetting('TRYSERVER_SVN_URL')
|
| - settings['default_project'] = gcl.GetCodeReviewSetting('TRYSERVER_PROJECT')
|
| - settings['default_root'] = gcl.GetCodeReviewSetting('TRYSERVER_ROOT')
|
| -
|
| - # Pick a patchlevel, default to 0.
|
| - default_patchlevel = gcl.GetCodeReviewSetting('TRYSERVER_PATCHLEVEL')
|
| - if default_patchlevel:
|
| - default_patchlevel = int(default_patchlevel)
|
| - else:
|
| - default_patchlevel = 0
|
| - settings['default_patchlevel'] = default_patchlevel
|
| -
|
| - # Use http is the http_host name resolve, fallback to svn otherwise.
|
| - if (settings['http_port'] and settings['http_host'] and
|
| - _SafeResolve(settings['http_host'])):
|
| - settings['default_transport'] = 'http'
|
| - elif settings.get('svn_repo'):
|
| - settings['default_transport'] = 'svn'
|
| - return settings
|
| -
|
| -
|
| def EscapeDot(name):
|
| return name.replace('.', '-')
|
|
|
| @@ -143,6 +112,17 @@ class SVN(SCM):
|
| """Return the path of the repository root."""
|
| return self.checkout_root
|
|
|
| + def GetBots(self):
|
| + try:
|
| + import gcl
|
| + return gcl.GetCachedFile('PRESUBMIT.py', use_root=True)
|
| + except ImportError:
|
| + try:
|
| + return gclient_utils.FileRead(os.path.join(self.checkout_root,
|
| + 'PRESUBMIT.py'))
|
| + except OSError:
|
| + return None
|
| +
|
|
|
| class GIT(SCM):
|
| """Gathers the options and diff for a git checkout."""
|
| @@ -184,6 +164,13 @@ class GIT(SCM):
|
| """Return the path of the repository root."""
|
| return self.checkout_root
|
|
|
| + def GetBots(self):
|
| + try:
|
| + return gclient_utils.FileRead(os.path.join(self.checkout_root,
|
| + 'PRESUBMIT.py'))
|
| + except OSError:
|
| + return None
|
| +
|
|
|
| def _ParseSendChangeOptions(options):
|
| """Parse common options passed to _SendChangeHTTP and _SendChangeSVN."""
|
| @@ -270,7 +257,7 @@ def _SendChangeSVN(options):
|
| command = ['svn', 'checkout', '--depth', 'empty', '-q',
|
| options.svn_repo, temp_dir]
|
| if options.email:
|
| - command += ['--username', options.email]
|
| + command.extend(['--username', options.email])
|
| gclient_utils.CheckCall(command)
|
|
|
| # TODO(maruel): Use a subdirectory per user?
|
| @@ -281,7 +268,7 @@ def _SendChangeSVN(options):
|
| full_url = options.svn_repo + '/' + file_name
|
| file_found = False
|
| try:
|
| - gclient_utils.CheckCall(['svn', 'ls', full_url])
|
| + gclient_utils.CheckCall(['svn', 'ls', full_url], print_error=False)
|
| file_found = True
|
| except gclient_utils.CheckCallError:
|
| pass
|
| @@ -289,20 +276,17 @@ def _SendChangeSVN(options):
|
| # The file already exists in the repo. Note that commiting a file is a
|
| # no-op if the file's content (the diff) is not modified. This is why
|
| # the file name contains the date and time.
|
| - gclient_utils.CheckCall(['svn', 'update', full_path])
|
| - f = open(full_path, 'wb')
|
| - f.write(options.diff)
|
| - f.close()
|
| + gclient_utils.CheckCall(['svn', 'update', full_path],
|
| + print_error=False)
|
| + gclient_utils.FileWrite(full_path, options.diff, 'wb')
|
| else:
|
| - # Add the file to the repo
|
| - f = open(full_path, 'wb')
|
| - f.write(options.diff)
|
| - f.close()
|
| - gclient_utils.CheckCall(["svn", "add", full_path])
|
| + # Add the file to the repo.
|
| + gclient_utils.FileWrite(full_path, options.diff, 'wb')
|
| + gclient_utils.CheckCall(["svn", "add", full_path], print_error=False)
|
| temp_file.write(description)
|
| temp_file.flush()
|
| gclient_utils.CheckCall(["svn", "commit", full_path, '--file',
|
| - temp_file.name])
|
| + temp_file.name], print_error=False)
|
| except gclient_utils.CheckCallError, e:
|
| raise NoTryServerAccess(' '.join(e.command) + '\nOuput:\n' +
|
| e.stdout)
|
| @@ -353,11 +337,6 @@ def TryChange(argv,
|
| file_list: Default value to pass to --file.
|
| swallow_exception: Whether we raise or swallow exceptions.
|
| """
|
| - default_settings = GetTryServerSettings()
|
| - transport_functions = { 'http': _SendChangeHTTP, 'svn': _SendChangeSVN }
|
| - default_transport = transport_functions.get(
|
| - default_settings.get('default_transport'))
|
| -
|
| # Parse argv
|
| parser = optparse.OptionParser(usage=USAGE,
|
| version=__version__,
|
| @@ -397,9 +376,8 @@ def TryChange(argv,
|
| # "'release'"
|
| group.add_option("--target", help=optparse.SUPPRESS_HELP)
|
|
|
| - # TODO(bradnelson): help="Override which project to use"
|
| - group.add_option("--project", help=optparse.SUPPRESS_HELP,
|
| - default=default_settings['default_project'])
|
| + group.add_option("--project",
|
| + help="Override which project to use")
|
|
|
| # Override the list of tests to run, use multiple times to list many tests
|
| # (or comma separated)
|
| @@ -418,11 +396,9 @@ def TryChange(argv,
|
| help="Url where to grab a patch")
|
| group.add_option("--root",
|
| help="Root to use for the patch; base subdirectory for "
|
| - "patch created in a subdirectory",
|
| - default=default_settings["default_root"])
|
| + "patch created in a subdirectory")
|
| group.add_option("--patchlevel", type='int', metavar="LEVEL",
|
| - help="Used as -pN parameter to patch",
|
| - default=default_settings["default_patchlevel"])
|
| + help="Used as -pN parameter to patch")
|
| parser.add_option_group(group)
|
|
|
| group = optparse.OptionGroup(parser, "Access the try server by HTTP")
|
| @@ -430,13 +406,10 @@ def TryChange(argv,
|
| action="store_const",
|
| const=_SendChangeHTTP,
|
| dest="send_patch",
|
| - default=default_transport,
|
| help="Use HTTP to talk to the try server [default]")
|
| group.add_option("--host",
|
| - default=default_settings['http_host'],
|
| help="Host address")
|
| group.add_option("--port",
|
| - default=default_settings['http_port'],
|
| help="HTTP port")
|
| group.add_option("--proxy",
|
| help="HTTP proxy")
|
| @@ -450,7 +423,6 @@ def TryChange(argv,
|
| help="Use SVN to talk to the try server")
|
| group.add_option("--svn_repo",
|
| metavar="SVN_URL",
|
| - default=default_settings['svn_repo'],
|
| help="SVN url to use to write the changes in; --use_svn is "
|
| "implied when using --svn_repo")
|
| parser.add_option_group(group)
|
| @@ -491,14 +463,22 @@ def TryChange(argv,
|
|
|
| # Get try slaves from PRESUBMIT.py files if not specified.
|
| if not options.bot:
|
| - if options.url:
|
| - parser.error('You need to specify which bots to use.')
|
| - root_presubmit = gcl.GetCachedFile('PRESUBMIT.py', use_root=True)
|
| - options.bot = presubmit_support.DoGetTrySlaves(options.scm.GetFileNames(),
|
| - options.scm.GetLocalRoot(),
|
| - root_presubmit,
|
| - False,
|
| - sys.stdout)
|
| + # Even if the diff comes from options.url, use the local checkout for bot
|
| + # selection.
|
| + try:
|
| + # Get try slaves from PRESUBMIT.py files if not specified.
|
| + import presubmit_support
|
| + root_presubmit = options.scm.GetBots()
|
| + options.bot = presubmit_support.DoGetTrySlaves(
|
| + options.scm.GetFileNames(),
|
| + options.scm.GetLocalRoot(),
|
| + root_presubmit,
|
| + False,
|
| + sys.stdout)
|
| + except ImportError:
|
| + pass
|
| + # If no bot is specified, either the default pool will be selected or the
|
| + # try server will refuse the job. Either case we don't need to interfere.
|
|
|
| if options.name is None:
|
| if options.issue:
|
|
|