#!/usr/bin/evn python
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Entry point for the AddIn build bot.

Perform build steps and output results using the buildbot
annootator syntax
"""

import os
import sys
import re
import shutil
import subprocess
import urllib2
import zipfile

GSURL = 'https://commondatastorage.googleapis.com'
GSPATH = 'nativeclient-mirror/nacl/nacl_sdk/sdk'
SDKROOT = os.path.join('..', '..', 'out', 'sdk')


def Log(msg):
  sys.stdout.write(msg + '\n')
  sys.stdout.flush()


def RunCommand(cmd, env=None):
  Log("Running: %s" % cmd)
  Log("CWD: %s" % os.getcwd())
  if type(cmd) == str:
    cmd = cmd.split()

  if sys.platform == 'cygwin':
    # allow bat files in the current working directory to
    # be executed on cygwin as they are on win32
    if not os.path.dirname(cmd[0]) and os.path.exists(cmd[0]):
      cmd[0] = './' + cmd[0]

  rtn = subprocess.call(cmd, env=env)
  if rtn:
    Log("Command returned non-zero exit code: %s" % rtn)
    Log('@@@STEP_FAILURE@@@')
    sys.exit(1)


def StepBuild():
  Log('@@@BUILD_STEP build AddIn@@@')

  rev = os.environ.get('BUILDBOT_GOT_REVISION')
  if not rev:
    Log('No BUILDBOT_GOT_REVISION found in environ')
    Log('@@@STEP_FAILURE@@@')
    sys.exit(1)

  if rev[0] == 'r':
    rev = rev[1:]

  # make a backup of AssemblyInfo.cs before we modify it
  filename = os.path.join('NativeClientVSAddIn', 'AssemblyInfo.cs')
  backup = filename + '.orig'
  shutil.copyfile(filename, backup)

  try:
    # Before we do the build, insert the revsion information
    # info AssemblyInfo.cs.  Thie will then be reported as
    # the addin version in visual studio.
    with open(filename, 'rb') as f:
      contents = f.read()

    pattern = r'(\[assembly: AssemblyInformationalVersion\("\d+\.\d+\.).*"\)\]'
    contents = re.sub(pattern, r'\g<1>%s")]' % rev, contents)

    with open(filename, 'wb') as f:
      f.write(contents)

    RunCommand('build.bat')
  finally:
    # Once build is done restore original file
    os.remove(filename)
    os.rename(backup, filename)



def StepInstall():
  Log('@@@BUILD_STEP Install AddIn@@@')
  RunCommand('developer_deploy.bat')


def StepInstallSDK():
  Log('@@@BUILD_STEP Install SDK@@@')
  naclsdk = os.path.join(SDKROOT, 'nacl_sdk', 'naclsdk.bat')
  if not os.path.exists(naclsdk):
    if not os.path.exists(SDKROOT):
      os.makedirs(SDKROOT)
    filename = os.path.join(SDKROOT, 'nacl_sdk.zip')
    url = GSURL + "/nativeclient-mirror/nacl/nacl_sdk/nacl_sdk.zip"
    contents = urllib2.urlopen(url).read()
    with open(filename, 'wb') as zfileout:
      zfileout.write(contents)
    zfile = zipfile.ZipFile(filename)
    zfile.extractall(SDKROOT)

  RunCommand([naclsdk, 'update', '--force', 'pepper_23'])
  RunCommand([naclsdk, 'update', '--force', 'pepper_canary'])


def StepTest():
  Log('@@@BUILD_STEP Testing AddIn@@@')
  # Don't actually test yet
  env = dict(os.environ)
  sdkroot = os.path.abspath(os.path.join(SDKROOT, 'nacl_sdk'))
  if 'CHROME_PATH' not in os.environ:
    # TODO(sbc): Addin itself should autodetect chrome location
    # http://crbug.com/154911
    progfiles = os.environ.get('PROGRAMFILES')
    progfiles = os.environ.get('PROGRAMFILES(X86)', progfiles)
    chrome = os.path.join(progfiles, 'Google', 'Chrome', 'Application',
                          'chrome.exe')
    if not os.path.exists(chrome):
      Log('CHROME_PATH not found')
      Log('chrome not found in the default location: %s' % chrome)
      Log('@@@STEP_FAILURE@@@')
      sys.exit(1)
    env['CHROME_PATH'] = chrome
  env['NACL_SDK_ROOT'] = os.path.join(sdkroot, 'pepper_23')
  RunCommand('test.bat', env)
  env['NACL_SDK_ROOT'] = os.path.join(sdkroot, 'pepper_canary')
  RunCommand('test.bat', env)


def _FindInPath(filename):
  for path in os.environ['PATH'].split(os.pathsep):
    result = os.path.join(path, filename)
    if os.path.exists(result):
      return result

  Log('%s not found in PATH' % filename)
  Log('@@@STEP_FAILURE@@@')
  sys.exit(1)


def _GetGsutil():
  if os.environ.get('BUILDBOT_BUILDERNAME'):
    # When running in a buildbot slave use
    # gsutil from the slave scripts folder
    import slave
    slave_dir = os.path.dirname(slave.__file__)
    gsutil = os.path.join(slave_dir, 'gsutil')
    if os.name == 'nt':
      gsutil += '.bat'
    gsutil = [gsutil]
  else:
    if os.name == 'nt':
      gsutil = [sys.executable, _FindInPath('gsutil')]
    else:
      gsutil = ['gsutil']

  return gsutil


def StepArchive():
  rev = os.environ.get('BUILDBOT_GOT_REVISION')
  if not rev:
    Log('No BUILDBOT_GOT_REVISION found in environ')
    Log('@@@STEP_FAILURE@@@')
    sys.exit(1)
  Log('@@@BUILD_STEP Archiving %s@@@' % rev)
  basename = 'vs_addin.tgz'
  remote_name = '%s/%s/%s' % (GSPATH, rev, basename)
  local_filename = os.path.join('..', '..', 'out',
                                'vs_addin', basename)
  cmd = _GetGsutil()
  cmd += ['cp', '-a', 'public-read', local_filename,
          'gs://' + remote_name]
  RunCommand(cmd)
  url = "%s/%s" % (GSURL, remote_name)
  Log('@@@STEP_LINK@download@%s@@@' % url)


def main():
  StepBuild()
  StepInstall()
  StepInstallSDK()
  StepTest()
  StepArchive()


if __name__ == '__main__':
  main()
