#!/bin/bash

if [[ -n "${DRONE_WORKSPACE}" ]]; then
  # ensure the unprivileged drone user can write
  # to the workspace. This is required because
  # the workspace is a docker volume and is owned
  # by root.
  # sudo mkdir -p ${DRONE_WORKSPACE}
  # sudo chown drone:drone ${DRONE_WORKSPACE}

  # ensure the workspace is the current working
  # directory. This should already be the case,
  # but we cd just to be safe.
  cd "${DRONE_WORKSPACE}" || exit 1
fi

# force the home directory path.

# if [ "$HOME" != "/home/drone" ]; then
# 	echo "[DEBUG] setting default home directory"
# 	export HOME=/home/drone
# fi

# if the netrc enviornment variables exist, write
# the netrc file.

if [[ -n "${DRONE_NETRC_MACHINE}" ]]; then
  cat <<EOF > "${HOME}/.netrc"
machine ${DRONE_NETRC_MACHINE}
login ${DRONE_NETRC_USERNAME}
password ${DRONE_NETRC_PASSWORD}
EOF
fi

# if the ssh_key environment variable exists, write
# the ssh key and add the netrc machine to the
# known hosts file.
if [[ -n "${DRONE_SSH_KEY}" ]]; then
  mkdir "${HOME}/.ssh"
  echo -n "${DRONE_SSH_KEY}" > "${HOME}/.ssh/id_rsa"
  chmod 600 "${HOME}/.ssh/id_rsa"

  touch "${HOME}/.ssh/known_hosts"
  chmod 600 "${HOME}/.ssh/known_hosts"
  ssh-keyscan -H "${DRONE_NETRC_MACHINE}" > /etc/ssh/ssh_known_hosts 2> /dev/null
fi

# # AWS codecommit support using AWS access key & secret key
# # Refer: https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-https-unixes.html

# if [[ -n "${DRONE_AWS_ACCESS_KEY}" ]]; then
# 	aws configure set aws_access_key_id "${DRONE_AWS_ACCESS_KEY}"
# 	aws configure set aws_secret_access_key "${DRONE_AWS_SECRET_KEY}"
# 	aws configure set default.region "${DRONE_AWS_REGION}"

# 	git config --global credential.helper '!aws codecommit credential-helper $@'
# 	git config --global credential.UseHttpPath true
# fi

# configure git global behavior and parameters via the
# following environment variables:


if [[ -z "${DRONE_COMMIT_AUTHOR_NAME}" ]]; then
  export DRONE_COMMIT_AUTHOR_NAME=drone
fi

if [[ -z "${DRONE_COMMIT_AUTHOR_EMAIL}" ]]; then
  export DRONE_COMMIT_AUTHOR_EMAIL=drone@localhost
fi

export GIT_AUTHOR_NAME=${DRONE_COMMIT_AUTHOR_NAME}
export GIT_AUTHOR_EMAIL=${DRONE_COMMIT_AUTHOR_EMAIL}
export GIT_COMMITTER_NAME=${DRONE_COMMIT_AUTHOR_NAME}
export GIT_COMMITTER_EMAIL=${DRONE_COMMIT_AUTHOR_EMAIL}

# invoke the sub-script based on the drone event type.
# TODO we should ultimately look at the ref, since
# we need something compatible with deployment events.

CLONE_TYPE=${DRONE_BUILD_EVENT}
case ${DRONE_COMMIT_REF} in
  refs/tags/*)
    CLONE_TYPE=tag
  ;;
  refs/pull/*)
    CLONE_TYPE=pull_request
  ;;
  refs/pull-request/*)
    CLONE_TYPE=pull_request
  ;;
  refs/merge-requests/*)
    CLONE_TYPE=pull_request
  ;;
esac

git_clone_retry(){
  retries="${PLUGIN_RETRIES:-0}"
  if [ -n "${retries##*[0-9]*}" ] || [ "${retries}" -lt 0 ]; then
    echo "PLUGIN_RETRIES defined but is not a number: ${retries}" >&2
    exit 1
  fi

  echo "Cloning with ${retries} retries"
  n=0
  until [ "$n" -gt "${retries}" ]; do
    $1 && return
    n=$((n+1))
  done

  exit 1
}

case ${CLONE_TYPE} in
pull_request)
  git_clone_retry clone-pull-request
  ;;
tag)
  git_clone_retry clone-tag
  ;;
*)
  git_clone_retry clone-commit
  ;;
esac