#!/usr/bin/python2

# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Script to use remote try-bot build image with local gcc."""

from __future__ import print_function

import argparse
import glob
import os
import re
import shutil
import socket
import sys
import tempfile
import time

from cros_utils import command_executer
from cros_utils import logger
from cros_utils import manifest_versions
from cros_utils import misc

BRANCH = 'the_actual_branch_used_in_this_script'
TMP_BRANCH = 'tmp_branch'
SLEEP_TIME = 600

# pylint: disable=anomalous-backslash-in-string

def GetPatchNum(output):
  lines = output.splitlines()
  line = [l for l in lines if 'googlesource' in l][0]
  patch_num = re.findall(r'\d+', line)[0]
  if 'chrome-internal' in line:
    patch_num = '*' + patch_num
  return str(patch_num)


def GetPatchString(patch):
  if patch:
    return '+'.join(patch)
  return 'NO_PATCH'


def FindVersionForToolchain(branch, chromeos_root):
  """Find the version number in artifacts link in the tryserver email."""
  # For example: input:  toolchain-3701.42.B
  #              output: R26-3701.42.1
  digits = branch.split('-')[1].split('B')[0]
  manifest_dir = os.path.join(chromeos_root, 'manifest-internal')
  os.chdir(manifest_dir)
  major_version = digits.split('.')[0]
  ce = command_executer.GetCommandExecuter()
  command = 'repo sync . && git branch -a | grep {0}'.format(major_version)
  _, branches, _ = ce.RunCommandWOutput(command, print_to_console=False)
  m = re.search(r'(R\d+)', branches)
  if not m:
    logger.GetLogger().LogFatal('Cannot find version for branch {0}'
                                .format(branch))
  version = m.group(0) + '-' + digits + '1'
  return version


def FindBuildId(description):
  """Find the build id of the build at trybot server."""
  running_time = 0
  while True:
    (result, number) = FindBuildIdFromLog(description)
    if result >= 0:
      return (result, number)
    logger.GetLogger().LogOutput('{0} minutes passed.'
                                 .format(running_time / 60))
    logger.GetLogger().LogOutput('Sleeping {0} seconds.'.format(SLEEP_TIME))
    time.sleep(SLEEP_TIME)
    running_time += SLEEP_TIME


def FindBuildIdFromLog(description):
  """Get the build id from build log."""
  # returns tuple (result, buildid)
  # result == 0, buildid > 0, the build was successful and we have a build id
  # result > 0, buildid > 0,  the whole build failed for some reason but we
  #                           do have a build id.
  # result == -1, buildid == -1, we have not found a finished build for this
  #                              description yet

  file_dir = os.path.dirname(os.path.realpath(__file__))
  commands = ('{0}/utils/buildbot_json.py builds '
              'http://chromegw/p/tryserver.chromiumos/'.format(file_dir))
  ce = command_executer.GetCommandExecuter()
  _, buildinfo, _ = ce.RunCommandWOutput(commands, print_to_console=False)

  my_info = buildinfo.splitlines()
  current_line = 1
  running_job = False
  result = -1

  # result == 0, we have a successful build
  # result > 0, we have a failed build but build id may be valid
  # result == -1, we have not found a finished build for this description
  while current_line < len(my_info):
    my_dict = {}
    while True:
      key = my_info[current_line].split(':')[0].strip()
      value = my_info[current_line].split(':', 1)[1].strip()
      my_dict[key] = value
      current_line += 1
      if 'Build' in key or current_line == len(my_info):
        break
    if ('True' not in my_dict['completed'] and
        str(description) in my_dict['reason']):
      running_job = True
    if ('True' not in my_dict['completed'] or
        str(description) not in my_dict['reason']):
      continue
    result = int(my_dict['result'])
    build_id = int(my_dict['number'])
    if result == 0:
      return (result, build_id)
    else:
      # Found a finished failed build.
      # Keep searching to find a successful one
      pass

  if result > 0 and not running_job:
    return (result, build_id)
  return (-1, -1)


