#!/bin/sh

# Make sure that we are in the right directory.
if test ! -f configure.ac; then
    cat >&2 <<__EOF__

You must run bootstrap from the root of the distribution.

__EOF__
    exit 1
fi

# Helper functions to get the absolute path of a directory as well as compute
# the relative path between two directories.
# Unfortunately these functions are not as readable as, say, python's
# os.path.relpath method, but they allow us to avoid a hard dependence on
# python or other tools during bootstrap.
abspath() {
    cd "`dirname "${1}"`"
    echo "${PWD}"/"`basename "${1}"`"
    cd "${OLDPWD}"
}
relpath() {
  local from to up
  from="`abspath "${1%/}"`" to="`abspath "${2%/}"/`"
  while test "${to}"  = "${to#"${from}"/}" \
          -a "${to}" != "${from}"; do
    from="${from%/*}" up="../${up}"
  done
  to="${up%/}${to#${from}}"
  echo "${to:-.}"
}

# Grab a reference to the repo's git directory. Usually this is simply .git in
# the repo's top level directory. However, when submodules are used, it may
# appear elsewhere. The most up-to-date way of finding this directory is to use
# `git rev-parse --git-common-dir`. This is necessary to support things like
# git worktree in addition to git submodules. However, as of January 2016,
# support for the '--git-common-dir' flag is fairly new, forcing us to fall
# back to the older '--git-dir' flag if '--git-common-dir' is not supported. We
# do this by checking the output of `git rev-parse --git-common-dir` and seeing
# if it gives us a valid directory back. If not, we set the git directory using
# the '--git-dir' flag instead.
_gitdir=`git rev-parse --git-common-dir`
if test ! -d "${_gitdir}"; then
  _gitdir=`git rev-parse --git-dir`
fi

# Grab a reference to the git hooks directory as well as the relative path from
# the git hooks directory to the current directory.
_hooksdir=${_gitdir}/hooks
_relpath=`relpath "${_hooksdir}" "${PWD}"`

# Install mesos default hooks and gitignore template.
if test ! -e "${_hooksdir}/pre-commit"; then
  ln -s "${_relpath}/support/hooks/pre-commit" "${_hooksdir}/pre-commit"
fi

if test ! -e "${_hooksdir}/post-rewrite"; then
  ln -s "${_relpath}/support/hooks/post-rewrite" "${_hooksdir}/post-rewrite"
fi

if test ! -e "${_hooksdir}/commit-msg"; then
  ln -s "${_relpath}/support/hooks/commit-msg" "${_hooksdir}/commit-msg"
fi

if test ! -e .gitignore; then
  ln -s support/gitignore .gitignore
fi

if test ! -e .reviewboardrc; then
  ln -s support/reviewboardrc .reviewboardrc
fi

if test ! -e .clang-format; then
  ln -s support/clang-format .clang-format
fi

if test ! -e .clang-tidy; then
  ln -s support/clang-tidy .clang-tidy
fi

if [ -n "$AUTOMAKE" ] || [ -n "$ACLOCAL" ] ; then
    if [ -z "$ACLOCAL" ] || [ -z "$AUTOMAKE" ] ; then
        _present="AUTOMAKE"
        _missing="ACLOCAL"

        [ -n "$ACLOCAL" ] && _present="ACLOCAL" && _missing="AUTOMAKE"

        cat >&2 <<__EOF__

[ERROR]: You are providing the path to ${_present}
through your environment but no reference to ${_missing}.
To fix this error please specify ${_missing} too.

As an example, if you are using automake-1.12 and have
available aclocal-1.12 you will want to do the following:

    AUTOMAKE="/usr/local/bin/automake-1.12" \\
    ACLOCAL="/usr/local/bin/aclocal-1.12"   \\
    ./bootstrap

Your current environment has:
    AUTOMAKE="$AUTOMAKE"
    ACLOCAL="$ACLOCAL"

__EOF__
        exit 1
    fi
else
    AUTOMAKE="$(which automake)"
fi


# Note that we don't use '--no-recursive' because older versions of
# autoconf/autoreconf bail with that option. Unfortunately this means
# that we'll modify a lot of files in 3rdparty/libprocess, but that
# may change in the future.

autoreconf --install -Wall --verbose "${@}"
