#!/usr/bin/env python3
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# A script for re-running prod builds on LUCI
#
# Usage:
# $ build.py --commit [Engine commit hash] --builder [builder name]

import argparse
import os
import re
import subprocess
import sys


def GetAllBuilders():
  curl_command = [
    'curl',
    'https://ci.chromium.org/p/flutter/g/engine/builders',
  ]
  curl_result = subprocess.run(
    curl_command,
    universal_newlines=True,
    capture_output=True,
  )
  if curl_result.returncode != 0:
    print('Failed to fetch builder list: stderr:\n%s' % curl_result.stderr)
    return []
  sed_command = [
    'sed',
    '-En',
    's:.*aria-label="builder buildbucket/luci\\.flutter\\.prod/([^/]+)".*:\\1:p',
  ]
  sed_result = subprocess.run(
    sed_command,
    input=curl_result.stdout,
    capture_output=True,
    universal_newlines=True,
  )
  if sed_result.returncode != 0:
    print('Failed to fetch builder list: stderr:\n%s' % sed_result.stderr)
  return list(set(sed_result.stdout.splitlines()))


def Main():
  parser = argparse.ArgumentParser(description='Reruns Engine LUCI prod builds')
  parser.add_argument(
    '--force-upload',
    action='store_true',
    default=False,
    help='Force artifact upload, overwriting existing artifacts.')
  parser.add_argument(
    '--all',
    action='store_true',
    default=False,
    help='Re-run all builds.')
  parser.add_argument(
    '--builder',
    type=str,
    help='The builer to rerun.')
  parser.add_argument(
    '--commit',
    type=str,
    required=True,
    help='The commit to rerun.')
  parser.add_argument(
    '--dry-run',
    action='store_true',
    help='Print what would be done, but do nothing.')
  args = parser.parse_args()

  if 'help' in vars(args) and args.help:
    parser.print_help()
    return 0

  if args.all:
    builders = GetAllBuilders()
  elif args.builder == None:
    print('Either --builder or --all is required.')
    return 1
  else:
    builders = [args.builder]

  auth_command = [
    'gcloud',
    'auth',
    'print-identity-token',
  ]
  auth_result = subprocess.run(
    auth_command,
    universal_newlines=True,
    capture_output=True,
  )
  if auth_result.returncode != 0:
    print('Auth failed:\nstdout:\n%s\nstderr:\n%s' % (auth_result.stdout, auth_result.stderr))
    return 1
  auth_token = auth_result.stdout.rstrip()

  for builder in builders:
    if args.force_upload:
      params = ('{"Commit": "%s", "Builder": "%s", "Repo": "engine", "Properties": {"force_upload":true}}'
        % (args.commit, builder))
    else:
      params = '{"Commit": "%s", "Builder": "%s", "Repo": "engine"}' % (args.commit, builder)
    curl_command = [
      'curl',
      'http://flutter-dashboard.appspot.com/api/reset-prod-task',
      "-d %s" % params,
      '-H',
      'X-Flutter-IdToken: %s' % auth_token,
    ]
    if args.dry_run:
      print('Running: %s' % ' '.join(curl_command))
    else:
      result = subprocess.run(curl_command)
      if result.returncode != 0:
        print('Trigger for %s failed. Aborting.' % builder)
        return 1

  return 0


if __name__ == '__main__':
  sys.exit(Main())