def DownloadImage(target, index, dest, version):
  """Download artifacts from cloud."""
  if not os.path.exists(dest):
    os.makedirs(dest)

  rversion = manifest_versions.RFormatCrosVersion(version)
  print(str(rversion))
  #  ls_cmd = ("gsutil ls gs://chromeos-image-archive/trybot-{0}/{1}-b{2}"
  #            .format(target, rversion, index))
  ls_cmd = ('gsutil ls gs://chromeos-image-archive/trybot-{0}/*-b{2}'
            .format(target, index))

  download_cmd = ('$(which gsutil) cp {0} {1}'.format('{0}', dest))
  ce = command_executer.GetCommandExecuter()

  _, out, _ = ce.RunCommandWOutput(ls_cmd, print_to_console=True)
  lines = out.splitlines()
  download_files = ['autotest.tar', 'chromeos-chrome', 'chromiumos_test_image',
                    'debug.tgz', 'sysroot_chromeos-base_chromeos-chrome.tar.xz']
  for line in lines:
    if any([e in line for e in download_files]):
      cmd = download_cmd.format(line)
      if ce.RunCommand(cmd):
        logger.GetLogger().LogFatal('Command {0} failed, existing...'
                                    .format(cmd))


def UnpackImage(dest):
  """Unpack the image, the chroot build dir."""
  chrome_tbz2 = glob.glob(dest + '/*.tbz2')[0]
  commands = ('tar xJf {0}/sysroot_chromeos-base_chromeos-chrome.tar.xz '
              '-C {0} &&'
              'tar xjf {1} -C {0} &&'
              'tar xzf {0}/debug.tgz  -C {0}/usr/lib/ &&'
              'tar xf {0}/autotest.tar -C {0}/usr/local/ &&'
              'tar xJf {0}/chromiumos_test_image.tar.xz -C {0}'
              .format(dest, chrome_tbz2))
  ce = command_executer.GetCommandExecuter()
  return ce.RunCommand(commands)


def RemoveOldBranch():
  """Remove the branch with name BRANCH."""
  ce = command_executer.GetCommandExecuter()
  command = 'git rev-parse --abbrev-ref HEAD'
  _, out, _ = ce.RunCommandWOutput(command)
  if BRANCH in out:
    command = 'git checkout -B {0}'.format(TMP_BRANCH)
    ce.RunCommand(command)
  command = "git commit -m 'nouse'"
  ce.RunCommand(command)
  command = 'git branch -D {0}'.format(BRANCH)
  ce.RunCommand(command)


def UploadManifest(manifest, chromeos_root, branch='master'):
  """Copy the manifest to $chromeos_root/manifest-internal and upload."""
  chromeos_root = misc.CanonicalizePath(chromeos_root)
  manifest_dir = os.path.join(chromeos_root, 'manifest-internal')
  os.chdir(manifest_dir)
  ce = command_executer.GetCommandExecuter()

  RemoveOldBranch()

  if branch != 'master':
    branch = '{0}'.format(branch)
  command = 'git checkout -b {0} -t cros-internal/{1}'.format(BRANCH, branch)
  ret = ce.RunCommand(command)
  if ret:
    raise Exception('Command {0} failed'.format(command))

  # We remove the default.xml, which is the symbolic link of full.xml.
  # After that, we copy our xml file to default.xml.
  # We did this because the full.xml might be updated during the
  # run of the script.
  os.remove(os.path.join(manifest_dir, 'default.xml'))
  shutil.copyfile(manifest, os.path.join(manifest_dir, 'default.xml'))
  return UploadPatch(manifest)


def GetManifestPatch(manifests, version, chromeos_root, branch='master'):
  """Return a gerrit patch number given a version of manifest file."""
  temp_dir = tempfile.mkdtemp()
  to_file = os.path.join(temp_dir, 'default.xml')
  manifests.GetManifest(version, to_file)
  return UploadManifest(to_file, chromeos_root, branch)


def UploadPatch(source):
  """Up load patch to gerrit, return patch number."""
  commands = ('git add -A . &&'
              "git commit -m 'test' -m 'BUG=None' -m 'TEST=None' "
              "-m 'hostname={0}' -m 'source={1}'"
              .format(socket.gethostname(), source))
  ce = command_executer.GetCommandExecuter()
  ce.RunCommand(commands)

  commands = ('yes | repo upload .   --cbr --no-verify')
  _, _, err = ce.RunCommandWOutput(commands)
  return GetPatchNum(err)


