packages feed

hodatime-1.1.0.0: scripts/sync-version.sh

#!/bin/sh
set -eu

repo_root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
cabal_file="$repo_root/hodatime.cabal"
mode=${1:-}

if [ "$mode" = "--set" ]; then
  version=${2:?Usage: scripts/sync-version.sh --set VERSION}
  case "$version" in
    *[!0-9.]* | .* | *. | *..*)
      echo "Invalid Cabal version: $version" >&2
      exit 1
      ;;
  esac
else

  version_tag=$(git -C "$repo_root" tag --points-at HEAD --sort=-version:refname |
    grep -E '^v[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?$' |
    head -n 1 || true)

  if [ -n "$version_tag" ]; then
    version=${version_tag#v}
  else
    version_tag=$(git -C "$repo_root" describe --tags --abbrev=0 --match 'v[0-9]*' 2>/dev/null || true)
    if [ -z "$version_tag" ]; then
      echo "No reachable vX.Y.Z or vX.Y.Z.W tag found" >&2
      exit 1
    fi

    tagged_version=${version_tag#v}
    old_ifs=$IFS
    IFS=.
    set -- $tagged_version
    IFS=$old_ifs

    case $# in
      3) version="$1.$2.$3.1" ;;
      4) version="$1.$2.$3.$(($4 + 1))" ;;
      *)
        echo "Unsupported version tag: $version_tag" >&2
        exit 1
        ;;
    esac
  fi
fi

current_version=$(awk -F: '/^version:/ { sub(/^[[:space:]]+/, "", $2); print $2; exit }' "$cabal_file")

if [ "$mode" = "--check" ]; then
  if [ "$current_version" != "$version" ]; then
    echo "hodatime.cabal has version $current_version; Git requires $version" >&2
    exit 1
  fi
else
  temporary_file="$cabal_file.tmp"
  awk -v version="$version" '
    /^version:/ && !updated { print "version:        " version; updated = 1; next }
    { print }
  ' "$cabal_file" > "$temporary_file"
  mv "$temporary_file" "$cabal_file"
fi

echo "$version"