#!/usr/bin/env python2

import optparse
import os
import shutil
import subprocess
import sys

upstream_git = 'https://github.com/catapult-project/catapult.git'
PACKAGE_DIRS = [
    'common',
    'dependency_manager',
    'devil',
    'systrace',
    'third_party/pyserial',
    'third_party/polymer',
    'tracing/tracing/trace_data',
]
PACKAGE_FILES = [
    'tracing/tracing/__init__.py',
    'tracing/tracing_project.py',
]
IGNORE_PATTERNS = ['OWNERS'] # doesn't make sense to sync owners files

script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
catapult_src_dir = os.path.join(script_dir, 'catapult-upstream')
catapult_dst_dir = os.path.join(script_dir, 'catapult')

parser = optparse.OptionParser()
parser.add_option('--local', dest='local_dir', metavar='DIR',
                  help='use a local catapult')
parser.add_option('--no-min', dest='no_min', default=False, action='store_true',
                  help='skip minification')
options, args = parser.parse_args()

## Update the source if needed.
if options.local_dir is None:
  # Remove the old source tree.
  shutil.rmtree(catapult_src_dir, True)

  # Pull the latest source from the upstream git.
  git_args = ['git', 'clone', upstream_git, catapult_src_dir]
  p = subprocess.Popen(git_args, stdout=subprocess.PIPE, cwd=script_dir)
  p.communicate()
  if p.wait() != 0:
    print 'Failed to checkout source from upstream git.'
    sys.exit(1)

  catapult_git_dir = os.path.join(catapult_src_dir, '.git')
  # Update the UPSTREAM_REVISION file
  git_args = ['git', 'rev-parse', 'HEAD']
  p = subprocess.Popen(git_args,
                       stdout=subprocess.PIPE,
                       cwd=catapult_src_dir,
                       env={"GIT_DIR":catapult_git_dir})
  out, err = p.communicate()
  if p.wait() != 0:
    print 'Failed to get revision.'
    sys.exit(1)

  shutil.rmtree(catapult_git_dir, True)

  rev = out.strip()
  with open('UPSTREAM_REVISION', 'wt') as f:
    f.write(rev + '\n')
else:
  catapult_src_dir = options.local_dir


## Update systrace_trace_viewer.html
systrace_dir = os.path.join(catapult_src_dir, 'systrace', 'systrace')
sys.path.append(systrace_dir)
import update_systrace_trace_viewer
update_systrace_trace_viewer.update(no_auto_update=True, no_min=options.no_min)

## Package the result
shutil.rmtree(catapult_dst_dir)

for d in PACKAGE_DIRS:
  src = os.path.join(catapult_src_dir, d)
  dst = os.path.join(catapult_dst_dir, d)

  # make parent dir by creating dst + ancestors, and deleting dst
  if not os.path.isdir(dst):
    os.makedirs(dst)
  shutil.rmtree(dst)

  # copy tree
  shutil.copytree(src, dst, ignore=shutil.ignore_patterns(*IGNORE_PATTERNS))

for f in PACKAGE_FILES:
  src = os.path.join(catapult_src_dir, f)
  dst = os.path.join(catapult_dst_dir, f)
  shutil.copy(src, dst)
