| #!/usr/bin/env python | 
 | # Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file | 
 | # for details. All rights reserved. Use of this source code is governed by a | 
 | # BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | # Convenience script for triggering bots on specific commits. | 
 |  | 
 | import json | 
 | import git_utils | 
 | import optparse | 
 | import os | 
 | import re | 
 | import subprocess | 
 | import sys | 
 | import urllib | 
 |  | 
 | import utils | 
 |  | 
 | LUCI_SCHEDULE = os.path.join(utils.REPO_ROOT, 'infra', 'config', 'global', | 
 |                              'luci-scheduler.cfg') | 
 | # Trigger lines have the format: | 
 | #   triggers: "BUILDER_NAME" | 
 | TRIGGERS_RE = r'^  triggers: "(\w.*)"' | 
 |  | 
 | DESUGAR_BOT = 'archive_lib_desugar' | 
 |  | 
 | def ParseOptions(): | 
 |   result = optparse.OptionParser() | 
 |   result.add_option('--release', | 
 |                     help='Run on the release branch builders.', | 
 |                     default=False, action='store_true') | 
 |   result.add_option('--cl', | 
 |                     help='Run the specified cl on the bots. This should be ' | 
 |                     'the full url, e.g., ' | 
 |                     'https://r8-review.googlesource.com/c/r8/+/37420/1') | 
 |   result.add_option('--desugar', | 
 |                     help='Run the library desugar and archiving bot.', | 
 |                     default=False, action='store_true') | 
 |   result.add_option('--builder', help='Trigger specific builder') | 
 |   return result.parse_args() | 
 |  | 
 | def get_builders(): | 
 |  | 
 |   is_release = False | 
 |   main_builders = [] | 
 |   release_builders = [] | 
 |   with open(LUCI_SCHEDULE, 'r') as fp: | 
 |     lines = fp.readlines() | 
 |     for line in lines: | 
 |       if 'branch-gitiles-trigger' in line: | 
 |         is_release = True | 
 |       match = re.match(TRIGGERS_RE, line) | 
 |       if match: | 
 |         builder = match.group(1) | 
 |         if is_release: | 
 |           assert 'release' in builder | 
 |           release_builders.append(builder) | 
 |         else: | 
 |           assert 'release' not in builder | 
 |           main_builders.append(builder) | 
 |   assert DESUGAR_BOT in main_builders | 
 |   print 'Desugar builder:\n  ' + DESUGAR_BOT | 
 |   main_builders.remove(DESUGAR_BOT) | 
 |   print 'Main builders:\n  ' + '\n  '.join(main_builders) | 
 |   print 'Release builders:\n  ' + '\n  '.join(release_builders) | 
 |   return (main_builders, release_builders) | 
 |  | 
 | def sanity_check_url(url): | 
 |   a = urllib.urlopen(url) | 
 |   if a.getcode() != 200: | 
 |     raise Exception('Url: %s \n returned %s' % (url, a.getcode())) | 
 |  | 
 | def trigger_builders(builders, commit): | 
 |   commit_url = 'https://r8.googlesource.com/r8/+/%s' % commit | 
 |   sanity_check_url(commit_url) | 
 |   for builder in builders: | 
 |     cmd = ['bb', 'add', 'r8/ci/%s' % builder , '-commit', commit_url] | 
 |     subprocess.check_call(cmd) | 
 |  | 
 | def trigger_cl(builders, cl_url): | 
 |   for builder in builders: | 
 |     cmd = ['bb', 'add', 'r8/ci/%s' % builder , '-cl', cl_url] | 
 |     subprocess.check_call(cmd) | 
 |  | 
 | def Main(): | 
 |   (options, args) = ParseOptions() | 
 |   if len(args) != 1 and not options.cl and not options.desugar: | 
 |     print 'Takes exactly one argument, the commit to run' | 
 |     return 1 | 
 |  | 
 |   if options.cl and options.release: | 
 |     print 'You can\'t run cls on the release bots' | 
 |     return 1 | 
 |  | 
 |   if options.cl and options.desugar: | 
 |     print 'You can\'t run cls on the desugar bot' | 
 |     return 1 | 
 |  | 
 |   commit = None if (options.cl or options.desugar)  else args[0] | 
 |   (main_builders, release_builders) = get_builders() | 
 |   builders = release_builders if options.release else main_builders | 
 |   if options.builder: | 
 |     builder = options.builder | 
 |     assert builder in main_builders or builder in release_builders | 
 |     builders = [options.builder] | 
 |   if options.desugar: | 
 |     builders = [DESUGAR_BOT] | 
 |     commit = git_utils.GetHeadRevision(utils.REPO_ROOT, use_main=True) | 
 |   if options.cl: | 
 |     trigger_cl(builders, options.cl) | 
 |   else: | 
 |     assert commit | 
 |     trigger_builders(builders, commit) | 
 |  | 
 | if __name__ == '__main__': | 
 |   sys.exit(Main()) |