#!/usr/bin/env bash

function error_handler() {
  >&2 echo "Exited with BAD EXIT CODE '${2}' in ${0} script at line: ${1}."
  exit "$2"
}
trap 'error_handler ${LINENO} $?' ERR
set -o errtrace -o errexit -o nounset -o pipefail

# HELP: git adds and commits the entire BPMN models directory, including all process groups

bpmn_models_absolute_dir="$1"
git_commit_message="$2"
git_branch="$3"
git_commit_username="$4"
git_commit_email="$5"
git_commit_password="$6"

if [[ -z "${6:-}" ]]; then
  >&2 echo "usage: $(basename "$0") [bpmn_models_absolute_dir] [git_commit_message] [git_branch] [git_commit_username] [git_commit_email]"
  exit 1
fi

function failed_to_get_lock() {
  >&2 echo "ERROR: Failed to get lock."
  exit 1
}

function run() {
  cd "$bpmn_models_absolute_dir"
  git add .

  # https://unix.stackexchange.com/a/155077/456630
  if [ -z "$(git status --porcelain)" ]; then
    echo "No changes to commit"
  else
    PAT="${git_commit_username}:${git_commit_password}"
    AUTH=$(echo -n "$PAT" | openssl base64 | tr -d '\n')

    git config --local user.name "$git_commit_username"
    git config --local user.email "$git_commit_email"
    git config --local http.extraHeader "Authorization: Basic $AUTH"
    git commit -m "$git_commit_message"
    git push --set-upstream origin "$git_branch"
    git config --unset --local http.extraHeader
  fi
}

exec {lock_fd}>/var/lock/mylockfile || failed_to_get_lock
flock --timeout 60 "$lock_fd" || failed_to_get_lock
run
flock -u "$lock_fd"