diff --git a/action.yml b/action.yml index b4a1e60..268e5b0 100644 --- a/action.yml +++ b/action.yml @@ -8,7 +8,14 @@ branding: inputs: scheme: - description: 'Versioning scheme - semver, or, calver (defaults to semver)' + description: | + Versioning scheme - semver, calver or conventional_commits (defaults to semver). + + `conventional_commits` Will parse the last commit message to determine the increment type. + Supports the following increment types: + - patch (build, chore, ci, docs, fix, perf, refactor, revert, style, test) + - minor (feat) + - Major (any of the above types with an '!' or 'BREAKING CHANGE:' in commit body) required: false default: 'semver' pep440: @@ -36,14 +43,14 @@ outputs: description: 'Current normal version detected' value: ${{ steps.version-lookup.outputs.CURRENT_VERSION }} current-v-version: - description: 'Current normal version detected, prefixed with a `v` charatcter' + description: 'Current normal version detected, prefixed with a `v` character' value: ${{ steps.version-lookup.outputs.CURRENT_V_VERSION }} version: description: 'Incremented version calculated' value: ${{ steps.version-increment.outputs.VERSION }} v-version: description: 'Incremented version calculated, prefixed with a `v` charatcter' - value: ${{ steps.version-increment.outputs.V_VERSION }} + value: ${{ steps.version-increment.outputs.V_VERSION }} major-version: description: 'Major number of the incremented version' value: ${{ steps.version-increment.outputs.MAJOR_VERSION }} diff --git a/shared.sh b/shared.sh index e1c97e6..d9f529f 100644 --- a/shared.sh +++ b/shared.sh @@ -11,13 +11,21 @@ pcre_master_ver='^(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)\.(?P0|[1-9 pcre_allow_vprefix="^v{0,1}${pcre_master_ver:1}" pcre_old_calver='^(?P0|[1-9]\d*)-0{0,1}(?P0|[0-9]\d*)-R(?P0|[1-9]\d*)$' +##==---------------------------------------------------------------------------- +## Conventional commit regexes +## see: https://www.conventionalcommits.org/en/v1.0.0/ + +pcre_conventional_commit_patch='^(build|chore|ci|docs|fix|perf|refactor|revert|style|test)(\([a-zA-Z0-9-]+\))?:\s.*' +pcre_conventional_commit_minor='^(feat)(\([a-zA-Z0-9-]+\))?:\s.*' +pcre_conventional_commit_breaking='^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\([a-zA-Z0-9-]+\))?!:.*|BREAKING CHANGE:' + ##==---------------------------------------------------------------------------- ## Input validation input_errors='false' scheme="${scheme:-semver}" -if [[ "${scheme}" != 'semver' && "${scheme}" != 'calver' ]] ; then - echo "🛑 Value of 'scheme' is not valid, choose from 'semver' or 'calver'" 1>&2 +if [[ "${scheme}" != 'semver' && "${scheme}" != 'calver' && "${scheme}" != 'conventional_commits' ]] ; then + echo "🛑 Value of 'scheme' is not valid, choose from 'semver', 'calver' or 'conventional_commits" 1>&2 input_errors='true' fi @@ -40,7 +48,6 @@ if [[ "${use_api}" == 'true' ]] ; then fi fi - ##==---------------------------------------------------------------------------- ## MacOS compatibility - for local testing diff --git a/version-increment.sh b/version-increment.sh index 7036524..66e8c06 100755 --- a/version-increment.sh +++ b/version-increment.sh @@ -30,7 +30,7 @@ fi default_branch='main' # use release_branch if not empty if [[ -n "${release_branch:-}" ]] ; then - default_branch="${release_branch}" + default_branch="${release_branch}" elif [[ -z "${BATS_VERSION:-}" ]] ; then # if we're _not_ testing, then _actually_ check the origin if [[ "${use_api:-}" == 'true' ]] ; then @@ -48,6 +48,7 @@ elif [[ -z "${BATS_VERSION:-}" ]] ; then fi current_ref="${GITHUB_REF:-}" +git_commit_sha=${GITHUB_SHA:-} if [[ "${use_api:-}" == 'true' ]] ; then # because we cannot use `rev-parse` with the API, we'll take a punt that 9 characters is enough for uniqueness @@ -55,7 +56,33 @@ if [[ "${use_api:-}" == 'true' ]] ; then git_commit="$(echo "${GITHUB_SHA:0:9}" | sed 's/0*//')" # Also, trim leading zeros, because semver doesn't allow that in else # the 'pre-release version' part, but we can't use the + char git_commit="$(git rev-parse --short HEAD | sed 's/0*//')" # to make it 'build metadata' as that's not supported in K8s -fi # labels + git_commit_sha="$(git rev-parse --short HEAD)" # labels +fi + +##==---------------------------------------------------------------------------- +## Conventional commits +# If calver is set, raise a warning +if [[ "${scheme}" == 'conventional_commits' ]] ; then + # Get message from given commit + commit_message=$(git log -1 --pretty=format:%B "${git_commit_sha}") + + # Check commit message header + found_match='false' + if [[ -n "$(echo "${commit_message}" | ${grep} -P "${pcre_conventional_commit_breaking}")" ]] ; then + increment='major' + found_match='true' + elif [[ -n "$(echo "${commit_message}" | ${grep} -P "${pcre_conventional_commit_minor}")" ]] ; then + increment='minor' + found_match='true' + elif [[ -n "$(echo "${commit_message}" | ${grep} -P "${pcre_conventional_commit_patch}")" ]] ; then + increment='patch' + found_match='true' + fi + + if [[ "${found_match}" == 'false' ]] ; then + echo "⚠️ No conventional commit found, defaulting to ${increment} increment" 1>&2 + fi +fi ##==---------------------------------------------------------------------------- ## Version increment diff --git a/version-lookup.sh b/version-lookup.sh index 130ca89..3957688 100755 --- a/version-lookup.sh +++ b/version-lookup.sh @@ -46,7 +46,7 @@ if [[ -z "${current_version:-}" ]] ; then echo "⚠️ No previous release version identified in git tags" # brand new repo! (probably) case "${scheme}" in - semver) + semver | conventional_commits) current_version="0.0.0" ;; calver)