content: #!/bin/sh
  
  is_term() {
      [ -t 0 ]
  }
  
  # Disable echo while typing the password if in a terminal
  hidden_prompt() {
      if is_term; then
  	settings=$(stty -g)
  	trap "stty '$settings'" 0
  	stty -echo
  	echo -n "$1: "
  	IFS="" read -r $2
  	echo
  	stty "$settings"
      else
  	IFS="" read -r $2
      fi
  }
  
  
  
  set -e
  
  PACKAGE=$1
  OUTDIR=$2
  VERSIONS="$@"
  
  read -p "Username: " user
  hidden_prompt "Password" pw
  
  if [ -z "$VERSIONS" ]; then
      VERSIONS="$(curl https://hackage.haskell.org/package/"$PACKAGE"/preferred.json | jq '."normal-version"[]' -r)"
  #versions="$(curl https://hackage.haskell.org/package/"$PACKAGE"/preferred.json | jq '."deprecated-version"[]' -r)"
  fi
  
  
  
  echo "Versions: $VERSIONS"
  
  for v in $VERSIONS; do
      rev=$(cat $OUTDIR/$PACKAGE-$v.cabal | grep -i "^x-revision:" | tr -s '[:blank:]*' '\t' | cut -f 2)
  
      if [ -z "$rev" ]; then
          rev=0
      fi
  
      echo -n "$PACKAGE v$v rev:$rev..."
  
      content=$( ( echo "X-Revision: $((rev + 1))"; cat $OUTDIR/$PACKAGE-$v.cabal | sed '/^X-Revision:/Id' ) )
  
      resp=$(curl -s --form-string "cabalfile=$content" -F "publish=Publish new revision" https://hackage.haskell.org/package/"${PACKAGE}-${v}"/"${PACKAGE}.cabal"/edit -u "$user:$pw")
  
      changes=$(printf '%s\n' "$resp" | sed -n '/Changes in this revision/,/<\/ul>/p' | w3m -dump -T text/html)
  
      errors=$(printf '%s\n' "$resp" | sed -n '/Errors/,/<\/form>/p')
  
      if printf '%s\n' "$resp" | grep -q "Cannot publish new revision"; then
          notpublished=1
      fi
  
      printf 'Changes:\n%s\n' "$changes"
      if [ -z "$changes" -o -n "$notpublished" ]; then
          if printf '%s\n' "$errors" | grep -q "No changes"; then
              continue;
          fi
  
          printf '%s\n' "$resp" > /tmp/hackage-metadata-error
          printf '%s\n' "$errors" | w3m -dump -T text/html
  
          exit 1
      fi
  done
  