#!/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

base_dir=$(dirname "$0")
if [ -L "$base_dir" ]
then
    base_dir=`cd "$base_dir" && pwd -P`
fi

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

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

SVN="svn"
if [ -d "$base_dir/svn_bin" -a $MINGW = 0 ]; then
  SVN="$base_dir/svn_bin/svn.exe"
fi

GIT="git"
if [ -d "$base_dir/git-1.8.0_bin" -a $MINGW = 0 ]; then
  GIT="$base_dir/git-1.8.0_bin/bin/git.exe"
fi

# Test git and git --version.
function test_git {
  local GITV
  GITV="$("$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] == 1 && GITD[1] < 6) )); then
    echo "git version is ${GITV}, please update to a version later than 1.6"
    exit 1
  fi
}

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

  GITV="${GITV#* version }"   # git svn --version has extra output to remove.
  GITV="${GITV% (svn*}"
  local GITD=( ${GITV//./ } ) # Split version number into decimals
  if ((GITD[0] < 1 || (GITD[0] == 1 && GITD[1] < 6) )); then
    echo "git version is ${GITV}, please update to a version later than 1.6"
    exit 1
  fi
}

function is_git_clone_repo {
  "$GIT" config remote.origin.fetch > /dev/null
}

function update_git_repo {
  remote_url=$("$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
      "$GIT" config remote.origin.url "$CANONICAL_GIT_URL"
      echo "Remote URL updated."
    fi
  fi

  if is_git_clone_repo; then
    git fetch -q origin &> /dev/null
    local REBASE_TXT STATUS
    REBASE_TXT=$(git rebase -q origin/master 2>&1)
    STATUS=$?
    if [[ $STATUS -ne 0 ]]; then
      echo "depot_tools update failed. Conflict in $base_dir" >&2
      echo "$REBASE_TXT" >&2
      git rebase --abort 2> /dev/null
    fi
    return $STATUS
  fi

  test_git_svn
  # work around a git-svn --quiet bug
  OUTPUT=`"$GIT" svn rebase -q -q`
  if [[ ! "$OUTPUT" == *Current.branch* ]]; then
    echo $OUTPUT 1>&2
  fi
  return 0
}

# Get the current SVN revision.
get_svn_revision() {
  LANGUAGE=C "$SVN" info "$base_dir" | \
      awk -F': ' '{ if ($1 == "Last Changed Rev") { print $2 }}'
}

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

# We're on POSIX. We can now safely look for svn checkout.
if [ "X$DEPOT_TOOLS_UPDATE" != "X0" -a -e "$base_dir/.svn" ]
then
  # Update the root directory to stay up-to-date with the latest depot_tools.
  BEFORE_REVISION=$(get_svn_revision)
  "$SVN" -q up "$base_dir"
  AFTER_REVISION=$(get_svn_revision)
  if [[ "$BEFORE_REVISION" != "$AFTER_REVISION" ]]; then
    echo "Depot Tools has been updated to revision $AFTER_REVISION." 1>&2
  fi
fi

find "$base_dir" -iname "*.pyc" -exec rm {} \;
