#!/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