#!/bin/bash -e
# Copyright 2015 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

function set_untar_flags {
  # Some tar implementations emit verbose timestamp warnings, allowing the ability to disable them
  # via --warning=no-timestamp (which we want to do in that case). To find out if we have one of
  # those implementations, we see if help returns an error for that flag.
  SUPPRESS_TAR_TS_WARNINGS="--warning=no-timestamp"
  tar $SUPPRESS_TAR_TS_WARNINGS --help &> /dev/null && TAR_X_FLAGS=$SUPPRESS_TAR_TS_WARNINGS
  # echo this so function doesn't return 1
  echo $TAR_X_FLAGS
}

# Untars a gzipped archived to an output dir. Lazily creates dir if it doesn't exit
function untar {
  if (( $# < 2 )); then
    echo "Usage: untar <tar_file> <output_dir>" >&2
    echo "Args passed: $@" >&2
    exit 1
  fi
  [ -d "$2" ] || mkdir -p $2
  echo tar xfz $1 -C $2 $TAR_X_FLAGS
  tar xfz $1 -C $2 $TAR_X_FLAGS
}

function test_write() {
  local file="$1"
  while [ "$file" != "/" ] && [ -n "${file}" ] && [ ! -e "$file" ]; do
    file="$(dirname "${file}")"
  done
  [ -w "${file}" ] || {
    echo >&2
    echo "The Heron installer must have write access to $1!" >&2
    echo >&2
    usage
  }
}

# Test for unzip dependencies
function check_unzip() {
  if ! which unzip >/dev/null; then
    echo >&2
    echo "unzip not found, please install the corresponding package." >&2
    echo "See $getting_started_url for more information on" >&2
    echo "dependencies of Heron." >&2
    exit 1
  fi
}

# Test for tar dependencies
function check_tar() {
  if ! which tar >/dev/null; then
    echo >&2
    echo "tar not found, please install the corresponding package." >&2
    echo "See $getting_started_url for more information on" >&2
    echo "dependencies of Heron." >&2
    exit 1
  fi
}

# Test for java dependencies
function check_java() {
  if [ -z "${JAVA_HOME-}" ]; then
    case "$(uname -s | tr 'A-Z' 'a-z')" in
      linux)
        JAVA_HOME="$(readlink -f $(which javac) 2>/dev/null | sed 's_/bin/javac__')" || true
        BASHRC="~/.bashrc"
        ;;
      freebsd)
        JAVA_HOME="/usr/local/openjdk8"
        BASHRC="~/.bashrc"
        ;;
      darwin)
        JAVA_HOME="$(/usr/libexec/java_home -v ${JAVA_VERSION}+ 2> /dev/null)" || true
        BASHRC="~/.bash_profile"
        ;;
    esac
  fi
  if [ ! -x "${JAVA_HOME}/bin/javac" ]; then
    echo >&2
    echo "Java not found, please install the corresponding package" >&2
    echo "See $getting_started_url for more information on" >&2
    echo "dependencies of Heron." >&2
    exit 1
  fi
}

set_untar_flags
