#!/usr/bin/env bash

set -e
[ -n "$PYENV_DEBUG" ] && set -x

if [ -z "$PYENV_ROOT" ]; then
  PYENV_ROOT="${HOME}/.pyenv"
fi

REMOTE="${PYENV_REMOTE:-origin}"
BRANCH="${PYENV_BRANCH:-master}"

verify_repo_remote() {
  ( cd "$1" && git remote show -n "${REMOTE}" 1>/dev/null 2>&1 )
}

verify_repo_branch() {
  local name="$(cd "$1" && git name-rev --name-only HEAD 2>/dev/null)"
  [[ "${name}" == "${BRANCH}" ]]
}

verify_repo_clean() {
  ! ( cd "$1" && git status --porcelain ) | grep -q -v '^[!?][!?]'
}

verify_repo() {
  local stat=0
  verify_repo_remote "$1" || {
    stat="$?"
    error "pyenv-update: $1 does not have ${REMOTE}."
  }
  verify_repo_branch "$1" || {
    stat="$?"
    error "pyenv-update: $1 is not on ${BRANCH} branch."
  }
  verify_repo_clean "$1" || {
    stat="$?"
    error "pyenv-update: $1 is not clean"
  }
  return "$stat"
}

update_repo() {
  info "Updating $1..."
  verify_repo "$1" &&
  ( cd "${repo}" && git pull --no-rebase --ff "${REMOTE}" "${BRANCH}" )
}

info() {
  { printf "\x1B[2;32m"
    echo "$@"
    printf "\x1B[0m"
  }
}

error() {
  { printf "\x1B[1;31m"
    echo "$@"
    printf "\x1B[0m"
  } 1>&2
}

STATUS=0
shopt -s nullglob
for repo in "${PYENV_ROOT}" "${PYENV_ROOT}/plugins/"*; do
  if [ -d "${repo}/.git" ]; then
    update_repo "${repo}" || STATUS="$?"
  fi
done
shopt -u nullglob

exit "$STATUS"
