# Copyright 2015 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 file is designed to be sourced from a bash script whose name takes the
## form 'command-name'. This script will then instead invoke
## '[depot_tools]/command_name.py' correctly under mingw as well
## as posix-ey systems, passing along all other command line flags.

## Example:
## echo ". python_runner.sh" > git-foo-command
## ./git-foo-command  #=> runs `python git_foo_command.py`

## Constants
PYTHONDONTWRITEBYTECODE=1; export PYTHONDONTWRITEBYTECODE

## "Input parameters".
# If set before the script is sourced, then we'll use the pre-set values.
#
# SCRIPT defaults to the basename of $0, with dashes replaced with underscores

# "$0" can have several different formats depending on how the script was called
# and the environment being used, including having different formats even in the
# same environment (e.g. in msys, 'git cl' causes $0 to have a Windows-style
# path, but calling 'git-cl' results in a POSIX-style path), so don't assume a
# particular format.
# First try to split it using Windows format ...
DEPOT_TOOLS="${0%\\*}"
if [[ "$DEPOT_TOOLS" = "$0" ]]; then
  # If that didn't work, try POSIX format ...
  DEPOT_TOOLS="${0%/*}"
  if [[ "$DEPOT_TOOLS" = "$0" ]]; then
    # Sometimes commands will run with no path (e.g. a git command run from
    # within the depot_tools dir itself). In that case, treat it as if run like:
    # "./command"
    DEPOT_TOOLS="."
    BASENAME="$0"
  else
    BASENAME="${0##*/}"
  fi
else
  BASENAME="${0##*\\}"
fi

SCRIPT="${SCRIPT-${BASENAME//-/_}.py}"

# Ensure that "depot_tools" is somewhere in PATH so this tool can be used
# standalone, but allow other PATH manipulations to take priority.
PATH=$PATH:$DEPOT_TOOLS

if [[ $GCLIENT_PY3 = 1 ]]; then
  # Explicitly run on Python 3
  vpython3 "$DEPOT_TOOLS/$SCRIPT" "$@"
elif [[ $GCLIENT_PY3 = 0 ]]; then
  # Explicitly run on Python 2
  vpython "$DEPOT_TOOLS/$SCRIPT" "$@"
else
  # Run on Python 3, allows default to be flipped.
  vpython3 "$DEPOT_TOOLS/$SCRIPT" "$@"
fi
