47 Commits

Author SHA1 Message Date
George Kolecsanyi
a5d65984a6 Merge pull request #38 from reecetech/fix-when-no-prefix
set prefix tag default to empty string
2024-09-03 12:30:23 +10:00
George Kolecsanyi
39ac246d0c set prefix tag default to empty string 2024-09-03 12:22:17 +10:00
Phil Jay
2ec19615c5 Merge pull request #37 from reecetech/fix-test
Fix test for when on `main` branch
2024-09-02 10:58:36 +10:00
Phil Jay
95aaf0c0e9 Fix test for when on main branch 2024-09-02 10:55:20 +10:00
Phil Jay
a67b798a79 Merge pull request #36 from reecetech/fix-lint
Fix lint & create new release
2024-09-02 08:02:15 +10:00
Phil Jay
9791034c7c Improve + fix test 2024-08-31 16:08:37 +10:00
Phil Jay
233fed58a9 Fix lint; Add comment 2024-08-31 15:51:39 +10:00
Phil Jay
dbf9c566cb Merge pull request #35 from sefasenturk95/main
Update version look up to support tags prepended with a prefix
2024-08-31 14:50:53 +10:00
Phil Jay
0f298121cd Update README 2024-08-31 14:49:15 +10:00
Phil Jay
5af72f0ae1 Introduce new outputs 2024-08-31 14:38:32 +10:00
Phil Jay
836a0f07bb Fix tests; Pre-filter tags 2024-08-31 14:19:37 +10:00
Phil Jay
d4496413d6 Don't auto-add @ to prefix; Shift utility function 2024-08-31 13:49:15 +10:00
Phil Jay
aa4572b10f Add test to see that versions only with tag_prefix are returned 2024-08-31 13:28:20 +10:00
Sefa Şentürk
56f4a516dd Update action to support with tag_prefix parameter 2024-08-30 11:08:56 +02:00
Phil Jay
c1faa9d742 Merge pull request #33 from reecetech/bats
Switch to maintained `bats-action`; update to latest BATS version (v1.11.0)
2024-04-24 15:31:30 +10:00
Phil Jay
ca62a5d18e Update to latest BATS 2024-04-24 12:45:43 +10:00
Phil Jay
f149a06e08 Switch to bats-core/bats-action
Is maintained, and uses up to date node (v20)
2024-04-24 12:44:19 +10:00
Phil Jay
dee3ec8905 Merge pull request #30 from b0bben/action-path-lookup-windows
Add Windows runners compatibility
2024-04-24 12:37:10 +10:00
Phil Jay
8df12f2eb1 Update README 2024-04-24 12:35:10 +10:00
Phil Jay
16351e1923 Update to use brace variable referencing
https://stackoverflow.com/a/8748880
2024-04-24 12:28:33 +10:00
Phil Jay
512aaef59f Fix: file location after rework of tests 2024-04-24 12:25:14 +10:00
Phil Jay
238431148e Remove log message
- Message is using a variable that's not confirmed as set yet
- Message is output by `version-lookup.sh` in normal operation anyway
2024-04-24 12:25:14 +10:00
Phil Jay
192637163e Enable testing on Windows 2024-04-24 12:12:29 +10:00
Bob Jelica
b51c517604 Force utf8 for all commands during execution 2024-04-24 12:12:04 +10:00
Bob Jelica
3165846543 Force utf8 before grepping 2024-04-24 12:09:02 +10:00
Bob Jelica
f16cac75c5 Try forcing locale for grep 2024-04-24 12:02:38 +10:00
Bob Jelica
d4ed669f7f Fix other test + add more debugging for windows 2024-04-24 12:01:04 +10:00
Bob Jelica
a121e1106e Fix tests 2024-04-24 12:01:04 +10:00
Bob Jelica
0483a06d99 Set starting patch number to '1' since increment doesn't work with 0s 2024-04-24 12:01:04 +10:00
Bob Jelica
a6b9cc8234 Fix 2nd location with path as well 2024-04-24 12:01:04 +10:00
Bob Jelica
2055d25933 Lookup action path in a Windows-friendly way 2024-04-24 12:01:04 +10:00
Phil Jay
acb0193bef Merge pull request #32 from ps-jay/matrix
Add multi-OS testing (`ubuntu` & `macos` for now); Rework MacOS support to use `perl`
2024-04-24 11:55:29 +10:00
Phil Jay
ed7b98e336 Disable Windows testing for now 2024-04-24 11:45:57 +10:00
Phil Jay
13338be6d3 Rework MacOS support 2024-04-24 11:43:51 +10:00
Phil Jay
74a6f3d520 Run tests on all runner types 2024-04-24 11:00:01 +10:00
Phil Jay
ae1ae190dc Merge pull request #31 from reecetech/feature/support-conventional-commits
Support conventional commits
2024-04-23 17:41:08 +10:00
Phil Jay
81805365e1 Update README.md for version bump 2024-04-23 17:37:34 +10:00
Phil Jay
c6ea11748a Update README.md for conventional commits 2024-04-23 17:34:47 +10:00
Phil Jay
73ade5516c Update version-increment.sh for old comment 2024-04-23 17:17:01 +10:00
Phil Jay
352a9961c8 Update action.yml for README 2024-04-23 17:13:22 +10:00
Daniel Atanasovski
a449b75848 test: add tests for new conventional_commits scheme 2024-03-20 15:41:30 +11:00
Daniel Atanasovski
0df84379a9 feat: add new scheme conventional_commits 2024-03-20 15:41:06 +11:00
Daniel Atanasovski
0c4ebd1e55 fix: strip leading 0 in date command for CI workflow 2024-03-20 15:39:13 +11:00
Daniel Atanasovski
b920b6b45e feat: shellcheck config for simplicity 2024-03-20 15:38:23 +11:00
Phil Jay
71036b212b Merge pull request #27 from reecetech/maintenance
Remove old code blocks
2023-10-20 16:12:58 +11:00
Phil Jay
bfdbc118ba Remove transitional code
We don't have any more projects at `reecetech` that use the older
non-semver compliant calver versioning
2023-10-19 22:27:40 +11:00
Phil Jay
68bf4fe26d Remove duplicate code
The functionality is included in `shared.sh` which is sourced by this
file
2023-10-19 22:25:05 +11:00
9 changed files with 451 additions and 98 deletions

