# This file collects git info and create a julia file with the GIT_VERSION_INFO struct

echo "# This file was autogenerated in base/version_git.sh"
echo "immutable GitVersionInfo"
echo "    commit::String"
echo "    commit_short::String"
echo "    branch::String"
echo "    build_number::Int"
echo "    date_string::String"
echo "    tagged_commit::Bool"
echo "    fork_master_distance::Int"
echo "    fork_master_timestamp::Float64"
echo "end"
echo ""

# If the script didn't ask not to use git info
if [  "$#" = "1"  -a "$1" = "NO_GIT" ]; then
    # this comment is used in base/Makefile to distinguish boilerplate
    echo "# Default output if git is not available."
    echo "const GIT_VERSION_INFO = GitVersionInfo(\"\" ,\"\" ,\"\" ,0 ,\"\" ,true ,0 ,0.)"
    exit 0
fi
# Collect temporary variables
origin=$(git config -l 2>/dev/null | grep 'remote\.\w*\.url.*JuliaLang/julia.git' | sed -n 's/remote\.\([a-zA-Z]*\)\..*/\1\//p')
last_tag=$(git describe --tags --abbrev=0)
git_time=$(git log -1 --pretty=format:%ct)

#collect the contents
commit=$(git rev-parse HEAD)
commit_short=$(git rev-parse --short HEAD)
if [ -n "$(git status --porcelain)" ]; then
    # append dirty mark '*' if the repository has uncommited changes
    commit_short="$commit_short"*
fi
branch=$(git branch | sed -n '/\* /s///p')
# Some versions of wc (eg on OS X) add extra whitespace to their output.
# The sed(1) call stops this from breaking the generated Julia's indentation by
# stripping all non-digits.
build_number=$(git rev-list HEAD ^$last_tag | wc -l | sed -e 's/[^[:digit:]]//g')

date_string=$git_time
case $(uname) in
  Darwin | FreeBSD)
    date_string="$(/bin/date -jr $git_time -u '+%Y-%m-%d %H:%M %Z')"
    ;;
  MINGW*)
    git_time=$(git log -1 --pretty=format:%ci)
    date_string="$(/bin/date --date="$git_time" -u '+%Y-%m-%d %H:%M %Z')"
    ;;
  *)
    date_string="$(/bin/date --date="@$git_time" -u '+%Y-%m-%d %H:%M %Z')"
    ;;
esac
if [ $(git describe --tags --exact-match 2> /dev/null) ]; then
    tagged_commit="true"
else
    tagged_commit="false"
fi
fork_master_distance=$(git rev-list HEAD ^"$(echo $origin)master" | wc -l | sed -e 's/[^[:digit:]]//g')
fork_master_timestamp=$(git show -s $(git merge-base HEAD $(echo $origin)master) --format=format:"%ct")

# Check for errrors and emit default value for missing numbers.
if [ -z "$build_number" ]; then
    build_number="0"
fi
if [ -z "$fork_master_distance" ]; then
    fork_master_distance="-1"
fi
if [ -z "$fork_master_timestamp" ]; then
    fork_master_timestamp="0"
fi

echo "const GIT_VERSION_INFO = GitVersionInfo("
echo "    \"$commit\","
echo "    \"$commit_short\","
echo "    \"$branch\","
echo "    $build_number,"
echo "    \"$date_string\","
echo "    $tagged_commit,"
echo "    $fork_master_distance,"
echo "    $fork_master_timestamp."
echo ")"