def ReplaceSysroot(chromeos_root, dest_dir, target):
  """Copy unpacked sysroot and image to chromeos_root."""
  ce = command_executer.GetCommandExecuter()
  # get the board name from "board-release". board may contain "-"
  board = target.rsplit('-', 1)[0]
  board_dir = os.path.join(chromeos_root, 'chroot', 'build', board)
  command = 'sudo rm -rf {0}'.format(board_dir)
  ce.RunCommand(command)

  command = 'sudo mv {0} {1}'.format(dest_dir, board_dir)
  ce.RunCommand(command)

  image_dir = os.path.join(chromeos_root, 'src', 'build', 'images', board,
                           'latest')
  command = 'rm -rf {0} && mkdir -p {0}'.format(image_dir)
  ce.RunCommand(command)

  command = 'mv {0}/chromiumos_test_image.bin {1}'.format(board_dir, image_dir)
  return ce.RunCommand(command)


def GccBranchForToolchain(branch):
  if branch == 'toolchain-3428.65.B':
    return 'release-R25-3428.B'
  else:
    return None


def GetGccBranch(branch):
  """Get the remote branch name from branch or version."""
  ce = command_executer.GetCommandExecuter()
  command = 'git branch -a | grep {0}'.format(branch)
  _, out, _ = ce.RunCommandWOutput(command)
  if not out:
    release_num = re.match(r'.*(R\d+)-*', branch)
    if release_num:
      release_num = release_num.group(0)
      command = 'git branch -a | grep {0}'.format(release_num)
      _, out, _ = ce.RunCommandWOutput(command)
      if not out:
        GccBranchForToolchain(branch)
  if not out:
    out = 'remotes/cros/master'
  new_branch = out.splitlines()[0]
  return new_branch


def UploadGccPatch(chromeos_root, gcc_dir, branch):
  """Upload local gcc to gerrit and get the CL number."""
  ce = command_executer.GetCommandExecuter()
  gcc_dir = misc.CanonicalizePath(gcc_dir)
  gcc_path = os.path.join(chromeos_root, 'src/third_party/gcc')
  assert os.path.isdir(gcc_path), ('{0} is not a valid chromeos root'
                                   .format(chromeos_root))
  assert os.path.isdir(gcc_dir), ('{0} is not a valid dir for gcc'
                                  'source'.format(gcc_dir))
  os.chdir(gcc_path)
  RemoveOldBranch()
  if not branch:
    branch = 'master'
  branch = GetGccBranch(branch)
  command = ('git checkout -b {0} -t {1} && ' 'rm -rf *'.format(BRANCH, branch))
  ce.RunCommand(command, print_to_console=False)

  command = ("rsync -az --exclude='*.svn' --exclude='*.git'"
             ' {0}/ .'.format(gcc_dir))
  ce.RunCommand(command)
  return UploadPatch(gcc_dir)


def RunRemote(chromeos_root, branch, patches, is_local, target, chrome_version,
              dest_dir):
  """The actual running commands."""
  ce = command_executer.GetCommandExecuter()

  if is_local:
    local_flag = '--local -r {0}'.format(dest_dir)
  else:
    local_flag = '--remote'
  patch = ''
  for p in patches:
    patch += ' -g {0}'.format(p)
  cbuildbot_path = os.path.join(chromeos_root, 'chromite/cbuildbot')
  os.chdir(cbuildbot_path)
  branch_flag = ''
  if branch != 'master':
    branch_flag = ' -b {0}'.format(branch)
  chrome_version_flag = ''
  if chrome_version:
    chrome_version_flag = ' --chrome_version={0}'.format(chrome_version)
  description = '{0}_{1}_{2}'.format(branch, GetPatchString(patches), target)
  command = ('yes | ./cbuildbot {0} {1} {2} {3} {4} {5}'
             ' --remote-description={6}'
             ' --chrome_rev=tot'.format(patch, branch_flag, chrome_version,
                                        local_flag, chrome_version_flag, target,
                                        description))
  ce.RunCommand(command)

  return description


