| #!/usr/bin/env python3 | 
 | # 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 | 
 | from urllib.request import urlopen | 
 | import utils | 
 |  | 
 | LUCI_SCHEDULE = os.path.join(utils.REPO_ROOT, 'infra', 'config', 'global', | 
 |                              'generated', 'luci-scheduler.cfg') | 
 | # Trigger lines have the format: | 
 | #   triggers: "BUILDER_NAME" | 
 | TRIGGERS_RE = r'^  triggers: "(\w.*)"' | 
 |  | 
 | DESUGAR_JDK11_BOT = 'lib_desugar-archive-jdk11' | 
 | DESUGAR_JDK11_LEGACY_BOT = 'lib_desugar-archive-jdk11-legacy' | 
 | DESUGAR_JDK8_BOT = 'lib_desugar-archive-jdk8' | 
 | SMALI_BOT = 'smali' | 
 |  | 
 |  | 
 | 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', | 
 |                       metavar=('<url>'), | 
 |                       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-jdk11', | 
 |                       help='Run the jdk11 library desugar and archiving bot.', | 
 |                       default=False, | 
 |                       action='store_true') | 
 |     result.add_option( | 
 |         '--desugar-jdk11-legacy', | 
 |         help='Run the jdk11 legacy library desugar and archiving bot.', | 
 |         default=False, | 
 |         action='store_true') | 
 |     result.add_option('--desugar-jdk8', | 
 |                       help='Run the jdk8 library desugar and archiving bot.', | 
 |                       default=False, | 
 |                       action='store_true') | 
 |     result.add_option('--smali', | 
 |                       metavar=('<version>'), | 
 |                       help='Build smali version <version>.') | 
 |  | 
 |     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' in line: | 
 |                 is_release = True | 
 |             if 'main-gitiles-trigger' in line: | 
 |                 is_release = False | 
 |             match = re.match(TRIGGERS_RE, line) | 
 |             if match: | 
 |                 builder = match.group(1) | 
 |                 if is_release: | 
 |                     assert 'release' in builder, builder | 
 |                     release_builders.append(builder) | 
 |                 else: | 
 |                     assert 'release' not in builder, builder | 
 |                     main_builders.append(builder) | 
 |     print('Desugar jdk11 builder:\n  ' + DESUGAR_JDK11_BOT) | 
 |     print('Desugar jdk11 legacy builder:\n  ' + DESUGAR_JDK11_LEGACY_BOT) | 
 |     print('Desugar jdk8 builder:\n  ' + DESUGAR_JDK8_BOT) | 
 |     print('Smali builder:\n  ' + SMALI_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 = 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_smali_builder(version): | 
 |     utils.check_basic_semver_version( | 
 |         version, | 
 |         'use semantic version of the smali version to built (pre-releases are not supported)', | 
 |         allowPrerelease=False) | 
 |     print("Check that tag %s is created and pushed to the remote (e.g by running" % version) | 
 |     print() | 
 |     print("  git ls-remote origin refs/tags/%s in a smali checkout)" % version) | 
 |     print() | 
 |     print("in a smali checkout)") | 
 |     print() | 
 |     answer = input("Is tag %s present? [y/N]:" % version) | 
 |     if answer != 'y': | 
 |         print('Aborting smali release build') | 
 |         sys.exit(1) | 
 |     cmd = [ | 
 |         'bb', 'add', | 
 |         'r8/ci/%s' % SMALI_BOT, '-p', | 
 |         'test_options=["--version", "%s"]' % version | 
 |     ] | 
 |     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() | 
 |     desugar = options.desugar_jdk11 or options.desugar_jdk11_legacy or options.desugar_jdk8 | 
 |     requires_commit = not options.cl and not desugar and not options.smali | 
 |     if len(args) != 1 and requires_commit: | 
 |         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 desugar: | 
 |         print('You can\'t run cls on the desugar bot') | 
 |         return 1 | 
 |  | 
 |     if options.cl and options.smali: | 
 |         print('You can\'t run cls on the smali bot') | 
 |         return 1 | 
 |  | 
 |     if options.smali: | 
 |         if not options.release: | 
 |             print('Only release versions of smali can be built') | 
 |             return 1 | 
 |  | 
 |         trigger_smali_builder(options.smali) | 
 |         return | 
 |  | 
 |     commit = None if not requires_commit 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 desugar: | 
 |         assert options.desugar_jdk11 or options.desugar_jdk11_legacy or options.desugar_jdk8 | 
 |         if options.desugar_jdk11: | 
 |             builders = [DESUGAR_JDK11_BOT] | 
 |         elif options.desugar_jdk11_legacy: | 
 |             builders = [DESUGAR_JDK11_LEGACY_BOT] | 
 |         else: | 
 |             builders = [DESUGAR_JDK8_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()) |