#!/bin/bash

print_help() {
	echo "$(basename "$0") NEW_VERSION SO_VERSION"
	echo -e "\n\033[1mNEW_VERSION format: MAJOR.MINOR.PATCH\033[0m"
	echo -e "\n\033[1mSO_VERSION format: C:A:R\033[0m"
	echo -e "Versioning scheme shamelessly copied from libexif."
	echo -e "Short walkthrough. C means CURRENT, A mean AGE, R means REVISION"
	echo -e "1) When you make a change that breaks binary compatibility, increment CURRENT, reset REVISION to 0 and:"
	echo -e "  1.1) If the change doesn't remove or change interfaces, increment AGE, otherwise reset to 0."
	echo -e "2) When you make just a source change that doesn't break binary compatibility, increment REVISION."
	echo -e "3) When you make a change that adds features, increment AGE, and set REVISION to 0"
}

if [[ $# -lt 2 ]]; then
	print_help
	exit 1
fi

GIT_DIR="$(git rev-parse --show-toplevel)"
OLD_VERSION="$(git describe --tags --abbrev=0 | sed 's/^v//')"
NEW_VERSION="$1"
SO_VERSION="$2"
DATE="$(date '+%Y-%m-%d')"

if ! [[ "$NEW_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
	echo "NEW_VERSION must contain dots (e.g. '0.6.2')"
	print_help
	exit 1
fi

if ! [[ "$SO_VERSION" =~ ^[0-9]+\:[0-9]+\:[0-9]+$ ]]; then
	echo "SO_VERSION must contain colons (e.g. '16:0:2')"
	print_help
	exit 1
fi

IFS=':' read -a so_version_array <<< "$SO_VERSION"
LIBCPUID_CURRENT="${so_version_array[0]}"
LIBCPUID_AGE="${so_version_array[1]}"
LIBCPUID_REVISION="${so_version_array[2]}"
echo "$DATE: bumping libcpuid version from $OLD_VERSION to $NEW_VERSION"
echo "LIBCPUID_CURRENT=$LIBCPUID_CURRENT LIBCPUID_AGE=$LIBCPUID_AGE LIBCPUID_REVISION=$LIBCPUID_REVISION"

echo -e "\nVersion $NEW_VERSION ($DATE):" >> "$GIT_DIR/ChangeLog"
sed -i "s|\[$OLD_VERSION\]|\[$NEW_VERSION\]|" "$GIT_DIR/configure.ac"
sed -i "s|LIBCPUID_CURRENT=.*|dnl $SO_VERSION   Version $NEW_VERSION:\nLIBCPUID_CURRENT=$LIBCPUID_CURRENT|" "$GIT_DIR/configure.ac"
sed -i "s|LIBCPUID_AGE=.*|LIBCPUID_AGE=$LIBCPUID_AGE|" "$GIT_DIR/configure.ac"
sed -i "s|LIBCPUID_REVISION=.*|LIBCPUID_REVISION=$LIBCPUID_REVISION|" "$GIT_DIR/configure.ac"
sed -i "s|VERSION \"$OLD_VERSION\"|VERSION \"$NEW_VERSION\"|" "$GIT_DIR/CMakeLists.txt"
sed -i "s|set(LIBCPUID_CURRENT .*)|set(LIBCPUID_CURRENT $LIBCPUID_CURRENT)|" "$GIT_DIR/CMakeLists.txt"
sed -i "s|set(LIBCPUID_AGE .*)|set(LIBCPUID_AGE $LIBCPUID_AGE)|" "$GIT_DIR/CMakeLists.txt"
sed -i "s|set(LIBCPUID_REVISION .*)|set(LIBCPUID_REVISION $LIBCPUID_REVISION)|" "$GIT_DIR/CMakeLists.txt"
sed -i "s|$OLD_VERSION|$NEW_VERSION|g" "$GIT_DIR/libcpuid/"{Makefile.x64,Makefile.x86,libcpuid.dsp,libcpuid_vc10.vcxproj,libcpuid_vc71.vcproj}
sed -i "s|\\\version  $OLD_VERSION|\\\version  $NEW_VERSION|" "$GIT_DIR/libcpuid/libcpuid.h"

echo "Model from https://github.com/anrieff/libcpuid/commit/a6123e8139ce73e26b5711c3e119b5b2bc9c9378"
echo -e "Also, make appropriate changes in follow files:\n- ChangeLog\n- configure.ac\n- libcpuid/libcpuid.h"
echo -e "\nCommits since last tag:"
git log --graph --decorate --oneline --color --first-parent master $(git tag | tail -n1)..master
