#!/usr/bin/env bash

git version
echo "git-extras version ""$(git-extras -v)"
echo "Type 'ls' to ls files below current directory; '!command' to execute any command or just 'subcommand' to execute any git subcommand; 'quit', 'exit', 'q', ^D, or ^C to exit the git repl."

while true; do
  # Current branch
  cur=$(git symbolic-ref HEAD 2> /dev/null | cut -d/ -f3-)

  # Prompt
  if test -n "$cur"; then
    cur_string=" ($cur)"
  else
    cur_string=""
  fi
  if test -n "$exit_status" && test "$exit_status" -ne 0; then
    es_string=$' \e[31m['"$exit_status"$']\e[0m'
  else
    es_string=""
  fi
  prompt="git$cur_string$es_string> "

  # Use arguments as a command if any are provided.
  if [ $# -ne 0 ]; then
    cmd=$*
    set --
    echo "$prompt" "$cmd" # It is as though you had entered a command.
  else
    # Readline
    read -e -r -p "$prompt" cmd
    # Check for EOF, and end the program if so (handles ^D).
    test $? -ne 0 && break
  fi

  # History
  history -s "$cmd"

  # Built-in commands
  case $cmd in
    ls) cmd=ls-files;;
    "") continue;;
    quit|exit|q) break;;
  esac

  if [[ $cmd == !*  ]]; then
    # shellcheck disable=SC2086
    eval ${cmd:1}
  elif [[ $cmd == git* ]]; then
    # shellcheck disable=SC2086
    eval $cmd
  else
    eval git "$cmd"
  fi
  exit_status=$?
done

echo
