#!/bin/sh

set -eu

# Detect git hosting platform and set the appropriate tag URL pattern
remote_url=$(git config --get remote.origin.url) || {
    echo "Error: No git remote configured" >&2
    exit 1
}
case "${remote_url}" in
    *github.com*)
        # GitHub uses /releases/tag/vX.Y.Z
        tag_url_suffix="/releases/tag"
        ;;
    *)
        # GitLab uses /-/tags/vX.Y.Z
        tag_url_suffix="/-/tags"
        ;;
esac

current_version=$(python3 -c "import ${MODULE}; print(${MODULE}.__version__)")
version=${VERSION:-}
if [ -z "${version}" ]; then
    version=$(echo ${current_version} | awk -F . '{OFS = "." ; $3 = "0"; $2 += 1; print($0)}')
fi
relnotes=.git/relnotes-${version}.txt
git=${git:-git}

if [ -n "$(git tag --list v${version})" ]; then
    echo "Version ${version} already released. Bump the version in ${MODULE}/__init__.py to make a new release"
    exit 1
fi

if ! git diff-index --exit-code --quiet HEAD; then
    git status
    echo "Commit all changes before releasing"
    exit 1
fi

if [ ! -f ${relnotes} ]; then
    printf "${version} release\n\n" > ${relnotes}
    printf "New features:\n\n" >> ${relnotes}
    printf "Bug fixes:\n\n" >> ${relnotes}
    printf "Documentation updates:\n\n" >> ${relnotes}
    printf "Container images:\n\n" >> ${relnotes}
    (git log --no-merges --reverse --oneline --format='- %s' v${current_version}.. || true) >> ${relnotes}
fi
trap "rm -f ${relnotes}" INT TERM EXIT

${EDITOR} ${relnotes}
echo "Release notes: "
sed -e 's/^/| /' ${relnotes}

read -p "Press ENTER to release version ${version} with the release notes above, or ctrl-c to abort" input

# update version number
sed -i -e "s/^__version__.*/__version__ = \"${version}\"/" ${MODULE}/__init__.py
if [ -f "${PROJECT}.spec" ]; then
    sed -i -e "s/^Version:.*/Version:   ${version}/" ${PROJECT}.spec
    # Update %changelog section with link to release tag
    if grep -q "^%changelog" "${PROJECT}.spec"; then
        sed -i "/^%changelog/a\\
* $(date "+%a %b %d %Y") $(git config user.name) <$(git config user.email)> - ${version}-1\\
- Release ${version}. See: $(git config --get remote.origin.url | sed 's|\.git$||; s|:|/|; s|git@|https://|')${tag_url_suffix}/v${version}\\
" "${PROJECT}.spec"
    fi
fi
if [ -f debian/changelog ]; then
    # Create new changelog entry with link to release tag
    {
        echo "${PROJECT} (${version}-1) UNRELEASED; urgency=medium"
        echo ""
        echo "  * Release ${version}. See: $(git config --get remote.origin.url | sed 's|\.git$||; s|:|/|; s|git@|https://|')${tag_url_suffix}/v${version}"
        echo ""
        echo " -- $(git config user.name) <$(git config user.email)>  $(date -R)"
        echo ""
        cat debian/changelog
    } > debian/changelog.new
    mv debian/changelog.new debian/changelog
fi
if [ -f "${PROJECT}.PKGBUILD" ]; then
    sed -i -e "s/^pkgver=.*/pkgver=${version}/" ${PROJECT}.PKGBUILD
fi
$git commit -s -a -m "Release ${version}"

$git tag --sign --file=${relnotes} v${version}
$git push
$git push --tags
