#!/usr/bin/env bash source .utils set -e print_usage() { orange "gs-release - create a new release of a Giant Swarm repo" echo " " underline "Usage:" echo "gs-release [SEMVER LEVEL]" echo " " echo " " underline "Options:" echo "-h, --help show this help text" } while test $# -gt 0; do case "$1" in -h|--help) print_usage exit 0 ;; *) break ;; esac done SEMVER=$1 CURRENT_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0") MAIN_BRANCH=$(git remote show origin 2>/dev/null|grep HEAD|sed 's/.* //') CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) if [ "$MAIN_BRANCH" != "$CURRENT_BRANCH" ]; then echo "Not currently on main branch, please switch to ${MAIN_BRANCH} to perform a release" exit 1 fi VERSION_PARTS=($(echo $CURRENT_TAG | tr "." "\n")) VERSION_MAJOR=${VERSION_PARTS[0]} VERSION_MINOR=${VERSION_PARTS[1]} VERSION_PATCH=${VERSION_PARTS[2]} echo "The latest released version is ${CURRENT_TAG}" echo "" echo "The release will include:" sed -n "/^## \[Unreleased\]$/,/^## /p" CHANGELOG.md | tail -n +3 | tail -r | tail -n +2 | tail -r | sed "s/^/ /g" echo "" if [[ "$SEMVER" == "" ]]; then printf "What semver release level? (patch, minor or major): " read SEMVER fi case ${SEMVER} in patch) VERSION_PATCH=$((VERSION_PATCH+1)) ;; minor) VERSION_MINOR=$((VERSION_MINOR+1)) VERSION_PATCH=0 ;; major) if [[ ${VERSION_MAJOR:0:1} == "v" ]]; then VERSION_MAJOR="v$((VERSION_MAJOR+1))" else VERSION_MAJOR=$((VERSION_MAJOR+1)) fi VERSION_MINOR=0 VERSION_PATCH=0 ;; *) echo "Unknown Semver level provided" exit 1 ;; esac NEW_VERSION="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" NEW_BRANCH="${MAIN_BRANCH}#release#${NEW_VERSION}" echo "" echo "✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ " echo "Current version ${CURRENT_TAG}" echo " New version ${NEW_VERSION}" echo " Release branch ${NEW_BRANCH}" echo "✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ " echo "" printf "Confirm? (y/n): " read CONFIRM if [ "${CONFIRM}" = "y" ]; then echo "" echo "Publishing new release branch..." echo "" git checkout -b "${NEW_BRANCH}" git push -u origin "${NEW_BRANCH}" ORG_NAME=$(git remote get-url origin | sed 's/.*github.com[:|\/]//' | sed 's/\.git$//' | tr '/' ' ' | awk '{print $1}') REPO_NAME=$(git remote get-url origin | sed 's/.*github.com[:|\/]//' | sed 's/\.git$//' | tr '/' ' ' | awk '{print $2}') echo "" echo "🚀 Keep an eye on $(underline "https://github.com/${ORG_NAME}/${REPO_NAME}/pulls") for the new release PR" echo "" echo "Switching back to the main git branch" git checkout $(git remote show origin 2>/dev/null|grep HEAD|sed 's/.* //') &> /dev/null git pull &> /dev/null else echo "Aborting..." exit 1 fi