#!/bin/bash

usage() {
  >&2 echo 'usage: bumpPkgrel [-a] [-n] [-p /tmp/provided] $pkg1 $pkg2 $pkg3 ...'
  >&2 echo '  -a:  auto-detect packages'
  >&2 echo '  -n:  do not commit'
  >&2 echo '  -p:  use this temporary file'
  exit 1
}

eval set -- "$(
  getopt -o anp: \
    -n "$(basename "$0")" \
    -- "$@" \
    || echo "usage"
)"

auto_detect=false
commit=true
commit_flag=''
provided=''

while true; do
  case "$1" in
    '-a')
      auto_detect=true
    ;;
    '-n')
      commit=false
      commit_flag='-n'
    ;;
    '-p')
      shift
      provided="$1"
    ;;
    '--')
      shift
      break
    ;;
    *)
      >&2 printf 'FEHLER: Verstehe Option "%s" doch nicht! Ich beende.\n' "$1"
      exit 1
  esac
  shift
done

if [ $# -eq 0 ] && ! ${auto_detect}; then
  usage
fi

if [ -z "${provided}" ]; then
  provided=$("${0%/*}/liste-verfuegbare-Versionen")
  trap 'rm -f "${provided}"' EXIT
fi

pin_dependency() {
  sed '
    s/^\(\S\+\)>\?=\(\S\+\)$/\1 \2/
    t
    s/^\S\+$/\0 BOGUS/
    t
    d
  ' \
  | sort -k1,1 \
  | join -1 1 -2 2 -a 1 -e EMPTY -o 1.1,1.2,2.1 - "${provided}" \
  | sed '
    s/ \(\S\+\) EMPTY$/ \1 \1/
  ' \
  | sed '
    s/^\(\S\+\) \S\+ \(\S\+\)$/'"${1}'"'\1=\2'"'"'/
    s/^\(\s*'"'"'glibc\)=/\1>=/
    t
    d
  '
}

if [ $# -ne 1 ] || ${auto_detect}; then

  {
    printf '%s\n' "$@"
    if ${auto_detect}; then
      "${0%/*}/checkPinnedDependencies" -m "${provided}"
    fi
  } \
  | sort -u \
  | xargs -rn1 "$0" ${commit_flag} -p "${provided}"

  if ${auto_detect}; then
    python_version=$(
      sed '
        s/^\(3\.[0-9]\+\)\(\.[0-9.]\+\)\? python$/\1/
        t
        d
      ' "${provided}"
    )
    if cat "${0%/*}"/*/PKGBUILD \
      | sed '
        s/^\(.* \)\?\(["'"'"']\)\?\(python>=[0-9.]\+\)\2\( .*\)\?$/\3/
        t
        d
      ' \
      | grep -qvxF "python>=${python_version}"; then
      "${0%/*}/bumpPython" 3 "${python_version}"
    fi
  fi

else

  cd "$(dirname "$0")"

  pkg="${1%/}"
  cd "${pkg}"
  while IFS=$(printf '\n') read -r line; do
    if printf '%s\n' "${line}" \
    | grep -q '^\s*pkgrel='; then
      eval "${line}"
      printf '%s=%s\n' "${line%%=*}" "$((pkgrel+1))"
      continue
    fi
    if printf '%s\n' "${line}" \
    | grep -q '^\s*_pinned_dependencies\([^=[:space:]]*\)=('; then
      space="${line%%_pinned_dependencies*=(*}"
      printf '%s=(\n' "${line%%=(*}"
      line="${line#*_pinned_dependencies*=(}"
      {
        while ! printf '%s\n' "${line}" \
        | grep -qF ')'; do
          printf '%s\n' ${line%%#*}
          IFS=$(printf '\n') read -r line
        done
        printf '%s\n' ${line%%)*}
      } \
      | sed '
        /^$/d
        s/^\(["'"'"']\)\(\S\+\)\1$/\2/
      ' \
      | pin_dependency "${space}  "
      printf '%s)%s\n' "${space}" "${line#*)}"
      continue
    fi
    printf '%s\n' "${line}"
  done \
  < 'PKGBUILD' \
  | sponge 'PKGBUILD'
  if ${commit}; then
    ../commit-package "${pkg}: rebuild"
  fi

fi