View File

@@ -27,9 +27,9 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup bats - name: Setup bats
uses: mig4/setup-bats@af9a00deb21b5d795cabfeaa8d9060410377686d # v1.2.0 uses: bats-core/bats-action@2.0.0
with: with:
bats-version: 1.8.0 bats-version: 1.11.0
- name: Test - name: Test
run: bats tests/*.bats run: bats tests/*.bats
@@ -65,19 +65,27 @@ jobs:
- name: Check increment result - name: Check increment result
shell: bash shell: bash
run: '[[ "$(date +%Y.%m)" == "$(echo "${{ steps.version-increment.outputs.VERSION }}" | cut -d "." -f 1-2)" ]]' run: '[[ "$(date +%Y.%-m)" == "$(echo "${{ steps.version-increment.outputs.VERSION }}" | cut -d "." -f 1-2)" ]]'
test-action-yml: # integration testing test-action-yml: # integration testing
needs: needs:
- lint - lint
- test - test
- test-api-mode - test-api-mode
runs-on: ubuntu-latest strategy:
matrix:
os:
- macos-latest
- ubuntu-latest
- windows-latest
fail-fast: false
runs-on: ${{ matrix.os }}
steps: steps:
- name: Checkout code # have to checkout to have the source code available - name: Checkout code # have to checkout to have the source code available
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Remove .git directory # remove the git directory to make the testing valid - name: Remove .git directory # remove the git directory to make the testing valid
shell: bash
run: rm -rf .git/ run: rm -rf .git/
- name: Get next version via API - name: Get next version via API
@@ -106,6 +114,23 @@ jobs:
[[ "${{ steps.version-via-api.outputs.patch-version }}" == "${{ steps.version-via-git.outputs.patch-version }}" ]] [[ "${{ steps.version-via-api.outputs.patch-version }}" == "${{ steps.version-via-git.outputs.patch-version }}" ]]
# Don't test the full version or pre-version, since the number of digits is likely to be different (9 via api vs. 7 via git) # Don't test the full version or pre-version, since the number of digits is likely to be different (9 via api vs. 7 via git)
- name: Get next version via Git with tag-prefix
uses: ./
id: version-prefix
with:
scheme: 'semver'
use_api: false
tag_prefix: 'foo/bar@'
- name: Check that it starts from 0.0.1 (since prefix doesn't exist)
shell: bash
run: |
[[ "${{ steps.version-prefix.outputs.current-version }}" == "0.0.0" ]]
[[ "${{ steps.version-prefix.outputs.major-version }}" == "0" ]]
[[ "${{ steps.version-prefix.outputs.minor-version }}" == "0" ]]
[[ "${{ steps.version-prefix.outputs.patch-version }}" == "1" ]]
[[ "${{ steps.version-prefix.outputs.prefixed-version }}" = "foo/bar@0.0.1"* ]]
release: release:
needs: needs:
- test-action-yml - test-action-yml

1
.shellcheckrc Normal file
View File

@@ -0,0 +1 @@
external-sources=true

View File

@@ -2,6 +2,10 @@
## Use 📄 ## Use 📄
> [!NOTE]
> This action is confirmed to work on all three of GitHub's hosted runners -
> `ubuntu-latest`, `macos-latest` and `windows-latest` - at the point in time of the release of the action
### Example ⌨️ ### Example ⌨️
```yaml ```yaml
@@ -9,7 +13,7 @@
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Get next version - name: Get next version
uses: reecetech/version-increment@2023.9.3 uses: reecetech/version-increment@2024.4.3
id: version id: version
with: with:
scheme: semver scheme: semver
@@ -30,7 +34,7 @@ use the API mode:
```yaml ```yaml
- name: Get next version - name: Get next version
uses: reecetech/version-increment@2023.10.1 uses: reecetech/version-increment@2024.4.3
id: version id: version
with: with:
use_api: true use_api: true
@@ -70,6 +74,22 @@ If the current latest normal version is not the current year and month, then the
year and month digits will be year and month digits will be
set to the current year and month, and the release digit will be reset to 1. set to the current year and month, and the release digit will be reset to 1.
### Conventional Commits (semver with smarts) 💡
If you choose the conventional commits scheme, the action will parse the last commit message _(usually the merge commit)_ to determine
the increment type for a `semver` version.
The following increment types by keyword are supported:
- patch: build, chore, ci, docs, fix, perf, refactor, revert, style, test
- minor: feat
- major: any of the above keywords followed by a '!' character, or 'BREAKING CHANGE:' in commit body
If none of the keywords are detected, then the increment specified by the `increment` input will be used (defaults to patch).
> [!TIP]
> You might like to _enforce_ conventional commits in the title of your pull requests to ensure that the merge commit has the correct
> information. Something like this action might be handy: https://github.com/marketplace/actions/conventional-commit-in-pull-requests
### Default branch vs. any other branch 🎋 ### Default branch vs. any other branch 🎋
**Default branch** **Default branch**
@@ -107,27 +127,30 @@ Examples:
| name | description | required | default | | name | description | required | default |
| :--- | :--- | :--- | :--- | | :--- | :--- | :--- | :--- |
| scheme | The versioning scheme in-use, either `semver` or `calver` | No | `semver` | | scheme | The versioning scheme in-use, either `semver`, `calver` or `conventional_commits` | 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` | | 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` | | increment | The digit to increment, either `major`, `minor` or `patch`, ignored if `scheme` == `calver` | No | `patch` |
| release_branch | Specify a non-default branch to use for the release tag (the one without -pre) | No | | | release_branch | Specify a non-default branch to use for the release tag (the one without -pre) | No | |
| use_api | Use the GitHub API to discover current tags, which avoids the need for a git checkout, but requires `curl` and `jq` | No | `false` | | use_api | Use the GitHub API to discover current tags, which avoids the need for a git checkout, but requires `curl` and `jq` | No | `false` |
| tag_prefix | Prefix the tag with a string (defaults to empty string). e.g. if set to `@org/product/` the action will filter by this prefix and return `@org/product/1.2.3` in `prefixed-version` output | No | |
### Outputs 📤 ### Outputs 📤
| name | description | | name | description |
| :--- | :--- | | :--- | :--- |
| current-version | The current latest version detected from the git repositories tags | | current-version | The current latest version detected from the git repositories tags |
| current-v-version | The current latest version detected from the git repositories tags, prefixed with a `v` character | | current-v-version | The current latest version detected from the git repositories tags, prefixed with a `v` character |
| version | The incremented version number (e.g. the next version) | | version | The incremented version number (e.g. the next version) |
| v-version | The incremented version number (e.g. the next version), prefixed with a `v` character | | v-version | The incremented version number (e.g. the next version), prefixed with a `v` character |
| major-version | Major number of the incremented version | | major-version | Major number of the incremented version |
| minor-version | Minor number of the incremented version | | minor-version | Minor number of the incremented version |
| patch-version | Patch number of the incremented version | | patch-version | Patch number of the incremented version |
| pre-release-label | Pre-release label of the incremented version | | pre-release-label | Pre-release label of the incremented version |
| major-v-version | Major number of the incremented version, prefixed with a `v` character | | major-v-version | Major number of the incremented version, prefixed with a `v` character |
| minor-v-version | Minor number of the incremented version, prefixed with a `v` character | | minor-v-version | Minor number of the incremented version, prefixed with a `v` character |
| patch-v-version | Patch number of the incremented version, prefixed with a `v` character | | patch-v-version | Patch number of the incremented version, prefixed with a `v` character |
| prefixed-version | Incremented version calculated, including a `tag_prefix` if specified |
| prefixed-v-version | Incremented version calculated, prefixed with a `v` charatcter, and also including a `tag_prefix` if specified |
## Contributing 💕 ## Contributing 💕

View File

@@ -8,7 +8,14 @@ branding:
inputs: inputs:
scheme: 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 (e.g. the merge commit) to
determine the increment type, and supports the following increment types by keyword:
- patch (build, chore, ci, docs, fix, perf, refactor, revert, style, test)
- minor (feat)
- major (any of the above keywords followed by a '!' character, or 'BREAKING CHANGE:' in commit body)
required: false required: false
default: 'semver' default: 'semver'
pep440: pep440:
@@ -19,6 +26,9 @@ inputs:
description: | description: |
Field to increment - major, minor, or, patch (defaults to patch) Field to increment - major, minor, or, patch (defaults to patch)
If using the `conventional_commits` scheme, this is the default increment if the parsing of the merge commit fails to
find conventional commits information
Not applicable to `calver` scheme Not applicable to `calver` scheme
required: false required: false
default: 'patch' default: 'patch'
@@ -30,20 +40,25 @@ inputs:
description: 'Use the GitHub API to discover current tags, which avoids the need for a git checkout, but requires `curl` and `jq`' description: 'Use the GitHub API to discover current tags, which avoids the need for a git checkout, but requires `curl` and `jq`'
required: false required: false
default: false default: false
tag_prefix:
description: |
Prefix the tag with a string (defaults to empty string). e.g. if set to `@org/product/` the action will filter by this prefix and return `@org/product/1.2.3` in `prefixed-version` output
required: false
default: ''
outputs: outputs:
current-version: current-version:
description: 'Current normal version detected' description: 'Current normal version detected'
value: ${{ steps.version-lookup.outputs.CURRENT_VERSION }} value: ${{ steps.version-lookup.outputs.CURRENT_VERSION }}
current-v-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 }} value: ${{ steps.version-lookup.outputs.CURRENT_V_VERSION }}
version: version:
description: 'Incremented version calculated' description: 'Incremented version calculated'
value: ${{ steps.version-increment.outputs.VERSION }} value: ${{ steps.version-increment.outputs.VERSION }}
v-version: v-version:
description: 'Incremented version calculated, prefixed with a `v` charatcter' 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: major-version:
description: 'Major number of the incremented version' description: 'Major number of the incremented version'
value: ${{ steps.version-increment.outputs.MAJOR_VERSION }} value: ${{ steps.version-increment.outputs.MAJOR_VERSION }}
@@ -65,20 +80,27 @@ outputs:
patch-v-version: patch-v-version:
description: 'Patch number of the incremented version, prefixed with a `v` charatcter' description: 'Patch number of the incremented version, prefixed with a `v` charatcter'
value: ${{ steps.version-increment.outputs.PATCH_V_VERSION }} value: ${{ steps.version-increment.outputs.PATCH_V_VERSION }}
prefixed-version:
description: 'Incremented version calculated, including a `tag_prefix` if specified'
value: ${{ inputs.tag_prefix}}${{ steps.version-increment.outputs.VERSION }}
prefixed-v-version:
description: 'Incremented version calculated, prefixed with a `v` charatcter, and also including a `tag_prefix` if specified'
value: ${{ inputs.tag_prefix}}${{ steps.version-increment.outputs.V_VERSION }}
runs: runs:
using: "composite" using: "composite"
steps: steps:
- id: version-lookup - id: version-lookup
run: ${{ github.action_path }}/version-lookup.sh run: "${GITHUB_ACTION_PATH}/version-lookup.sh"
shell: bash shell: bash
env: env:
github_token: ${{ github.token }} github_token: ${{ github.token }}
scheme: ${{ inputs.scheme }} scheme: ${{ inputs.scheme }}
use_api: ${{ inputs.use_api }} use_api: ${{ inputs.use_api }}
tag_prefix: ${{ inputs.tag_prefix }}
- id: version-increment - id: version-increment
run: ${{ github.action_path }}/version-increment.sh run: "${GITHUB_ACTION_PATH}/version-increment.sh"
shell: bash shell: bash
env: env:
current_version: ${{ steps.version-lookup.outputs.CURRENT_VERSION }} current_version: ${{ steps.version-lookup.outputs.CURRENT_VERSION }}

View File

@@ -2,6 +2,9 @@
# shellcheck disable=SC2034 # shellcheck disable=SC2034
set -euo pipefail set -euo pipefail
# Force UTF-8 for all commands, for Git-Bash on Windows compatibility
export LC_ALL=C.UTF-8
##==---------------------------------------------------------------------------- ##==----------------------------------------------------------------------------
## SemVer regexes ## SemVer regexes
## see: https://semver.org/spec/v2.0.0.html#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string ## see: https://semver.org/spec/v2.0.0.html#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
@@ -11,13 +14,43 @@ pcre_master_ver='^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9
pcre_allow_vprefix="^v{0,1}${pcre_master_ver:1}" pcre_allow_vprefix="^v{0,1}${pcre_master_ver:1}"
pcre_old_calver='^(?P<major>0|[1-9]\d*)-0{0,1}(?P<minor>0|[0-9]\d*)-R(?P<patch>0|[1-9]\d*)$' pcre_old_calver='^(?P<major>0|[1-9]\d*)-0{0,1}(?P<minor>0|[0-9]\d*)-R(?P<patch>0|[1-9]\d*)$'
##==----------------------------------------------------------------------------
## Utility function for removing tag_prefix if present
remove_prefix() {
local tag="$1"
if [[ -n "${tag_prefix:-}" ]]; then
# Escape special characters in tag_prefix
local escaped_prefix
escaped_prefix=$(printf '%s\n' "$tag_prefix" | sed 's/[][\/.^$*]/\\&/g') # special chars matched by sed: ] [ / . ^ $ *
# shellcheck disable=SC2143
if [[ -z "$(echo "${tag}" | grep "^${tag_prefix}")" ]] ; then
echo ""
return
fi
# shellcheck disable=SC2001
echo "${tag}" | sed "s|^${escaped_prefix}||" # Use | as the delimiter to avoid conflicts with /
else
echo "${tag}"
fi
}
##==----------------------------------------------------------------------------
## 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 validation
input_errors='false' input_errors='false'
scheme="${scheme:-semver}" scheme="${scheme:-semver}"
if [[ "${scheme}" != 'semver' && "${scheme}" != 'calver' ]] ; then if [[ "${scheme}" != 'semver' && "${scheme}" != 'calver' && "${scheme}" != 'conventional_commits' ]] ; then
echo "🛑 Value of 'scheme' is not valid, choose from 'semver' or 'calver'" 1>&2 echo "🛑 Value of 'scheme' is not valid, choose from 'semver', 'calver' or 'conventional_commits" 1>&2
input_errors='true' input_errors='true'
fi fi
@@ -40,19 +73,39 @@ if [[ "${use_api}" == 'true' ]] ; then
fi fi
fi fi
# Check if the tag_prefix is set, and if not, set it to an empty string
tag_prefix="${tag_prefix:-}"
##==---------------------------------------------------------------------------- ##==----------------------------------------------------------------------------
## MacOS compatibility - for local testing ## MacOS compatibility
export grep="grep" export use_perl="false"
if [[ "$(uname)" == "Darwin" ]] ; then export use_gnugrep="false"
export grep="ggrep" if [[ "${GITHUB_ACTIONS:-}" == 'true' && "$(uname)" == 'Darwin' ]] ; then
if ! grep --version 1>/dev/null ; then export use_perl="true"
elif [[ "$(uname)" == 'Darwin' ]] ; then
if perl --version 1>/dev/null ; then
export use_perl="true"
elif ! ggrep --version 1>/dev/null ; then
echo "🛑 GNU grep not installed, try brew install coreutils" 1>&2 echo "🛑 GNU grep not installed, try brew install coreutils" 1>&2
exit 9 exit 9
else
export use_gnugrep="true"
fi fi
fi fi
function grep_p() {
if [[ "${use_perl}" == 'true' ]] ; then
perl -ne "print if /${1}/"
elif [[ "${use_gnugrep}" == 'true' ]] ; then
# shellcheck disable=SC2086
ggrep -P "${1}"
else
# shellcheck disable=SC2086
command grep -P "${1}"
fi
}
##==---------------------------------------------------------------------------- ##==----------------------------------------------------------------------------
## Non GitHub compatibility - for testing both locally and in BATS ## Non GitHub compatibility - for testing both locally and in BATS

View File

@@ -1,6 +1,15 @@
#!/usr/bin/env bats #!/usr/bin/env bats
# vim: set ft=sh sw=4 : # vim: set ft=sh sw=4 :
setup() {
# get the containing directory of this file
# use $BATS_TEST_FILENAME instead of ${BASH_SOURCE[0]} or $0,
# as those will point to the bats executable's location or the preprocessed file respectively
DIR="$( cd "$( dirname "$BATS_TEST_FILENAME" )" >/dev/null 2>&1 && pwd )"
# make executables in src/ visible to PATH
PATH="$DIR/../:$PATH"
}
load helper_print-info load helper_print-info
export repo=".tmp_testing/repo" export repo=".tmp_testing/repo"
@@ -22,7 +31,7 @@ function init_repo {
@test "fails if no current_version given" { @test "fails if no current_version given" {
init_repo init_repo
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 8 ] && [ "$status" -eq 8 ] &&
@@ -34,7 +43,7 @@ function init_repo {
export current_version=1.3.5-prerelease export current_version=1.3.5-prerelease
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 8 ] && [ "$status" -eq 8 ] &&
@@ -46,7 +55,7 @@ function init_repo {
export scheme="foover" export scheme="foover"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 8 ] && [ "$status" -eq 8 ] &&
@@ -58,7 +67,7 @@ function init_repo {
export pep440="yes" export pep440="yes"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 8 ] && [ "$status" -eq 8 ] &&
@@ -70,7 +79,7 @@ function init_repo {
export increment="critical" export increment="critical"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 8 ] && [ "$status" -eq 8 ] &&
@@ -90,7 +99,7 @@ function init_repo {
export current_version=1.2.3 export current_version=1.2.3
export increment="patch" export increment="patch"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -106,7 +115,7 @@ function init_repo {
export current_version=1.2.3 export current_version=1.2.3
export increment="minor" export increment="minor"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -123,7 +132,7 @@ function init_repo {
export pep404="false" export pep404="false"
export increment="minor" export increment="minor"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -139,7 +148,7 @@ function init_repo {
export current_version=1.2.3 export current_version=1.2.3
export increment="major" export increment="major"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -156,7 +165,7 @@ function init_repo {
export pep404="true" export pep404="true"
export increment="major" export increment="major"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -172,7 +181,7 @@ function init_repo {
export current_version=1.2.3 export current_version=1.2.3
export increment="major" export increment="major"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -189,7 +198,7 @@ function init_repo {
export current_version=2020.6.4 export current_version=2020.6.4
export scheme="calver" export scheme="calver"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -202,7 +211,7 @@ function init_repo {
export current_version="$(date +%Y.%-m.123)" export current_version="$(date +%Y.%-m.123)"
export scheme="calver" export scheme="calver"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -216,7 +225,7 @@ function init_repo {
export GITHUB_REF="refs/heads/super-awesome-feature" export GITHUB_REF="refs/heads/super-awesome-feature"
export short_ref="$(git rev-parse --short HEAD | sed 's/0*//')" export short_ref="$(git rev-parse --short HEAD | sed 's/0*//')"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -231,7 +240,7 @@ function init_repo {
export GITHUB_REF="refs/heads/releases" export GITHUB_REF="refs/heads/releases"
export release_branch="releases" export release_branch="releases"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -248,7 +257,7 @@ function init_repo {
export GITHUB_REF="refs/heads/super-awesome-python" export GITHUB_REF="refs/heads/super-awesome-python"
export short_ref="$(git rev-parse --short HEAD | sed 's/0*//')" export short_ref="$(git rev-parse --short HEAD | sed 's/0*//')"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -265,10 +274,159 @@ function init_repo {
export GITHUB_REF="refs/heads/super-awesome-python" export GITHUB_REF="refs/heads/super-awesome-python"
export short_ref="$(git rev-parse --short HEAD | sed 's/0*//')" export short_ref="$(git rev-parse --short HEAD | sed 's/0*//')"
run ../../version-increment.sh run version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
[[ "$output" = *"PRE_RELEASE_LABEL=pre.${short_ref}"* ]] && [[ "$output" = *"PRE_RELEASE_LABEL=pre.${short_ref}"* ]] &&
[[ "$output" = *"VERSION=$(date +%Y.%-m.1)+pre.${short_ref}"* ]] [[ "$output" = *"VERSION=$(date +%Y.%-m.1)+pre.${short_ref}"* ]]
} }
@test "increments the patch version after a fix commit (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "fix: something" > fix.txt
git add fix.txt
git commit -m "fix: something"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=1.2.4"* ]]
[[ "$output" != *"No conventional commit found"* ]]
}
@test "increments the patch version after a scoped fix commit (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "fix: something" > fix.txt
git add fix.txt
git commit -m "fix(api): something"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=1.2.4"* ]]
[[ "$output" != *"No conventional commit found"* ]]
}
@test "increments the major version after a breaking fix commit (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "fix: breaking something" > fix.txt
git add fix.txt
git commit -m "fix!: something"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=2.0.0"* ]]
[[ "$output" != *"No conventional commit found"* ]]
}
@test "increments the minor version after a feat commit (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "new feature" > feat.txt
git add feat.txt
git commit -m "feat: something"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=1.3.0"* ]]
[[ "$output" != *"No conventional commit found"* ]]
}
@test "increments the major version after a breaking feat commit (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "breaking new feature" > feat.txt
git add feat.txt
git commit -m "feat!: something"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=2.0.0"* ]]
[[ "$output" != *"No conventional commit found"* ]]
}
@test "increments the major version after a breaking change in the commit body (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "breaking new fix" > feat.txt
git add feat.txt
git commit -m "Fix: something
BREAKING CHANGE: really important"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=2.0.0"* ]]
[[ "$output" != *"No conventional commit found"* ]]
}
@test "increments the patch version by default if no conventional commits found and enabled (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "some new change" > feat.txt
git add feat.txt
git commit -m "new change"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=1.2.4"* ]]
[[ "$output" = *"No conventional commit found"* ]]
}
@test "increments the patch version by default if no conventional commits found and enabled (conventional commits) (with tag_prefix)" {
init_repo
export tag_prefix="@org/product@"
export current_version="1.2.3"
export scheme="conventional_commits"
echo "some new change" > feat.txt
git add feat.txt
git commit -m "new change"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=1.2.4"* ]]
[[ "$output" = *"V_VERSION=v1.2.4"* ]]
[[ "$output" = *"No conventional commit found"* ]]
}

