#!/usr/bin/env bash
#
# ghpc (GitHub Push Current)
#
# - Push current branch to its remote. Try the following until it works:
#   - Plain 'git push'
#   - 'git push -f'
#   - Try the 'git push' command from the 'git push' error message
#   - Try adding '-f' to that command
#

yay() { echo "SUCCESS" ; }
boo() { echo "FAIL" ; }

FORCE=$([[ "$1" == "--force" || "$1" == "-f" ]] && echo 1)

if [[ ! $FORCE ]]; then
  echo -n "trying 'git push' ...... "
  git push >/dev/null 2>&1 && { yay ; exit ; }
  boo
fi

echo -n "trying 'git push -f' ... "

# Get the error output from the failed push
# and get the recommended 'git push' line
git push -f 2>&1 | {
  CMD=""

  ltrim() {
    [[ "$1" =~ [^[:space:]].* ]]
    printf "%s" "$BASH_REMATCH"
  }

  while IFS= read -r line
  do
    #echo "$line"
    if [[ -z "$CMD" && $line =~ "git push" ]]; then
      CMD=$(ltrim "$line")
    fi
  done

  # if a command was found try it
  if [[ -n "$CMD" ]]; then

    boo

    if [[ ! $FORCE ]]; then
      echo -n "trying '$CMD' ...... "
      $CMD >/dev/null 2>&1 && { yay ; exit ; }
      boo
    fi

    fCMD=${CMD/ push / push -f }
    echo -n "trying '$fCMD' ... "
    $fCMD >/dev/null 2>&1 && { yay ; exit ; }
    boo

    exit 1

  else

    yay

  fi
}

[[ ${PIPESTATUS[1]} == 1 ]] && echo "Sorry! Failed to push current branch."