def Main(argv):
  """The main function."""
  # Common initializations
  parser = argparse.ArgumentParser()
  parser.add_argument('-c',
                      '--chromeos_root',
                      required=True,
                      dest='chromeos_root',
                      help='The chromeos_root')
  parser.add_argument('-g',
                      '--gcc_dir',
                      default='',
                      dest='gcc_dir',
                      help='The gcc dir')
  parser.add_argument('-t',
                      '--target',
                      required=True,
                      dest='target',
                      help=('The target to be build, the list is at'
                            ' $(chromeos_root)/chromite/buildbot/cbuildbot'
                            ' --list -all'))
  parser.add_argument('-l', '--local', action='store_true')
  parser.add_argument('-d',
                      '--dest_dir',
                      dest='dest_dir',
                      help=('The dir to build the whole chromeos if'
                            ' --local is set'))
  parser.add_argument('--chrome_version',
                      dest='chrome_version',
                      default='',
                      help='The chrome version to use. '
                      'Default it will use the latest one.')
  parser.add_argument('--chromeos_version',
                      dest='chromeos_version',
                      default='',
                      help=('The chromeos version to use.'
                            '(1) A release version in the format: '
                            "'\d+\.\d+\.\d+\.\d+.*'"
                            "(2) 'latest_lkgm' for the latest lkgm version"))
  parser.add_argument('-r',
                      '--replace_sysroot',
                      action='store_true',
                      help=('Whether or not to replace the build/$board dir'
                            'under the chroot of chromeos_root and copy '
                            'the image to src/build/image/$board/latest.'
                            ' Default is False'))
  parser.add_argument('-b',
                      '--branch',
                      dest='branch',
                      default='',
                      help=('The branch to run trybot, default is None'))
  parser.add_argument('-p',
                      '--patch',
                      dest='patch',
                      default='',
                      help=('The patches to be applied, the patches numbers '
                            "be seperated by ','"))

  script_dir = os.path.dirname(os.path.realpath(__file__))

  args = parser.parse_args(argv[1:])
  target = args.target
  if args.patch:
    patch = args.patch.split(',')
  else:
    patch = []
  chromeos_root = misc.CanonicalizePath(args.chromeos_root)
  if args.chromeos_version and args.branch:
    raise Exception('You can not set chromeos_version and branch at the '
                    'same time.')

  manifests = None
  if args.branch:
    chromeos_version = ''
    branch = args.branch
  else:
    chromeos_version = args.chromeos_version
    manifests = manifest_versions.ManifestVersions()
    if chromeos_version == 'latest_lkgm':
      chromeos_version = manifests.TimeToVersion(time.mktime(time.gmtime()))
      logger.GetLogger().LogOutput('found version %s for latest LKGM' %
                                   (chromeos_version))
    # TODO: this script currently does not handle the case where the version
    # is not in the "master" branch
    branch = 'master'

  if chromeos_version:
    manifest_patch = GetManifestPatch(manifests, chromeos_version,
                                      chromeos_root)
    patch.append(manifest_patch)
  if args.gcc_dir:
    # TODO: everytime we invoke this script we are getting a different
    # patch for GCC even if GCC has not changed. The description should
    # be based on the MD5 of the GCC patch contents.
    patch.append(UploadGccPatch(chromeos_root, args.gcc_dir, branch))
  description = RunRemote(chromeos_root, branch, patch, args.local, target,
                          args.chrome_version, args.dest_dir)
  if args.local or not args.dest_dir:
    # TODO: We are not checktng the result of cbuild_bot in here!
    return 0

  # return value:
  # 0 => build bot was successful and image was put where requested
  # 1 => Build bot FAILED but image was put where requested
  # 2 => Build bot failed or BUild bot was successful but and image was
  #      not generated or could not be put where expected

  os.chdir(script_dir)
  dest_dir = misc.CanonicalizePath(args.dest_dir)
  (bot_result, build_id) = FindBuildId(description)
  if bot_result > 0 and build_id > 0:
    logger.GetLogger().LogError('Remote trybot failed but image was generated')
    bot_result = 1
  elif bot_result > 0:
    logger.GetLogger().LogError('Remote trybot failed. No image was generated')
    return 2
  if 'toolchain' in branch:
    chromeos_version = FindVersionForToolchain(branch, chromeos_root)
    assert not manifest_versions.IsRFormatCrosVersion(chromeos_version)
  DownloadImage(target, build_id, dest_dir, chromeos_version)
  ret = UnpackImage(dest_dir)
  if ret != 0:
    return 2
  # todo: return a more inteligent return value
  if not args.replace_sysroot:
    return bot_result

  ret = ReplaceSysroot(chromeos_root, args.dest_dir, target)
  if ret != 0:
    return 2

  # got an image and we were successful in placing it where requested
  return bot_result


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