diff --git a/README.md b/README.md index 6a9672f1..0a874277 100755 --- a/README.md +++ b/README.md @@ -104,6 +104,8 @@ _NOTE: set the fetch-depth for `actions/checkout@v2` or newer to be sure you ret - `full`: attempt to show all history, does not work on rebase and squash due missing HEAD [should be deprecated in v2 is breaking many workflows] - `last`: show the single last commit - `compare`: show all commits since previous repo tag number +- **MAJOR_STICKY_VERSION** _(optional)_ - Set the `X` part of `X.Y.Z` version to be constant +- **MINOR_STICKY_VERSION** _(optional)_ - Set the `Y` part of `X.Y.Z` version to be constant. Should be used with `MAJOR_STICKY_VERSION` ### Outputs diff --git a/entrypoint.sh b/entrypoint.sh index 83e3d39a..4dc2afbe 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -21,6 +21,8 @@ minor_string_token=${MINOR_STRING_TOKEN:-#minor} patch_string_token=${PATCH_STRING_TOKEN:-#patch} none_string_token=${NONE_STRING_TOKEN:-#none} branch_history=${BRANCH_HISTORY:-compare} +major_sticky_version=${MAJOR_STICKY_VERSION} +minor_sticky_version=${MINOR_STICKY_VERSION} # since https://github.blog/2022-04-12-git-security-vulnerability-announced/ runner uses? git config --global --add safe.directory /github/workspace @@ -55,7 +57,6 @@ fi setOutput() { echo "${1}=${2}" >> "${GITHUB_OUTPUT}" } - current_branch=$(git rev-parse --abbrev-ref HEAD) pre_release="$prerelease" @@ -77,8 +78,49 @@ echo "pre_release = $pre_release" # fetch tags git fetch --tags -tagFmt="^v?[0-9]+\.[0-9]+\.[0-9]+$" -preTagFmt="^v?[0-9]+\.[0-9]+\.[0-9]+(-$suffix\.[0-9]+)$" +if [ -z "$major_sticky_version" ] && ! [ -z "$minor_sticky_version" ] +then + echo "invalid sticky version" + exit 1 +fi + +tagFmt= +sticky_prefix= +if [ -z "$major_sticky_version" ] +then + tagFmt='[0-9]+' +else + tagFmt="$major_sticky_version" + sticky_prefix="$major_sticky_version" +fi + +if [ -z "$minor_sticky_version" ] +then + tagFmt="$tagFmt\.[0-9]+" +else + tagFmt="$tagFmt\.$minor_sticky_version" + sticky_prefix="$sticky_prefix.$minor_sticky_version" +fi + +preTagFmt="$tagFmt\.[0-9]+(-$suffix\.[0-9]+)$" +tagFmt="$tagFmt\.[0-9]+$" + +if $with_v +then + tagFmt="^v$tagFmt" + preTagFmt="^v$preTagFmt" +else + tagFmt="^$tagFmt" + preTagFmt="^$preTagFmt" +fi + +case "$initial_version" in + "$sticky_prefix"* ) + initial_version="$initial_version";; + * ) echo "fixing initial version $initial_version" + initial_version="$major_sticky_version.${minor_sticky_version:-0}.0" + echo "initial_version=$initial_version";; +esac # get the git refs git_refs= @@ -155,31 +197,38 @@ declare -A history_type=( log=${history_type[${branch_history}]} printf "History:\n---\n%s\n---\n" "$log" +part= case "$log" in - *$major_string_token* ) new=$(semver -i major "$tag"); part="major";; - *$minor_string_token* ) new=$(semver -i minor "$tag"); part="minor";; - *$patch_string_token* ) new=$(semver -i patch "$tag"); part="patch";; - *$none_string_token* ) + *$major_string_token* ) part="major";; + *$minor_string_token* ) part="minor";; + *$patch_string_token* ) part="patch";; + *$none_string_token* ) part="none";; + * ) part="$default_semvar_bump";; +esac + +if ! [ -z "$major_sticky_version" ] && [ "$part" == "major" ]; +then + part="minor"; +fi + +if ! [ -z "$minor_sticky_version" ] && [ "$part" == "minor" ]; +then + part="patch"; +fi + + + +case "$part" in + major ) new=$(semver -i major "$tag"); part="major";; + minor ) new=$(semver -i minor "$tag"); part="minor";; + patch ) new=$(semver -i patch "$tag"); part="patch";; + * ) echo "Default bump was set to none. Skipping..." setOutput "old_tag" "$tag" setOutput "new_tag" "$tag" setOutput "tag" "$tag" setOutput "part" "$default_semvar_bump" exit 0;; - * ) - if [ "$default_semvar_bump" == "none" ] - then - echo "Default bump was set to none. Skipping..." - setOutput "old_tag" "$tag" - setOutput "new_tag" "$tag" - setOutput "tag" "$tag" - setOutput "part" "$default_semvar_bump" - exit 0 - else - new=$(semver -i "${default_semvar_bump}" "$tag") - part=$default_semvar_bump - fi - ;; esac if $pre_release