#!/usr/bin/env bash
# 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.

# This script will try to sync the bootstrap directories and then defer control.

if [ "$USER" == "root" ];
then
  echo Running depot tools as root is sad.
  exit
fi

# Test if this script is running under a MSYS install. This is likely an error
# if it is, so we warn the user accordingly.
OUTPUT="$(uname | grep 'MSYS')"
MSYS=$?
if [ $MSYS = 0 ]; then
  echo 'WARNING: It looks like you are running these tools from an MSYS shell'
  echo '(as opposed to a MinGW shell). This shell is not supported and may'
  echo 'fail in mysterious ways.'
  echo
  echo 'To run the supported MinGW shell, use `git bash`, or use `bin/bash.exe`'
  echo 'in your MinGW installation, as opposed to `usr/bin/bash.exe`.'
  echo
fi

# Test if this script is running under a MinGW install.  If it is, we will
# hardcode the paths to Git where possible.
OUTPUT="$(uname | grep 'MINGW')"
MINGW=$?

if [ $MINGW = 0 ]; then
  base_dir="${0%/*}"
else
  base_dir=$(dirname "$0")
  if [ -L "$base_dir" ]; then
    base_dir=`cd "$base_dir" && pwd -P`
  fi
fi

if [ -e "$base_dir/.disable_auto_update" ]; then
  exit
fi

# We want to update the bundled tools even under MinGW.
if [ $MINGW = 0 ]; then
  $COMSPEC //c `cygpath -w "$base_dir/bootstrap/win_tools.bat"`
  case $? in
    123)
      # msys environment was upgraded, need to quit.
      exit 123
      ;;
    0)
      ;;
    *)
      exit $?
  esac
fi

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

GIT="git"
if [ -e "$base_dir/git.bat" -a $MINGW = 0 ]; then
  GIT="cmd.exe //c \"$base_dir\\git.bat\""
fi

# Test git and git --version.
function test_git {
  local GITV
  GITV="$(eval "$GIT" --version)" || {
    echo "git isn't installed, please install it"
    exit 1
  }

  GITV="${GITV##* }"          # Only examine last word (i.e. version number)
  local GITD=( ${GITV//./ } ) # Split version number into decimals
  if ((GITD[0] < 1 || (GITD[0] == 2 && GITD[1] < 8) )); then
    echo "git version is ${GITV}, please update to a version later than 2.8"
    exit 1
  fi
}

function update_git_repo {
  remote_url=$(eval "$GIT" config --get remote.origin.url)
  if [ -n "$remote_url" -a "$remote_url" != "$CANONICAL_GIT_URL" ]; then
    echo "Your copy of depot_tools is configured to fetch from an obsolete URL:"
    echo
    echo "  $remote_url"
    echo
    read -t 60 -p "OK to update it to $CANONICAL_GIT_URL ? [Y/n] " -n 1
    STATUS=$?
    echo
    if [[ $STATUS -ne 0 ]]; then
      echo "Timeout; not updating remote URL."
    elif [ -z "$REPLY" -o "$REPLY" = "Y" -o "$REPLY" = "y" ]; then
      eval "$GIT" config remote.origin.url "$CANONICAL_GIT_URL"
      echo "Remote URL updated."
    fi
  fi

  git fetch -q origin &> /dev/null
  local CHECKOUT_TXT STATUS
  CHECKOUT_TXT=$(git checkout -q origin/master 2>&1)
  STATUS=$?
  if [[ $STATUS -ne 0 ]]; then
    echo "depot_tools update failed. Conflict in $base_dir" >&2
    echo "$CHECKOUT_TXT" >&2
  fi
  # Having python3 on depot_tools causes problems if users put depot_tools in
  # PATH before system's python3, so remove it if present.
  # See crbug.com/1017812.
  if [[ -e python3 ]]; then
    rm python3
  fi
  return $STATUS
}

# Update git checkouts.
if [ "X$DEPOT_TOOLS_UPDATE" != "X0" ]; then
  if [ -e "$base_dir/.git" ]; then
    cd "$base_dir"
    update_git_repo
    cd - > /dev/null
  fi

  # Sync CIPD-boostrapped packages.
  source "$base_dir/cipd_bin_setup.sh"
  cipd_bin_setup

  # Don't bootstrap Python 3 on windows, since it is already done by
  # bootstrap/win_tools.bat.
  if [ "X$MINGW" != "X0" -a "X$DEPOT_TOOLS_BOOTSTRAP_PYTHON3" != "X0" ]; then
    source "$base_dir/bootstrap_python3"
    bootstrap_python3
  fi
fi

