aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
authorGravatar borenet@google.com <borenet@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-01-23 20:54:29 +0000
committerGravatar borenet@google.com <borenet@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-01-23 20:54:29 +0000
commit6b5388e71b0fb93b900e2705348cf9a6bfd3df9d (patch)
tree9da6a4a6caa33b04c9a1f4922c086e6a6ae68b39 /tools
parent7fa58acb044da9bf104015a24df9fb261f05b444 (diff)
Replace gcl_try with submit_try
submit_try supports both git and svn and hooks directly into depot_tools rather than calling it in a subprocess. Review URL: https://codereview.appspot.com/7202044 git-svn-id: http://skia.googlecode.com/svn/trunk@7352 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'tools')
-rwxr-xr-xtools/gcl_try95
-rwxr-xr-xtools/submit_try205
2 files changed, 205 insertions, 95 deletions
diff --git a/tools/gcl_try b/tools/gcl_try
deleted file mode 100755
index 7552b96dd2..0000000000
--- a/tools/gcl_try
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/usr/bin/python
-
-# 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.
-
-"""
-gcl_try: Submit a try request.
-
-This is a thin wrapper around "gcl try" which adds some validation.
-"""
-
-
-import argparse
-import httplib
-import json
-import os
-import subprocess
-import sys
-
-
-ALL_BUILDERS = 'all'
-SKIA_BUILD_MASTER_HOST = '70.32.156.51'
-SKIA_BUILD_MASTER_PORT = '10117'
-TRYBOT_SUFFIX = '_Trybot'
-
-
-def RetrieveTrybotList():
- """ Retrieve the list of known trybots from the build master, stripping
- TRYBOT_SUFFIX from the name. """
- trybots = []
- connection = httplib.HTTPConnection(SKIA_BUILD_MASTER_HOST,
- SKIA_BUILD_MASTER_PORT)
- httplib.HTTPConnection
- connection.request('GET', '/json/builders')
- response = connection.getresponse()
- builders = json.load(response)
- for builder in builders:
- if builder.endswith(TRYBOT_SUFFIX):
- trybots.append(builder[:-len(TRYBOT_SUFFIX)])
- return trybots
-
-
-def ValidateArgs(trybots):
- """ Parse and validate command-line arguments. If the arguments are valid,
- returns a tuple of (<changelist name>, <list of trybots>).
-
- trybots: A list of the known try builders.
- """
- parser = argparse.ArgumentParser(
- prog=os.path.basename(__file__),
- description='%(prog)s: Submit a try request.',
- usage='%(prog)s [-h] <changelist> --bot <buildername> [<buildername ...]')
- parser.add_argument('changelist', metavar='<changelist>',
- help='Changelist to try.')
- parser.add_argument('--bot', metavar='<buildername>', nargs='+',
- help='Builder(s) on which to try the change. One of: %s'
- % ', '.join(trybots),
- choices=trybots, required=True)
- args = parser.parse_args()
- if args.bot == [ALL_BUILDERS]:
- bots = trybots
- else:
- bots = args.bot
- return args.changelist, bots
-
-
-def SubmitTryRequest(changelist, bots):
- """ Submits a try request for the given changelist on the given list of
- trybots.
-
- changelist: string; the name of the changelist to try.
- bots: list of trybots on which to run the try.
- """
- if os.name == 'nt':
- gcl = 'gcl.bat'
- else:
- gcl = 'gcl'
- cmd = [gcl, 'try', changelist, '--bot',
- ','.join(['%s%s' % (bot, TRYBOT_SUFFIX) for bot in bots])]
- print 'Running command: %s' % ' '.join(cmd)
- proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- if proc.wait() != 0:
- raise Exception('Failed to submit try request:\n%s' % proc.communicate()[0])
- print proc.communicate()[0]
-
-
-def main():
- trybots = RetrieveTrybotList()
- changelist, bots = ValidateArgs(trybots=trybots)
- SubmitTryRequest(changelist, bots)
-
-
-if __name__ == '__main__':
- sys.exit(main()) \ No newline at end of file
diff --git a/tools/submit_try b/tools/submit_try
new file mode 100755
index 0000000000..d62c9fb5c6
--- /dev/null
+++ b/tools/submit_try
@@ -0,0 +1,205 @@
+#!/usr/bin/python
+
+# 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.
+
+
+"""
+submit_try: Submit a try request.
+
+This is a thin wrapper around the try request utilities in depot_tools which
+adds some validation and supports both git and svn.
+"""
+
+
+import argparse
+import httplib
+import json
+import os
+import subprocess
+import sys
+
+
+# Alias which can be used to run a try on every builder.
+ALL_BUILDERS = 'all'
+
+# Contact information for the build master.
+# TODO(borenet): Share this information from a single location. Filed bug:
+# http://code.google.com/p/skia/issues/detail?id=1081
+SKIA_BUILD_MASTER_HOST = '70.32.156.51'
+SKIA_BUILD_MASTER_PORT = '10117'
+
+# All try builders have this suffix.
+TRYBOT_SUFFIX = '_Trybot'
+
+# Location of the codereview.settings file in the Skia repo.
+SKIA_URL = 'skia.googlecode.com'
+CODEREVIEW_SETTINGS = '/svn/codereview.settings'
+
+# String for matching the svn url of the try server inside codereview.settings.
+TRYSERVER_SVN_URL = 'TRYSERVER_SVN_URL: '
+
+# Strings used for matching svn config properties.
+URL_STR = 'URL: '
+REPO_ROOT_STR = 'Repository Root: '
+
+
+def FindDepotTools():
+ """ Find depot_tools on the local machine and return its location. """
+ which_cmd = 'where' if os.name == 'nt' else 'which'
+ cmd = [which_cmd, 'gcl']
+ proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ if proc.wait() != 0:
+ raise Exception('Couldn\'t find depot_tools in PATH!')
+ gcl = proc.communicate()[0]
+ depot_tools_dir = os.path.dirname(gcl)
+ return depot_tools_dir
+
+
+def GetCheckoutRoot(is_svn=True):
+ """ Determine where the local checkout is rooted.
+
+ is_svn: boolean; whether we're in an SVN checkout. If False, assume we're in
+ a git checkout.
+ """
+ if is_svn:
+ cmd = ['svn', 'info']
+ proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ if proc.wait() != 0:
+ raise Exception('Couldn\'t find checkout root!')
+ output = proc.communicate()[0].split('\n')
+ url = None
+ repo_root = None
+ for line in output:
+ if line.startswith(REPO_ROOT_STR):
+ repo_root = line[len(REPO_ROOT_STR):].rstrip()
+ elif line.startswith(URL_STR):
+ url = line[len(URL_STR):].rstrip()
+ if not url or not repo_root:
+ raise Exception('Couldn\'t find checkout root!')
+ if url == repo_root:
+ return 'svn'
+ return url[len(repo_root)+1:]
+ else:
+ cmd = ['git', 'rev-parse', '--show-toplevel']
+ proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ if proc.wait() != 0:
+ raise Exception('Couldn\'t find checkout root!')
+ return os.path.basename(proc.communicate()[0])
+
+
+def GetTryRepo():
+ """ Determine the TRYSERVER_SVN_URL from the codereview.settings file in the
+ Skia repo. """
+ connection = httplib.HTTPConnection(SKIA_URL)
+ connection.request('GET', CODEREVIEW_SETTINGS)
+ content = connection.getresponse().read()
+ for line in content.split('\n'):
+ if line.startswith(TRYSERVER_SVN_URL):
+ return line[len(TRYSERVER_SVN_URL):].rstrip()
+ raise Exception('Couldn\'t determine the TRYSERVER_SVN_URL. Make sure it is '
+ 'defined in the %s file.' % CODEREVIEW_SETTINGS)
+
+
+def RetrieveTrybotList():
+ """ Retrieve the list of known trybots from the build master, stripping
+ TRYBOT_SUFFIX from the name. """
+ trybots = []
+ connection = httplib.HTTPConnection(SKIA_BUILD_MASTER_HOST,
+ SKIA_BUILD_MASTER_PORT)
+ connection.request('GET', '/json/builders')
+ response = connection.getresponse()
+ builders = json.load(response)
+
+ for builder in builders:
+ if builder.endswith(TRYBOT_SUFFIX):
+ trybots.append(builder[:-len(TRYBOT_SUFFIX)])
+ return trybots
+
+
+def ValidateArgs(trybots, is_svn=True):
+ """ Parse and validate command-line arguments. If the arguments are valid,
+ returns a tuple of (<changelist name>, <list of trybots>).
+
+ trybots: A list of the known try builders.
+ """
+ if is_svn:
+ parser = argparse.ArgumentParser(
+ prog=os.path.basename(__file__),
+ description='%(prog)s: Submit a try request.',
+ usage=('%(prog)s [-h] <changelist> --bot <buildername> '
+ '[<buildername ...]'))
+ parser.add_argument('changelist', metavar='<changelist>',
+ help='Changelist to try.')
+ else:
+ parser = argparse.ArgumentParser(
+ prog=os.path.basename(__file__),
+ description='%(prog)s: Submit a try request.')
+
+ parser.add_argument('-r', '--revision', metavar='<revision#>', nargs=1,
+ type=int, help='Revision from which to try the change.')
+ parser.add_argument('--bot', metavar='<buildername>', nargs='+',
+ help='Builder(s) on which to try the change. One of: %s'
+ % ', '.join(trybots),
+ choices=trybots + [ALL_BUILDERS], required=True)
+ args = parser.parse_args()
+ if args.bot == [ALL_BUILDERS]:
+ args.bot = trybots
+ return args
+
+
+def SubmitTryRequest(args, is_svn=True):
+ """ Submits a try request for the given changelist on the given list of
+ trybots.
+
+ args: Object whose properties are derived from command-line arguments. If
+ is_svn is True, it should contain:
+ - changelist: string; the name of the changelist to try.
+ - bot: list of strings; the names of the try builders to run.
+ - revision: optional, int; the revision number from which to run the try.
+ If is_svn is False, it should contain:
+ - bot: list of strings; the names of the try builders to run.
+ - revision: optional, int; the revision number from which to run the try.
+ is_svn: boolean; are we in an SVN repo?
+ """
+ # First, find depot_tools. This is needed for the imports below.
+ sys.path.append(FindDepotTools())
+
+ botlist = ','.join(['%s%s' % (bot, TRYBOT_SUFFIX) for bot in args.bot])
+ if is_svn:
+ import gcl
+ try_args = [args.changelist, '--root', GetCheckoutRoot(is_svn),
+ '--bot', botlist]
+ if args.revision:
+ try_args.extend(['-r', args.revision])
+ gcl.CMDtry(try_args)
+ else:
+ import trychange
+ try_args = ['--use_svn',
+ '--svn_repo', GetTryRepo(),
+ '--root', GetCheckoutRoot(is_svn),
+ '--bot', botlist]
+ if args.revision:
+ try_args.extend(['-r', args.revision])
+ trychange.TryChange(try_args, None, False)
+
+
+def main():
+ # Retrieve the list of active try builders from the build master.
+ trybots = RetrieveTrybotList()
+
+ # Determine if we're in an SVN checkout.
+ is_svn = os.path.isdir('.svn')
+
+ # Parse and validate the command-line arguments.
+ args = ValidateArgs(trybots=trybots, is_svn=is_svn)
+
+ # Submit the try request.
+ SubmitTryRequest(args, is_svn=is_svn)
+
+
+if __name__ == '__main__':
+ sys.exit(main()) \ No newline at end of file