#!/usr/bin/env bash

set -e -o pipefail
commit="$1"
versionglob="v[0-9].[0-9]*.[0-9]*"
devsuffix=".dev"
if [ -z "$commit" ]; then
  commit=`git log -n1 --first-parent "--format=format:%h"`
fi

# automatically assign version
#
# handles the following cases:
#
# 0. no tags on the repository. Print "dev".
#
# 1. no local modifications and commit is directly tagged. Print tag.
#
# 2. no local modifications and commit is not tagged. Take greatest version tag in repo X.Y.Z and assign X.Y.(Z+1). Print that + $devsuffix + $timestamp.
#
# 3. local modifications. Print "dev".

tags=$(git tag)
if [[ -z "$tags" ]]; then
  echo "dev"
elif `git diff --quiet 2>/dev/null`; then
  tagged=$(git tag --points-at "$commit")
  if [[ -n "$tagged" ]] ; then
    echo $tagged
  else
    nearest_tag=$(git describe --tags --abbrev=0 --match "$versionglob" "$commit")
    v=$(echo $nearest_tag | perl -pe 's/(\d+)$/$1+1/e')
    isodate=$(TZ=UTC git log -n1 --format=%cd --date=iso "$commit")
    ts=$(TZ=UTC date --date="$isodate" "+%Y%m%d%H%M%S")
    echo "${v}${devsuffix}${ts}"
  fi
else
  echo "dev"
fi