mirror of https://github.com/buildpacks/rfcs.git
141 lines
3.2 KiB
Bash
Executable File
141 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
script="$0"
|
|
|
|
####
|
|
# CONFIG
|
|
#
|
|
|
|
MAIN_BRANCH=${MAIN_BRANCH:-main}
|
|
OWNER=${OWNER:-buildpacks}
|
|
REPO=rfcs
|
|
BOT_USERNAME="buildpack-bot"
|
|
|
|
####
|
|
# FUNCTIONS
|
|
#
|
|
|
|
usage() {
|
|
printf "Usage: %s [-i <issue>...] [-n] <PR_NUMBER#>\n" "$script"
|
|
printf "Flags:\n"
|
|
printf " -i string\n\tgithub issue reference (example: ${OWNER}/${REPO}#1)\n"
|
|
printf " -n\n\tbe okay with no issues being created\n"
|
|
exit 1
|
|
}
|
|
|
|
generate_id() {
|
|
id="$(find text -maxdepth 1 -type f | sed -E 's|^text/([[:digit:]]{4})-.*$|\1|' | sort | tail -n 1 | sed 's/^0*//')"
|
|
((id++))
|
|
printf "%04d" "${id}"
|
|
}
|
|
|
|
link_issue() {
|
|
local issue="$1"
|
|
link=$(echo "$issue" | sed -E "s|([^\/]+)/([^#]+)#([[:digit:]]+)$|https://github.com/\1/\2/issues/\3|")
|
|
printf '[%s](%s)' "$issue" "$link"
|
|
}
|
|
|
|
require_command() {
|
|
if ! [ -x "$(command -v ${1})" ]; then
|
|
echo "Error: '${1}' is not installed." >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
####
|
|
# DEPENDENCIES
|
|
#
|
|
|
|
require_command git
|
|
require_command jq
|
|
|
|
####
|
|
# INPUTS / VALIDATION
|
|
#
|
|
|
|
NO_ISSUES=false
|
|
ISSUES_TEXT="N/A"
|
|
|
|
while getopts ":i:n" opt; do
|
|
case ${opt} in
|
|
i )
|
|
if [[ $ISSUES_TEXT == "N/A" ]]; then
|
|
ISSUES_TEXT=$(link_issue "$OPTARG")
|
|
else
|
|
ISSUES_TEXT+=", $(link_issue "$OPTARG")"
|
|
fi
|
|
;;
|
|
n )
|
|
NO_ISSUES=true
|
|
;;
|
|
\? )
|
|
echo "Invalid option: $OPTARG" 1>&2
|
|
usage
|
|
;;
|
|
: )
|
|
echo "Invalid option: $OPTARG requires an argument" 1>&2
|
|
usage
|
|
;;
|
|
esac
|
|
done
|
|
|
|
shift $(($OPTIND - 1))
|
|
if [[ $# != 1 ]]; then
|
|
usage
|
|
fi
|
|
PR_NUMBER="${1}"
|
|
|
|
CURRENT_BRANCH=$(git branch --show-current)
|
|
if [[ "${CURRENT_BRANCH}" != "${MAIN_BRANCH}" ]]; then
|
|
echo -e "ERROR! Expected current branch to be '${MAIN_BRANCH}', currently in '${CURRENT_BRANCH}'!";
|
|
exit 1;
|
|
fi
|
|
|
|
####
|
|
# TASK
|
|
#
|
|
|
|
RFC_ID=$(generate_id)
|
|
echo "> Generated RFC number: ${RFC_ID}"
|
|
|
|
if [[ $NO_ISSUES = false && $ISSUES_TEXT == "N/A" ]]; then
|
|
echo "> Please create an issue by following the link below:"
|
|
echo "https://github.com/buildpacks/rfcs/issues/new?assignees=&labels=type%2Ftracking&projects=&template=tracking.md&title=%5BRFC+%23${RFC_ID}%5D+%3C+-+INSERT+RFC+TITLE%3E"
|
|
echo ""
|
|
read -p "Press Enter to continue" </dev/tty
|
|
|
|
read -p "> Please enter the issue link: " ISSUES_TEXT
|
|
fi
|
|
|
|
echo "> Pulling latest changes...."
|
|
git pull origin --rebase
|
|
|
|
echo "> Merging PR#${PR_NUMBER} as rfc-${RFC_ID}"
|
|
git fetch origin "pull/${PR_NUMBER}/head:rfc-${RFC_ID}"
|
|
git merge "rfc-${RFC_ID}" --signoff --no-edit --no-ff
|
|
git branch -d "rfc-${RFC_ID}"
|
|
|
|
SOURCE_DOC=$(find text -maxdepth 1 -name '0000-*')
|
|
TARGET_DOC=${SOURCE_DOC//0000/${RFC_ID}}
|
|
|
|
echo "> Updating document: ${SOURCE_DOC}"
|
|
SEDOPTION="-i"
|
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
SEDOPTION="-i ''"
|
|
fi
|
|
sed $SEDOPTION "s|- RFC Pull Request:.*|- RFC Pull Request: [${REPO}#${PR_NUMBER}](https://github.com/${OWNER}/${REPO}/pull/${PR_NUMBER})|" "${SOURCE_DOC}"
|
|
sed $SEDOPTION "s|- CNB Issue:.*|- CNB Issue: $ISSUES_TEXT|" "${SOURCE_DOC}"
|
|
sed $SEDOPTION "s|- Status:.*|- Status: Approved|" "${SOURCE_DOC}"
|
|
|
|
echo "> Moving ${SOURCE_DOC} to ${TARGET_DOC}..."
|
|
git mv "${SOURCE_DOC}" "${TARGET_DOC}"
|
|
git add "${TARGET_DOC}"
|
|
|
|
echo "> Committing..."
|
|
git commit --signoff --message "RFC ${RFC_ID}
|
|
|
|
[#${PR_NUMBER}]
|
|
"
|