#!/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 "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.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)
