| Index: git_cl.py
 | 
| diff --git a/git_cl.py b/git_cl.py
 | 
| index 48fb848c8f20935b2ba81723818809ee35bebfab..bca8760d14b797f1917269ff90c5a1170049f224 100755
 | 
| --- a/git_cl.py
 | 
| +++ b/git_cl.py
 | 
| @@ -1510,6 +1510,92 @@ def CMDtree(parser, args):
 | 
|    return 0
 | 
|  
 | 
|  
 | 
| +def CMDtry(parser, args):
 | 
| +  """Triggers a try job through Rietveld."""
 | 
| +  group = optparse.OptionGroup(parser, "Try job options")
 | 
| +  group.add_option(
 | 
| +      "-b", "--bot", action="append",
 | 
| +      help=("IMPORTANT: specify ONE builder per --bot flag. Use it multiple "
 | 
| +            "times to specify multiple builders. ex: "
 | 
| +            "'-bwin_rel:ui_tests,webkit_unit_tests -bwin_layout'. See "
 | 
| +            "the try server waterfall for the builders name and the tests "
 | 
| +            "available. Can also be used to specify gtest_filter, e.g. "
 | 
| +            "-bwin_rel:base_unittests:ValuesTest.*Value"))
 | 
| +  group.add_option(
 | 
| +      "-r", "--revision",
 | 
| +      help="Revision to use for the try job; default: the "
 | 
| +           "revision will be determined by the try server; see "
 | 
| +           "its waterfall for more info")
 | 
| +  group.add_option(
 | 
| +      "-c", "--clobber", action="store_true", default=False,
 | 
| +      help="Force a clobber before building; e.g. don't do an "
 | 
| +           "incremental build")
 | 
| +  group.add_option(
 | 
| +      "--project",
 | 
| +      help="Override which project to use. Projects are defined "
 | 
| +           "server-side to define what default bot set to use")
 | 
| +  group.add_option(
 | 
| +      "-t", "--testfilter", action="append", default=[],
 | 
| +      help=("Apply a testfilter to all the selected builders. Unless the "
 | 
| +            "builders configurations are similar, use multiple "
 | 
| +            "--bot <builder>:<test> arguments."))
 | 
| +  group.add_option(
 | 
| +      "-n", "--name", help="Try job name; default to current branch name")
 | 
| +  parser.add_option_group(group)
 | 
| +  options, args = parser.parse_args(args)
 | 
| +
 | 
| +  if args:
 | 
| +    parser.error('Unknown arguments: %s' % args)
 | 
| +
 | 
| +  cl = Changelist()
 | 
| +  if not cl.GetIssue():
 | 
| +    parser.error('Need to upload first')
 | 
| +
 | 
| +  if not options.name:
 | 
| +    options.name = cl.GetBranch()
 | 
| +
 | 
| +  # Process --bot and --testfilter.
 | 
| +  if not options.bot:
 | 
| +    # Get try slaves from PRESUBMIT.py files if not specified.
 | 
| +    change = cl.GetChange(cl.GetUpstreamBranch(), None)
 | 
| +    options.bot = presubmit_support.DoGetTrySlaves(
 | 
| +        change,
 | 
| +        change.LocalPaths(),
 | 
| +        settings.GetRoot(),
 | 
| +        None,
 | 
| +        None,
 | 
| +        options.verbose,
 | 
| +        sys.stdout)
 | 
| +  if not options.bot:
 | 
| +    parser.error('No default try builder to try, use --bot')
 | 
| +
 | 
| +  builders_and_tests = {}
 | 
| +  for bot in options.bot:
 | 
| +    if ':' in bot:
 | 
| +      builder, tests = bot.split(':', 1)
 | 
| +      builders_and_tests.setdefault(builder, []).extend(tests.split(','))
 | 
| +    elif ',' in bot:
 | 
| +      parser.error('Specify one bot per --bot flag')
 | 
| +    else:
 | 
| +      builders_and_tests.setdefault(bot, []).append('defaulttests')
 | 
| +
 | 
| +  if options.testfilter:
 | 
| +    forced_tests = sum((t.split(',') for t in options.testfilter), [])
 | 
| +    builders_and_tests = dict(
 | 
| +      (b, forced_tests) for b, t in builders_and_tests.iteritems()
 | 
| +      if t != ['compile'])
 | 
| +
 | 
| +  patchset = cl.GetPatchset()
 | 
| +  if not cl.GetPatchset():
 | 
| +    properties = cl.RpcServer().get_issue_properties(cl.GetIssue(), False)
 | 
| +    patchset = properties['patchsets'][-1]
 | 
| +
 | 
| +  cl.RpcServer().trigger_try_jobs(
 | 
| +      cl.GetIssue(), patchset, options.name, options.clobber, options.revision,
 | 
| +      builders_and_tests)
 | 
| +  return 0
 | 
| +
 | 
| +
 | 
|  @usage('[new upstream branch]')
 | 
|  def CMDupstream(parser, args):
 | 
|    """prints or sets the name of the upstream branch, if any"""
 | 
| 
 |