#!/usr/bin/env sh
#
# This helper updates the reference of [distribution-scripts](https://github.com/crystal-lang/distribution-scripts),
# pushes the change to GitHub and creates a pull request.
#
# Usage:
#
#    scripts/update-distribution_scripts.sh [REF [BRANCH]]
#
# Parameters:
# * REF: Git commit SHA in distribution-scripts (default: HEAD)
# * BRANCH: Branch name for CI branch in crystal (default: ci/update-distribution-scripts)
#
# Requirements:
# * packages: git gh sed
# * Working directory should be in a checked out work tree of `crystal-lang/crystal`.
#
# * The default value for reference is the current HEAD of https://github.com/crystal-lang/distribution-scripts.

set -eu

DISTRIBUTION_SCRIPTS_WORK_DIR=${DISTRIBUTION_SCRIPTS_WORK_DIR:-../distribution-scripts/.git}
GIT_DS="git --git-dir=$DISTRIBUTION_SCRIPTS_WORK_DIR"

$GIT_DS fetch origin master

if [ "${1:-"HEAD"}" = "HEAD" ]; then
  reference=$($GIT_DS rev-list origin/master | head -1)
else
  reference=${1}
fi

branch="${2:-"ci/update-distribution-scripts"}"

git switch -C "$branch" master

old_reference=$(sed -n "/distribution-scripts-version:/{n;n;n;p}" .circleci/config.yml | grep -o -P '(?<=default: ")[^"]+')
echo $old_reference..$reference

sed -i -E "/distribution-scripts-version:/{n;n;n;s/default: \".*\"/default: \"$reference\"/}" .circleci/config.yml

git add .circleci/config.yml

message="Updates \`distribution-scripts\` dependency to https://github.com/crystal-lang/distribution-scripts/commit/$reference"
log=$($GIT_DS log $old_reference..$reference --format="%s" | sed "s/.*(/crystal-lang\/distribution-scripts/;s/^/* /;s/)$//")
message=$(printf "%s\n\nThis includes the following changes:\n\n%s" "$message" "$log")

git commit -m "Update distribution-scripts" -m "$message"

git show

git push -u upstream "$branch"

# Confirm creating pull request
echo "Create pull request for branch $branch? [y/N]"
read -r REPLY

if [ "$REPLY" = "y" ]; then
  gh pr create -R crystal-lang/crystal --fill --label "topic:infrastructure" --assignee "@me"
fi
