#!/bin/bash # Rules for generating semantic versioning # major: breaking change # minor: feat, style # patch: build, fix, perf, refactor, revert PREVENT_REMOVE_FILE=$1 TEMP_FILE_PATH=.gitea/conventional_commits/tmp LAST_TAG=$(git describe --tags --abbrev=0 --always) echo "Last tag: #$LAST_TAG#" PATTERN="^[0-9]+\.[0-9]+\.[0-9]+$" increment_version() { local version=$1 local increment=$2 local major=$(echo $version | cut -d. -f1) local minor=$(echo $version | cut -d. -f2) local patch=$(echo $version | cut -d. -f3) if [ "$increment" == "major" ]; then major=$((major + 1)) minor=0 patch=0 elif [ "$increment" == "minor" ]; then minor=$((minor + 1)) patch=0 elif [ "$increment" == "patch" ]; then patch=$((patch + 1)) fi echo "${major}.${minor}.${patch}" } create_file() { local with_range=$1 if [ -s $TEMP_FILE_PATH/messages.txt ]; then return 1 fi if [ "$with_range" == "true" ]; then git log $LAST_TAG..HEAD --no-decorate --pretty=format:"%s" > $TEMP_FILE_PATH/messages.txt else git log --no-decorate --pretty=format:"%s" > $TEMP_FILE_PATH/messages.txt fi } get_commit_range() { rm -f $TEMP_FILE_PATH/messages.txt if [[ $LAST_TAG =~ $PATTERN ]]; then create_file true else create_file LAST_TAG="0.0.0" fi echo " " >> $TEMP_FILE_PATH/messages.txt } start() { mkdir -p $TEMP_FILE_PATH get_commit_range new_version=$LAST_TAG increment_type="" while read message; do echo $message if echo $message | grep -Pq '(feat|style)(\([\w]+\))?!:([a-zA-Z0-9-_!\&\.\%\(\)\=\w\s]+)\s?(,?\s?)((ref(s?):?\s?)(([A-Z0-9]+\-[0-9]+)|(NOISSUE)))'; then increment_type="major" echo "a" break elif echo $message | grep -Pq '(feat|style)(\([\w]+\))?:([a-zA-Z0-9-_!\&\.\%\(\)\=\w\s]+)\s?(,?\s?)((ref(s?):?\s?)(([A-Z0-9]+\-[0-9]+)|(NOISSUE)))'; then if [ -z "$increment_type" ] || [ "$increment_type" == "patch" ]; then increment_type="minor" echo "b" fi elif echo $message | grep -Pq '(build|fix|perf|refactor|revert)(\(.+\))?:\s([a-zA-Z0-9-_!\&\.\%\(\)\=\w\s]+)\s?(,?\s?)((ref(s?):?\s?)(([A-Z0-9]+\-[0-9]+)|(NOISSUE)))'; then if [ -z "$increment_type" ]; then increment_type="patch" echo "c" fi fi done < $TEMP_FILE_PATH/messages.txt if [ -n "$increment_type" ]; then new_version=$(increment_version $LAST_TAG $increment_type) echo "New version: $new_version" gitchangelog | grep -v "[rR]elease:" > HISTORY.md echo $new_version > LevelInputProvider/VERSION git add LevelInputProvider/VERSION git add HISTORY.md git commit -m "release: version $new_version 🚀" echo "creating git tag : $new_version" git tag $new_version git push -u origin HEAD --tags echo "Gitea Actions will detect the new tag and release the new version." else echo "No changes requiring a version increment." fi } start if [ -z "$PREVENT_REMOVE_FILE" ]; then rm -f $TEMP_FILE_PATH/messages.txt fi