#!/usr/bin/env python
# Copyright 2017 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import shutil
import stat
import subprocess

DEPOT_TOOLS_URL = \
  "https://chromium.googlesource.com/chromium/tools/depot_tools.git"

def EnsureDepotTools(v8_path, fetch_if_not_exist):
  def _Get(v8_path):
    depot_tools = os.path.join(v8_path, "_depot_tools")
    try:
      gclient_path = os.path.join(depot_tools, "gclient")
      gclient_check = subprocess.check_output([gclient_path, "--version"])
      if "gclient.py" in gclient_check:
        return depot_tools
    except:
      pass
    if fetch_if_not_exist:
      print "Checking out depot_tools."
      subprocess.check_call(["git", "clone", DEPOT_TOOLS_URL, depot_tools])
      return depot_tools
    return None
  depot_tools = _Get(v8_path)
  assert depot_tools is not None
  print "Using depot tools in %s" % depot_tools
  return depot_tools

def UninitGit(v8_path):
  print "Uninitializing temporary git repository"
  target = os.path.join(v8_path, ".git")
  if os.path.isdir(target):
    print ">> Cleaning up %s" % target
    def OnRmError(func, path, exec_info):
      # This might happen on Windows
      os.chmod(path, stat.S_IWRITE)
      os.unlink(path)
    shutil.rmtree(target, onerror=OnRmError)
