#!/bin/sh
if [ ! -z "${BUILDER_VERSION}" ]; then
  printf ${BUILDER_VERSION}
  exit 0
fi

VERSION="unknown"

DIRTY=""
git status | grep -q clean || DIRTY='.dirty'

# Special environment variable to signal that we are building a release, as this
# has condequenses for the version number.
if [ "${IS_RELEASE}" = "YES" ]; then
  TAG="$(git describe --tags --exact-match 2> /dev/null | cut -d- -f 2-)"
  if [ -n "${TAG}" ]; then
    # We're on a tag
    echo "${TAG}${DIRTY}" > .version
    printf "${TAG}${DIRTY}"
    exit 0
  fi
  echo 'This is not a tag, either tag this commit or do not set $IS_RELEASE' >&2
  exit 1
fi

#
# Generate the version number based on the branch
#
if [ ! -z "$(git rev-parse --abbrev-ref HEAD 2> /dev/null)" ]; then
  GIT_VERSION=""
  if $(git rev-parse --abbrev-ref HEAD | grep -q 'rel/'); then
    REL_TYPE="$(git rev-parse --abbrev-ref HEAD | cut -d/ -f 2 | cut -d- -f 1)"
    GIT_VERSION="$(git describe --match=${REL_TYPE}-* --tags | cut -d- -f2-)"
  fi

  LAST_TAG="$(echo ${GIT_VERSION} | cut -d- -f1)"
  COMMITS_SINCE_TAG="$(echo ${GIT_VERSION} | cut -d- -f2)"
  GIT_HASH="$(echo ${GIT_VERSION} | cut -d- -f3)"

  if [ -z "${GIT_VERSION}" ]; then
    # We used 0.0.XXXXgHASH for master in the previous incarnation of our build pipeline.
    # This now becomes 0.0.XXXX.0.gHASH, as 0.0.0.XXXX.gHASH (which is more correct)
    # would break upgrades for those running master
    # This _should_ be ok for forever is we stick to X.Y.Z for version numbers
    LAST_TAG=0.0
    COMMITS_SINCE_TAG="$(git rev-list --count 12c868770afc20b6cc0da439d881105151d557dd..HEAD 2> /dev/null).0"
    [ "${COMMITS_SINCE_TAG}" = ".0" ] && COMMITS_SINCE_TAG=0.0
    GIT_HASH="$(git rev-parse HEAD | cut -c1-10 2> /dev/null)"
  fi

  BRANCH=".$(git rev-parse --abbrev-ref HEAD | perl -p -e 's/[^[:alnum:]]//g;')"
  [ "${BRANCH}" = ".master" ] && BRANCH=''

  TAG="$(git describe --tags --exact-match 2> /dev/null | cut -d- -f 2-)"
  if [ -n "${TAG}" ]; then # We're exactly on a tag
    COMMITS_SINCE_TAG="0"
    GIT_HASH="g$(git show --no-patch --format=format:%h HEAD 2>/dev/null)"
    if [ -z "$GIT_HASH" ]; then
      GIT_HASH="g$(git show --format=format:%h HEAD | head -n1)"
    fi
  fi

  VERSION="${LAST_TAG}.${COMMITS_SINCE_TAG}${BRANCH}.g${GIT_HASH}${DIRTY}"
fi

printf $VERSION
