#!/usr/bin/env python

# Copyright 2016 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This script will update Skia's dependencies as necessary.

# Depends on: Python, Git, and depot_tools.

# To retreive and use all optional deps:
#
#   python bin/sync --deps=all

import hashlib
import os
import subprocess
import sys

skia_dir = os.path.join(os.path.dirname(__file__), os.pardir)

skia_opt_deps = [arg for arg in sys.argv[1:] if arg.startswith('--deps=')]

os.chdir(skia_dir)

if not os.path.isfile('DEPS'):
  sys.stderr.write('DEPS file missing')
  exit(1)

deps_hasher = hashlib.sha1()
with open('DEPS', 'r') as f:
  deps_hasher.update(f.read())
deps_hasher.update(repr(skia_opt_deps))
deps_hash = deps_hasher.hexdigest()
current_deps_hash = None
if os.path.isfile('.deps_sha1'):
  with open('.deps_sha1', 'r') as f:
    current_deps_hash = f.read().strip()

default_gclient_config = '''
solutions = [
  { "name"        : ".",
    "url"         : "https://skia.googlesource.com/skia.git",
    "deps_file"   : "DEPS",
    "managed"     : False,
    "custom_deps" : {
    },
    "safesync_url": "",
  },
]
cache_dir = None
'''

# Must use gclient.bat rather than gclient on windows (at least on mingw)
gclient = 'gclient'
if sys.platform == 'win32' or sys.platform == 'cygwin':
  gclient = 'gclient.bat'

if current_deps_hash != deps_hash:
  # `gclient sync` is very slow, so skip whenever we can.
  try:
    subprocess.call([gclient, '--version'])
  except:
    sys.stdout.write('gclient missing from $PATH, please install ' +
                     'depot_tools\n    https://skia.org/user/quick/desktop\n')
    exit(1)
  if not os.path.isfile('.gclient'):
    with open('.gclient', 'w') as o:
      o.write(default_gclient_config)
  for command in [[gclient, 'sync'] + skia_opt_deps,
                  ['python', os.path.join('bin', 'fetch-gn')]]:
    try:
      sys.stdout.write('%r\n' % command)
      subprocess.check_call(command)
    except:
      sys.stderr.write('\n%r failed.\n' % command)
      try:
        os.remove('.deps_sha1')  # Unknown state.
      except:
        pass
      exit(1)
  # Only write hash after a successful sync.
  with open('.deps_sha1', 'w') as o:
    o.write(deps_hash)
