The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env bash

VERSION="$(grep '^version: ' Meta | cut -d' ' -f2)"
OK=0

error() {
  echo "Error, can't release: $1" >&2
  OK=1
}

prompt() {
  local msg answer default yn=false
  case $# in
    0) msg="${prompt_msg:-Press <ENTER> to continue, or <CTL>-C to exit.}" ;;
    1)
      msg="$1"
      if [[ "$msg" =~ \[yN\] ]]; then
        default=n
        yn=true
      elif [[ "$msg" =~ \[Yn\] ]]; then
        default=y
        yn=true
      fi
      ;;
    2)
      msg="$1"
      default="$2"
      ;;
    *) die "Invalid usage of prompt" ;;
  esac
  while true; do
    read -p "$msg" answer
    [ $# -eq 0 ] && return 0
    [ -n "$answer" -o -n "$default" ] && break
  done
  if "$yn"; then
    [[ "$answer" =~ ^[yY] ]] && echo y && return 0
    [[ "$answer" =~ ^[nN] ]] && echo n && return 0
    echo "$default"
    return 0
  fi
  if [ -n "$answer" ]; then
    echo "$answer"
  else
    echo "$default"
  fi
}

if ! (grep "^version: $VERSION" Changes &>/dev/null); then
  if ! (grep "^- $VERSION" Changes &>/dev/null); then
    error "No Changes entry for version '$VERSION'"
  fi
fi

git tag | grep -E "^v?${VERSION//./\\.}$" &>/dev/null &&
  error "Version '$VERSION' already tagged as released"

if [ -n "$(git status -s)" ]; then
  git status
  if [[ "$(git status)" =~ $'\n'\#\ Untracked ]]; then
    error "Untracked files."
  else
    answer="$(prompt "Uncommitted changes. Commit them and continue? [yN] ")"
    if [ "$answer" == y ]; then
      git commit -a -m "$VERSION"
    else
      echo "Exiting." >&2
      exit 1
    fi
  fi
fi

exit $OK