| Index: trychange.py
|
| diff --git a/trychange.py b/trychange.py
|
| index 5c8c1c57bf3dfdb64cd7e236f1181f1890a365a1..7d79690ae6c129e08b8f511aa3ed5b68edf768f2 100755
|
| --- a/trychange.py
|
| +++ b/trychange.py
|
| @@ -14,6 +14,7 @@ import logging
|
| import optparse
|
| import os
|
| import shutil
|
| +import socket
|
| import sys
|
| import tempfile
|
| import traceback
|
| @@ -28,7 +29,6 @@ __version__ = '1.1'
|
|
|
| # Constants
|
| HELP_STRING = "Sorry, Tryserver is not available."
|
| -SCRIPT_PATH = os.path.join('tools', 'tryserver', 'tryserver.py')
|
| USAGE = r"""%prog [options]
|
|
|
| Client-side script to send a try job to the try server. It communicates to
|
| @@ -75,27 +75,29 @@ def PathDifference(root, subpath):
|
|
|
| def GetSourceRoot():
|
| """Returns the absolute directory one level up from the repository root."""
|
| + # TODO(maruel): This is odd to assume that '..' is the source root.
|
| return os.path.abspath(os.path.join(gcl.GetRepositoryRoot(), '..'))
|
|
|
|
|
| -def ExecuteTryServerScript():
|
| - """Locates the tryserver script, executes it and returns its dictionary.
|
| -
|
| - The try server script contains the repository-specific try server commands."""
|
| - script_locals = {}
|
| - try:
|
| - # gcl.GetRepositoryRoot() may throw an exception.
|
| - script_path = os.path.join(gcl.GetRepositoryRoot(), SCRIPT_PATH)
|
| - except Exception:
|
| - return script_locals
|
| - if os.path.exists(script_path):
|
| +def GetTryServerSettings():
|
| + """Grab try server settings local to the repository."""
|
| + def _SafeResolve(host):
|
| try:
|
| - exec(gcl.ReadFile(script_path), script_locals)
|
| - except Exception, e:
|
| - # TODO(maruel): Need to specialize the exception trapper.
|
| - traceback.print_exc()
|
| - raise InvalidScript('%s is invalid.' % script_path)
|
| - return script_locals
|
| + 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')
|
| + # 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):
|
| @@ -256,18 +258,12 @@ def _ParseSendChangeOptions(options):
|
|
|
| def _SendChangeHTTP(options):
|
| """Send a change to the try server using the HTTP protocol."""
|
| - script_locals = ExecuteTryServerScript()
|
| -
|
| if not options.host:
|
| - options.host = script_locals.get('try_server_http_host', None)
|
| - if not options.host:
|
| - raise NoTryServerAccess('Please use the --host option to specify the try '
|
| - 'server host to connect to.')
|
| + raise NoTryServerAccess('Please use the --host option to specify the try '
|
| + 'server host to connect to.')
|
| if not options.port:
|
| - options.port = script_locals.get('try_server_http_port', None)
|
| - if not options.port:
|
| - raise NoTryServerAccess('Please use the --port option to specify the try '
|
| - 'server port to connect to.')
|
| + raise NoTryServerAccess('Please use the --port option to specify the try '
|
| + 'server port to connect to.')
|
|
|
| values = _ParseSendChangeOptions(options)
|
| values['patch'] = options.diff
|
| @@ -298,12 +294,9 @@ def _SendChangeHTTP(options):
|
| def _SendChangeSVN(options):
|
| """Send a change to the try server by committing a diff file on a subversion
|
| server."""
|
| - script_locals = ExecuteTryServerScript()
|
| if not options.svn_repo:
|
| - options.svn_repo = script_locals.get('try_server_svn', None)
|
| - if not options.svn_repo:
|
| - raise NoTryServerAccess('Please use the --svn_repo option to specify the'
|
| - ' try server svn repository to connect to.')
|
| + raise NoTryServerAccess('Please use the --svn_repo option to specify the'
|
| + ' try server svn repository to connect to.')
|
|
|
| values = _ParseSendChangeOptions(options)
|
| description = ''
|
| @@ -315,7 +308,9 @@ def _SendChangeSVN(options):
|
| temp_file = tempfile.NamedTemporaryFile()
|
| temp_file_name = temp_file.name
|
| try:
|
| - RunCommand(['svn', 'checkout', '--depth', 'empty', '--non-interactive',
|
| + # Don't use '--non-interactive', since we want it to prompt for
|
| + # crendentials if necessary.
|
| + RunCommand(['svn', 'checkout', '--depth', 'empty',
|
| options.svn_repo, temp_dir])
|
| # TODO(maruel): Use a subdirectory per user?
|
| current_time = str(datetime.datetime.now()).replace(':', '.')
|
| @@ -391,6 +386,11 @@ def TryChange(argv,
|
| file_list,
|
| swallow_exception,
|
| prog=None):
|
| + 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__,
|
| @@ -446,30 +446,43 @@ def TryChange(argv,
|
| parser.add_option_group(group)
|
|
|
| group = optparse.OptionGroup(parser, "Access the try server by HTTP")
|
| - group.add_option("--use_http", action="store_const", const=_SendChangeHTTP,
|
| - dest="send_patch", default=_SendChangeHTTP,
|
| + group.add_option("--use_http",
|
| + 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")
|
| parser.add_option_group(group)
|
|
|
| group = optparse.OptionGroup(parser, "Access the try server with SVN")
|
| - group.add_option("--use_svn", action="store_const", const=_SendChangeSVN,
|
| + group.add_option("--use_svn",
|
| + action="store_const",
|
| + const=_SendChangeSVN,
|
| dest="send_patch",
|
| help="Use SVN to talk to the try server")
|
| - group.add_option("--svn_repo", metavar="SVN_URL",
|
| + 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)
|
|
|
| options, args = parser.parse_args(argv)
|
| - # Switch the default accordingly.
|
| - if options.svn_repo:
|
| - options.send_patch = _SendChangeSVN
|
| +
|
| + # Switch the default accordingly if there was no default send_patch.
|
| + if not options.send_patch:
|
| + if options.http_port and options.http_host:
|
| + options.send_patch = _SendChangeHTTP
|
| + elif options.svn_repo:
|
| + options.send_patch = _SendChangeSVN
|
|
|
| if len(args) == 1 and args[0] == 'help':
|
| parser.print_help()
|
|
|