| Index: trychange.py
|
| ===================================================================
|
| --- trychange.py (revision 18230)
|
| +++ trychange.py (working copy)
|
| @@ -14,7 +14,6 @@
|
| import optparse
|
| import os
|
| import shutil
|
| -import socket
|
| import sys
|
| import tempfile
|
| import traceback
|
| @@ -29,6 +28,7 @@
|
|
|
| # 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,31 +75,29 @@
|
|
|
| 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 GetTryServerSettings():
|
| - """Grab try server settings local to the repository."""
|
| - def _SafeResolve(host):
|
| +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):
|
| try:
|
| - return socket.getaddrinfo(host, None)
|
| - except socket.gaierror:
|
| - return None
|
| + 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
|
|
|
| - 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):
|
| return name.replace('.', '-')
|
|
|
| @@ -258,12 +256,18 @@
|
|
|
| def _SendChangeHTTP(options):
|
| """Send a change to the try server using the HTTP protocol."""
|
| + script_locals = ExecuteTryServerScript()
|
| +
|
| if not options.host:
|
| - raise NoTryServerAccess('Please use the --host option to specify the try '
|
| - 'server host to connect to.')
|
| + 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.')
|
| if not options.port:
|
| - raise NoTryServerAccess('Please use the --port option to specify the try '
|
| - 'server port to connect to.')
|
| + 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.')
|
|
|
| values = _ParseSendChangeOptions(options)
|
| values['patch'] = options.diff
|
| @@ -294,9 +298,12 @@
|
| 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:
|
| - raise NoTryServerAccess('Please use the --svn_repo option to specify the'
|
| - ' try server svn repository to connect to.')
|
| + 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.')
|
|
|
| values = _ParseSendChangeOptions(options)
|
| description = ''
|
| @@ -308,9 +315,7 @@
|
| temp_file = tempfile.NamedTemporaryFile()
|
| temp_file_name = temp_file.name
|
| try:
|
| - # Don't use '--non-interactive', since we want it to prompt for
|
| - # crendentials if necessary.
|
| - RunCommand(['svn', 'checkout', '--depth', 'empty',
|
| + RunCommand(['svn', 'checkout', '--depth', 'empty', '--non-interactive',
|
| options.svn_repo, temp_dir])
|
| # TODO(maruel): Use a subdirectory per user?
|
| current_time = str(datetime.datetime.now()).replace(':', '.')
|
| @@ -386,11 +391,6 @@
|
| 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,44 +446,31 @@
|
| 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=default_transport,
|
| + group.add_option("--use_http", action="store_const", const=_SendChangeHTTP,
|
| + dest="send_patch", default=_SendChangeHTTP,
|
| 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",
|
| - default=default_settings['svn_repo'],
|
| + group.add_option("--svn_repo", metavar="SVN_URL",
|
| 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()
|
| if (not options.files and (not options.issue and options.patchset) and
|
|
|