#!/bin/sh

# Generate a version string for use when building.
#
# * If RELEASE exists, and is non-empty, use the contents of that file.
#   This is in case we're building from a tarball.
#
# * If we're inside a git tree:
#   - For the "master" branch, use "git describe".
#   - For "detached" branches (mostly for tag checkouts), also use "git describe".
#   - For other branches, use a "$VERSION-$NBCOMMITS-$BRANCH-$DATE-g$COMMIT"
#     sortof version.
#
# * Try to make it up from the directory name (munin-2.0.1 -> 2.0.1)
#
# * If we're still looking for a version, just fallback to "unknown".
#
# NOTE: please keep this file as portable as possible (more strict than for plugins).
# Probably unexpected portability issues include:
# * '$(...)' is not supported by /bin/sh on Solaris
#
# Override shellcheck warnings due to portability constraints
# shellcheck disable=SC2006


current_git_branch() {
    # hide stderr (for detached HEADs)
    GB=`LANG= git branch 2>/dev/null | awk '$1 == "*" {print $2}'`
    case $GB in

        # git checkout 402c6d6
        # git branch
        # * (detached from 402c6d6)
        #   devel
        # --> This is new with git 1.8+
        "(detached" ) echo "detached";;

        # git checkout 2.0.9
        # git branch
        # * (no branch)
        #   devel
        "(no" ) echo;;

        *     ) echo "$GB";;
    esac
}


generate_version_string() {
    branch=`current_git_branch`
    case "$branch" in
        ""|master|devel|stable-*)
            git describe
            ;;
        *)
            branch=`echo "$branch" | sed -e 's/[^0-9A-Za-z\.\-\_]/_/g'`
            # "foo | read VAR" does *not* work (variable is changed only in subshell)
            # workaround stolen from http://www.etalabs.net/sh_tricks.html
            read -r VERSION COMMITS <<EOF
`git describe --long | perl -lne 'print "$1 $2" if m/(.*)-(\d+)-g\w+/'`
EOF
            # As git describe, we also use the "-g" magic string to denote a git hash
            git log -n 1 --pretty="${VERSION}-${branch}-%ad-c${COMMITS}-g%h" --date=short
            ;;
    esac
}


generate_version_string_from_dir() {
    basename "`pwd`" | grep -e '^munin-' | cut -c 7-
}


if [ -s "RELEASE" ]; then
    cat RELEASE
elif [ "`git rev-parse --is-inside-work-tree 2>/dev/null`" = "true" ]; then
    generate_version_string
elif [ -n "`generate_version_string_from_dir`" ]; then
    generate_version_string_from_dir
else
    echo "unknown"
fi