View File

@@ -5,6 +5,15 @@ load helper_print-info
export repo=".tmp_testing/repo" export repo=".tmp_testing/repo"
setup() {
# get the containing directory of this file
# use $BATS_TEST_FILENAME instead of ${BASH_SOURCE[0]} or $0,
# as those will point to the bats executable's location or the preprocessed file respectively
DIR="$( cd "$( dirname "$BATS_TEST_FILENAME" )" >/dev/null 2>&1 && pwd )"
# make executables in src/ visible to PATH
PATH="$DIR/../:$PATH"
}
function init_repo { function init_repo {
rm -rf "${repo}" && rm -rf "${repo}" &&
mkdir -p "${repo}" && mkdir -p "${repo}" &&
@@ -22,7 +31,7 @@ function init_repo {
export scheme="foover" export scheme="foover"
run ../../version-lookup.sh run version-lookup.sh
print_run_info print_run_info
[ "$status" -eq 8 ] && [ "$status" -eq 8 ] &&
@@ -43,7 +52,7 @@ function init_repo {
git tag 0.1.1 git tag 0.1.1
git tag 0.1.2 git tag 0.1.2
run ../../version-lookup.sh run version-lookup.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -55,7 +64,38 @@ function init_repo {
git tag 0.1.2 git tag 0.1.2
run ../../version-lookup.sh run version-lookup.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"CURRENT_VERSION=0.1.2"* ]] &&
[[ "$output" = *"CURRENT_V_VERSION=v0.1.2"* ]]
}
@test "finds the current normal version with tag_prefix enabled" {
init_repo
export tag_prefix="@org/product@"
git tag @org/product@0.0.1
git tag @org/product@0.1.1
git tag @org/product@0.1.2
run version-lookup.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"CURRENT_VERSION=0.1.2"* ]]
}
@test "tag_prefix enabled prefixes with a v" {
init_repo
export tag_prefix="@org/product/"
git tag @org/product/0.1.2
run version-lookup.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -69,17 +109,35 @@ function init_repo {
git tag 1.2.300 git tag 1.2.300
git tag 1.2.301-dev.234 git tag 1.2.301-dev.234
run ../../version-lookup.sh run version-lookup.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
[[ "$output" = *"CURRENT_VERSION=1.2.300"* ]] [[ "$output" = *"CURRENT_VERSION=1.2.300"* ]]
} }
@test "finds only prefixed tags when tag_prefix set" {
init_repo
export tag_prefix="my_product-"
git tag my_product-0.1.2
git tag my_product-0.1.3-dev.123
git tag 2.4.5
git tag 2.4.6-dev.456
run version-lookup.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"CURRENT_VERSION=0.1.2"* ]] &&
[[ "$output" = *"CURRENT_V_VERSION=v0.1.2"* ]]
}
@test "returns 0.0.0 if no normal version detected" { @test "returns 0.0.0 if no normal version detected" {
init_repo init_repo
run ../../version-lookup.sh run version-lookup.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -91,7 +149,21 @@ function init_repo {
git tag 0.0.1-dev.999 git tag 0.0.1-dev.999
run ../../version-lookup.sh run version-lookup.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"CURRENT_VERSION=0.0.0"* ]]
}
@test "returns 0.0.0 if no prefix version detected even if there's a non-prefix release version" {
init_repo
export tag_prefix="code/"
git tag 0.1.0
run version-lookup.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
@@ -103,31 +175,19 @@ function init_repo {
export scheme="calver" export scheme="calver"
run ../../version-lookup.sh run version-lookup.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
[[ "$output" = *"CURRENT_VERSION=$(date '+%Y.%-m.0')"* ]] [[ "$output" = *"CURRENT_VERSION=$(date '+%Y.%-m.0')"* ]]
} }
@test "converts from older calver scheme automatically" {
init_repo
git tag 2020-09-R2
run ../../version-lookup.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"CURRENT_VERSION=2020.9.2"* ]]
}
@test "strips v from the version" { @test "strips v from the version" {
init_repo init_repo
git tag v3.4.5 git tag v3.4.5
run ../../version-lookup.sh run version-lookup.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&

View File

@@ -15,7 +15,7 @@ fi
if [[ -z "${current_version:-}" ]] ; then if [[ -z "${current_version:-}" ]] ; then
echo "🛑 Environment variable 'current_version' is unset or empty" 1>&2 echo "🛑 Environment variable 'current_version' is unset or empty" 1>&2
input_errors='true' input_errors='true'
elif [[ -z "$(echo "${current_version}" | ${grep} -P "${pcre_master_ver}")" ]] ; then elif [[ -z "$(echo "${current_version}" | grep_p "${pcre_master_ver}")" ]] ; then
echo "🛑 Environment variable 'current_version' is not a valid normal version (M.m.p)" 1>&2 echo "🛑 Environment variable 'current_version' is not a valid normal version (M.m.p)" 1>&2
input_errors='true' input_errors='true'
fi fi
@@ -30,7 +30,7 @@ fi
default_branch='main' default_branch='main'
# use release_branch if not empty # use release_branch if not empty
if [[ -n "${release_branch:-}" ]] ; then if [[ -n "${release_branch:-}" ]] ; then
default_branch="${release_branch}" default_branch="${release_branch}"
elif [[ -z "${BATS_VERSION:-}" ]] ; then elif [[ -z "${BATS_VERSION:-}" ]] ; then
# if we're _not_ testing, then _actually_ check the origin # if we're _not_ testing, then _actually_ check the origin
if [[ "${use_api:-}" == 'true' ]] ; then if [[ "${use_api:-}" == 'true' ]] ; then
@@ -43,11 +43,12 @@ elif [[ -z "${BATS_VERSION:-}" ]] ; then
| jq -r '.default_branch' | jq -r '.default_branch'
)" )"
else else
default_branch="$(git remote show origin | ${grep} 'HEAD branch' | cut -d ' ' -f 5)" default_branch="$(git remote show origin | grep 'HEAD branch' | cut -d ' ' -f 5)"
fi fi
fi fi
current_ref="${GITHUB_REF:-}" current_ref="${GITHUB_REF:-}"
git_commit_sha=${GITHUB_SHA:-}
if [[ "${use_api:-}" == 'true' ]] ; then 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 # because we cannot use `rev-parse` with the API, we'll take a punt that 9 characters is enough for uniqueness
@@ -55,7 +56,32 @@ 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 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 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 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 [[ "${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 ## Version increment
@@ -102,7 +128,7 @@ if [[ "${current_ref}" != "refs/heads/${default_branch}" ]] ; then
echo "PRE_RELEASE_LABEL=${pre_release}" >> "${GITHUB_OUTPUT}" echo "PRE_RELEASE_LABEL=${pre_release}" >> "${GITHUB_OUTPUT}"
fi fi
if [[ -z "$(echo "${new_version}" | ${grep} -P "${pcre_semver}")" ]] ; then if [[ -z "$(echo "${new_version}" | grep_p "${pcre_semver}")" ]] ; then
echo "🛑 Version incrementing has failed to produce a semver compliant version" 1>&2 echo "🛑 Version incrementing has failed to produce a semver compliant version" 1>&2
echo " See: https://semver.org/spec/v2.0.0.html" 1>&2 echo " See: https://semver.org/spec/v2.0.0.html" 1>&2
echo " Failed version string: '${new_version}'" 1>&2 echo " Failed version string: '${new_version}'" 1>&2

View File

@@ -10,18 +10,6 @@ if [[ "${input_errors}" == 'true' ]] ; then
exit 8 exit 8
fi fi
##==----------------------------------------------------------------------------
## MacOS compatibility - for local testing
export grep="grep"
if [[ "$(uname)" == "Darwin" ]] ; then
export grep="ggrep"
if ! grep --version 1>/dev/null ; then
echo "🛑 GNU grep not installed, try brew install coreutils" 1>&2
exit 9
fi
fi
##==---------------------------------------------------------------------------- ##==----------------------------------------------------------------------------
## Get tags from GitHub repo ## Get tags from GitHub repo
@@ -44,30 +32,27 @@ if [[ "${use_api:-}" == 'true' ]] ; then
-H "X-GitHub-Api-Version: 2022-11-28" \ -H "X-GitHub-Api-Version: 2022-11-28" \
"${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/git/matching-refs/tags/" \ "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/git/matching-refs/tags/" \
| jq -r '.[].ref' | sed 's|refs/tags/||g' \ | jq -r '.[].ref' | sed 's|refs/tags/||g' \
| { ${grep} -P "${pcre_allow_vprefix}" || true; } | sed 's/^v//g' | sort -V | tail -n 1 | while read -r tag; do remove_prefix "$tag"; done \
| { grep_p "${pcre_allow_vprefix}" || true; } \
| sed 's/^v//g' \
| sort -V | tail -n 1
)" )"
else else
current_version="$( current_version="$(
git tag -l \ git tag -l \
| { ${grep} -P "${pcre_allow_vprefix}" || true; } | sed 's/^v//g' | sort -V | tail -n 1 | while read -r tag; do remove_prefix "$tag"; done \
| { grep_p "${pcre_allow_vprefix}" || true; } \
| sed 's/^v//g' \
| sort -V | tail -n 1
)" )"
fi fi
# support transition from an old reecetech calver style (yyyy-mm-Rr, where R is the literal `R`, and r is the nth release for the month)
if [[ -z "${current_version:-}" ]] ; then
current_version="$(git tag -l | { ${grep} -P "${pcre_old_calver}" || true; } | sort -V | tail -n 1)"
if [[ -n "${current_version:-}" ]] ; then
# convert - to . and drop leading zeros & the R
current_version="$(echo "${current_version}" | sed -r 's/^([0-9]+)-0{0,1}([0-9]+)-R0{0,1}([0-9]+)$/\1.\2.\3/')"
fi
fi
# handle no version detected - start versioning! # handle no version detected - start versioning!
if [[ -z "${current_version:-}" ]] ; then if [[ -z "${current_version:-}" ]] ; then
echo "⚠️ No previous release version identified in git tags" echo "⚠️ No previous release version identified in git tags"
# brand new repo! (probably) # brand new repo! (probably)
case "${scheme}" in case "${scheme}" in
semver) semver | conventional_commits)
current_version="0.0.0" current_version="0.0.0"
;; ;;
calver) calver)