#!/bin/bash
#===-- build_deploy.sh ---------------------------------------------------===//
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
#===----------------------------------------------------------------------===//
# This script will deploy a docker image to the registry.
# Arguments: <path to Dockerfile> 
# 
# This updates the `VERSION` file with the latest version number.
#===----------------------------------------------------------------------===//

set -eu

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
IMAGE_NAME="${1%/}"
cd "${DIR}/${IMAGE_NAME}"

# read local version number from file and increment it
# TODO: maybe also get latest version number from repository and take the 
#       maximum of local and repo versions.
VERSION=$(( $(cat VERSION) + 1 ))

# on Windows: USER=$USERNAME
if [ -n "${OS+x}" ] && [[  "${OS}" == "Windows_NT" ]] ; then
  USER="${USERNAME}"
fi

# get the git hash and add some suffixes
GIT_HASH=$(git rev-parse HEAD)
if [[ $(git diff --stat) != '' ]]; then
  # if working copy is dirty
  GIT_HASH+="-dirty-${USER}"
elif [[ $(git --no-pager diff origin/master | wc -l) > 0 ]]; then
  # if the hash has not been uploaded to origin/master yet
  GIT_HASH+="-local-${USER}"
fi

# fully qualified image name
# FIXME: use variables to configure URL
QUALIFIED_NAME="gcr.io/sanitizer-bots/${IMAGE_NAME}"
# tags to be added to the image and pushed to the repository
TAGS=(
  "${QUALIFIED_NAME}:latest" 
  "${QUALIFIED_NAME}:${VERSION}"
  "${QUALIFIED_NAME}:${GIT_HASH}"
  )

# build the image and tag it locally
docker build -t ${IMAGE_NAME}:latest -t ${IMAGE_NAME}:${VERSION} .

# print the list of tags to be pushed
echo "-----------------------------------------"
echo "image version: ${VERSION}"
echo "tags:"
printf '   %s\n' "${TAGS[@]}"
echo "-----------------------------------------"
read -p "Push to registry? [yN]" -n 1 -r
echo

if [[ $REPLY =~ ^[Yy]$ ]]
then
  for TAG in "${TAGS[@]}"
  do
    docker tag ${IMAGE_NAME}:${VERSION} "${TAG}"
    docker push "${TAG}"
  done
  # store the version number
  echo "${VERSION}" > VERSION
fi
