diff --git a/README.md b/README.md index cb7d289..d35199e 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ uses: actions/checkout@v2 - name: Get next version - uses: reecetech/version-increment@2023.3.1 + uses: reecetech/version-increment@2023.4.1 id: version with: scheme: semver @@ -24,6 +24,7 @@ ``` ### 🔖 semver + This action will detect the current latest _normal_ semantic version (semver) from the tags in a git repository. It will increment the version as directed (by default: +1 to the patch digit). Both the current latest and the incremented version are @@ -52,14 +53,16 @@ e.g. `2021.6.2` | minor | month | `6` | | patch | release | `2` | The *n*th release for the month | -If the current latest normal version is not the current year and month, then the year and month digits will be +If the current latest normal version is not the current year and month, then the +year and month digits will be set to the current year and month, and the release digit will be reset to 1. ### 🎋 Default branch vs. any other branch **Default branch** -The action will return a _normal_ version if it is detected that the current commit is on the default branch (usually `main`). +The action will return a _normal_ version if it is detected that the current commit +is on the default branch (usually `main`). Examples: * `1.2.7` @@ -67,7 +70,10 @@ Examples: **Any other branch** -The action will return a _pre-release_ version if any other branch is detected (e.g. `new-feature`, `bugfix/foo`, etc). The _pre-release_ portion of the version number will be the literal string `pre.` followed by the git commit ID short reference SHA (trimmed of any leading zeros). +The action will return a _pre-release_ version if any other branch is detected +(e.g. `new-feature`, `bugfix/foo`, etc). The _pre-release_ portion of the version number +will be the literal string `pre.` followed by the git commit ID short reference SHA +(trimmed of any leading zeros). Examples: * `1.2.7-pre.41218aa78` @@ -78,6 +84,7 @@ Examples: | name | description | required | default | | :--- | :--- | :--- | :--- | | scheme | The versioning scheme in-use, either `semver` or `calver` | No | `semver` | +| pep440 | Set to `true` for PEP440 compatibility of _pre-release_ versions by making use of the build metadata segment of semver, which maps to local version identifier in PEP440 | No | `false` | | increment | The digit to increment, either `major`, `minor` or `patch`, ignored if `scheme` == `calver` | No | `patch` | ### 📤 Outputs diff --git a/action.yml b/action.yml index 7861f24..8a9bff9 100644 --- a/action.yml +++ b/action.yml @@ -11,6 +11,10 @@ inputs: description: 'Versioning scheme - semver, or, calver (defaults to semver)' required: false default: 'semver' + pep440: + description: 'PEP440 compatibility mode - shifts the pre-release version information into build metadata instead' + required: false + default: false increment: description: | Field to increment - major, minor, or, patch (defaults to patch) @@ -69,4 +73,5 @@ runs: env: current_version: ${{ steps.version-lookup.outputs.CURRENT_VERSION }} increment: ${{ inputs.increment }} + pep440: ${{ inputs.pep440 }} scheme: ${{ inputs.scheme }} diff --git a/shared.sh b/shared.sh index d924800..ee14092 100644 --- a/shared.sh +++ b/shared.sh @@ -21,6 +21,12 @@ if [[ "${scheme}" != 'semver' && "${scheme}" != 'calver' ]] ; then input_errors='true' fi +pep440="${pep440:-false}" +if [[ "${pep440}" != 'false' && "${pep440}" != 'true' ]] ; then + echo "🛑 Value of 'pep440' is not valid, choose from 'false' or 'true'" 1>&2 + input_errors='true' +fi + ##==---------------------------------------------------------------------------- ## MacOS compatibility - for local testing diff --git a/tests/test_version-increment.bats b/tests/test_version-increment.bats index 4e15087..e6c1481 100644 --- a/tests/test_version-increment.bats +++ b/tests/test_version-increment.bats @@ -53,6 +53,18 @@ function init_repo { [[ "$output" = *"Value of 'scheme' is not valid"* ]] } +@test "fails if invalid value for pep440 given" { + init_repo + + export pep440="yes" + + run ../../version-increment.sh + + print_run_info + [ "$status" -eq 8 ] && + [[ "$output" = *"Value of 'pep440' is not valid"* ]] +} + @test "fails if invalid increment given" { init_repo @@ -104,6 +116,23 @@ function init_repo { [[ "$output" = *"VERSION=1.3.0"* ]] } +@test "increments the minor digit correctly (explicitly not pep440)" { + init_repo + + export current_version=1.2.3 + export pep404="false" + export increment="minor" + + run ../../version-increment.sh + + print_run_info + [ "$status" -eq 0 ] && + [[ "$output" = *"MAJOR_VERSION=1"* ]] && + [[ "$output" = *"MINOR_VERSION=3"* ]] && + [[ "$output" = *"PATCH_VERSION=0"* ]] && + [[ "$output" = *"VERSION=1.3.0"* ]] +} + @test "increments the major digit correctly (semver)" { init_repo @@ -120,6 +149,23 @@ function init_repo { [[ "$output" = *"VERSION=2.0.0"* ]] } +@test "increments the major digit correctly (pep440 mode)" { + init_repo + + export current_version=1.2.3 + export pep404="true" + export increment="major" + + run ../../version-increment.sh + + print_run_info + [ "$status" -eq 0 ] && + [[ "$output" = *"MAJOR_VERSION=2"* ]] && + [[ "$output" = *"MINOR_VERSION=0"* ]] && + [[ "$output" = *"PATCH_VERSION=0"* ]] && + [[ "$output" = *"VERSION=2.0.0"* ]] +} + @test "prefixes with v" { init_repo @@ -174,6 +220,39 @@ function init_repo { print_run_info [ "$status" -eq 0 ] && - [[ "$output" = *"PRE_RELEASE_LABEL=pre.${short_ref}"* ]] + [[ "$output" = *"PRE_RELEASE_LABEL=pre.${short_ref}"* ]] && [[ "$output" = *"VERSION=1.2.4-pre.${short_ref}"* ]] } + +@test "appends prerelease information in pep440 compatible way when pep440 is true" { + init_repo + + export current_version=10.20.30 + export pep440="true" + export GITHUB_REF="refs/heads/super-awesome-python" + export short_ref="$(git rev-parse --short HEAD | sed 's/0*//')" + + run ../../version-increment.sh + + print_run_info + [ "$status" -eq 0 ] && + [[ "$output" = *"PRE_RELEASE_LABEL=pre.${short_ref}"* ]] && + [[ "$output" = *"VERSION=10.20.31+pre.${short_ref}"* ]] +} + +@test "appends prerelease information in pep440 compatible way when pep440 is true, and using calver scheme" { + init_repo + + export current_version=2020.6.4 + export scheme="calver" + export pep440="true" + export GITHUB_REF="refs/heads/super-awesome-python" + export short_ref="$(git rev-parse --short HEAD | sed 's/0*//')" + + run ../../version-increment.sh + + print_run_info + [ "$status" -eq 0 ] && + [[ "$output" = *"PRE_RELEASE_LABEL=pre.${short_ref}"* ]] && + [[ "$output" = *"VERSION=$(date +%Y.%-m.1)+pre.${short_ref}"* ]] +} diff --git a/version-increment.sh b/version-increment.sh index 915b1a9..e3ac75d 100755 --- a/version-increment.sh +++ b/version-increment.sh @@ -75,7 +75,11 @@ fi # add pre-release info to version if not the default branch if [[ "${current_ref}" != "refs/heads/${default_branch}" ]] ; then pre_release="pre.${git_commit}" - new_version="${new_version}-${pre_release}" + if [[ "${pep440:-}" == 'true' ]] ; then + new_version="${new_version}+${pre_release}" + else + new_version="${new_version}-${pre_release}" + fi echo "PRE_RELEASE_LABEL=${pre_release}" >> "${GITHUB_OUTPUT}" fi