#!/usr/bin/python

# 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."""

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

from utils import command_executer
from utils import logger
from utils import manifest_versions
from utils import misc

BRANCH = "the_actual_branch_used_in_this_script"
TMP_BRANCH = "tmp_branch"
SLEEP_TIME = 600


def GetPatchNum(output):
  lines = output.splitlines()
  line = [l for l in lines if "gerrit" in l][0]
  patch_num = re.findall(r"\d+", line)[0]
  if "gerrit-int" 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.RunCommand(command, return_output=True,
                                 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.RunCommand(commands, return_output=True,
                                  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)
#  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, rversion, index))

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

  _, out, _ = ce.RunCommand(ls_cmd, return_output=True, 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.RunCommand(command, return_output=True)
  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.RunCommand(commands, return_output=True)
  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.RunCommand(command, return_output=True)
  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.RunCommand(command, return_output=True)
      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/buildbot")
  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)
