65 Commits

Author SHA1 Message Date
Phil Jay
de5ab041fb Merge pull request #25 from reecetech/update-shellcheck-action
Update shellcheck action
2023-09-20 10:41:05 +10:00
Phil Jay
3ac8392aa4 Update to latest shellcheck
Solves for `set-output` deprecation warnings
2023-09-20 10:39:13 +10:00
Phil Jay
72c1fa6077 Bump up example version 2023-09-20 10:38:38 +10:00
Phil Jay
f21e559797 Merge pull request #24 from reecetech/swtich-to-softprops/action-gh-release
Replace out-of-date action
2023-09-20 10:36:27 +10:00
Phil Jay
4415fcb6c0 Replace out-of-date action
The update to node 16 has been un-merged for a long time: https://github.com/marvinpinto/action-automatic-releases/pull/2
2023-09-20 10:33:38 +10:00
Phil Jay
4846cbaf9d Merge pull request #23 from ps-jay/main
Introduce test for `release_branch`, & update README
2023-09-18 09:11:58 +10:00
Phil Jay
468208262a Default variable to blank string 2023-09-18 09:01:27 +10:00
Phil Jay
e5f8667dfc Add test for release_branch 2023-09-18 09:01:27 +10:00
Phil Jay
2ef15157dd Update README 2023-09-18 09:01:27 +10:00
Phil Jay
0974302def Merge pull request #22 from octoev/main
Add release branch as an input
2023-09-18 09:00:11 +10:00
Adam Short
67d70b45a4 Specify "release_branch" is not required 2023-09-05 10:15:26 +01:00
adamshortev
47e175a747 Apply suggestions from code review
Co-authored-by: Chris Bennett <110393183+oev-chrisbennett@users.noreply.github.com>
2023-08-30 11:48:14 +01:00
Adam Short
8202de8885 Give action unique name. 2023-08-30 11:17:54 +01:00
Adam Short
fa8feb816e Add release branch as an input 2023-08-25 16:46:55 +01:00
Phil Jay
1e4c88d873 Merge pull request #21 from reecetech/support-pep440
Add PEP440 compatibility mode
2023-04-27 12:00:51 +10:00
Phil Jay
d5f78b25d1 Update test cases 2023-04-27 11:59:49 +10:00
Phil Jay
bfb5689c4d Update README 2023-04-27 09:33:35 +10:00
Phil Jay
f81c317cbd Alter PEP440 handling to support both sem and cal 2023-04-27 09:10:47 +10:00
Phil Jay
bb0e075f8b Add pep440 mode 2023-04-26 16:31:08 +10:00
Phil Jay
f1fae3d6b7 Merge pull request #20 from reecetech/fix-label
Fix output name to match documentation
2023-03-10 12:49:39 +11:00
Phil Jay
77dfab16c0 Update README.md for next release 2023-03-10 12:41:56 +11:00
Phil Jay
2414f2fa44 Fix output name to match documentation 2023-03-10 12:40:51 +11:00
Phil Jay
f6d4e915f4 Merge pull request #19 from reecetech/update-ver-in-README
Update to have the latest version as the example in the README
2022-10-19 14:28:09 +11:00
Phil Jay
5f9f764060 New version available! 2022-10-19 14:26:06 +11:00
Phil Jay
0fd6f1742d Merge pull request #18 from reecetech/rm-set-output-calls
Remove deprecated `set-output` calls
2022-10-19 10:57:07 +11:00
Phil Jay
8e33684d42 Update action.yml for output name changes 2022-10-19 10:49:16 +11:00
Phil Jay
b7be5e00c2 Disable style warning 2022-10-19 10:49:16 +11:00
Phil Jay
ced1d4ac1d Replace set-output with append to GITHUB_OUTPUT 2022-10-19 09:24:11 +11:00
Phil Jay
e7c0a5aac2 Update tests to _not_ expect set-output 2022-10-19 09:24:11 +11:00
Phil Jay
c1893b945a Add GITHUB_OUTPUT override for testing 2022-10-19 08:51:07 +11:00
Phil Jay
5d4fc14ad5 Merge pull request #17 from reecetech/update-bats
Update BATS
2022-10-18 16:33:29 +11:00
Phil Jay
1d159768e8 Update BATS 2022-10-18 16:31:37 +11:00
Phil Jay
69cfa4fa80 Merge pull request #16 from reecetech/action-updates
Update GitHub actions
2022-10-18 16:29:18 +11:00
Phil Jay
b9bae4a2dc Update GitHub actions 2022-10-18 16:10:59 +11:00
Philip Jay
53a0819e66 Merge pull request #15 from reecetech/pre-release
Expose the pre-release label as an output
2022-05-16 11:08:08 +10:00
Phil Jay
e53268eb3f Expose the pre-release label as an output 2022-05-12 15:44:33 +10:00
Asanga K
8d649fcfa3 Merge pull request #14 from reecetech/fix-git-fetch-tags-issue
[DE-4875] Forcing git fetch tags
2022-02-25 13:36:45 +11:00
karunasa
ccbbbe93a8 [DE-4875] Forcing git fetch tags
Workaround for the issue where in certain cases it's failing when a version tag has moved.
2022-02-25 09:26:09 +11:00
Asanga
ddbbe72b7f Merge pull request #13 from reecetech/exposing-convenience-version-numbers
Exposing major, minor and patch numbers as convenience outputs
2022-02-11 08:26:37 +11:00
Phil Jay
ba14b463c4 Add both "plain" and v prefix version outputs 2022-02-10 22:27:59 +11:00
Phil Jay
fde70f2da9 Add tests for new desired output 2022-02-10 22:27:23 +11:00
karunasa
8b854651df Exposing major, minor and patch numbers as outputs 2022-02-10 16:56:32 +11:00
Asanga
40611bca96 Merge pull request #12 from reecetech/using-v-outputs
Using v-* outputs in favor of string manipulation
2022-02-08 15:14:10 +11:00
Asanga
ddfcb5bc04 Updating to the latest version 2022-02-08 15:07:45 +11:00
Asanga
3d00642def Using v-* outputs in favor of string manipulation 2022-02-08 15:06:28 +11:00
Philip Jay
827489c005 Merge pull request #11 from reecetech/fixing-outputs
Fixing the outputs to match README
2022-02-08 14:55:07 +11:00
Phil Jay
ee28762c5b Update README for next version 2022-02-08 14:52:41 +11:00
Asanga
1c6699b17a Fixing the outputs to match with README 2022-02-08 14:40:16 +11:00
Philip Jay
822afeb70c Merge pull request #10 from reecetech/DE-4401-fix-for-pipefails
Avoid broken pipe exits (`141`) when `head` exits
2022-02-01 16:52:07 +11:00
Phil Jay
9492ff84fb Avoid broken pipe exits (141) when head exits
Intermittent issue, only observed on self-hosted agents on VMware (due
to multi-core processing)
2022-02-01 12:23:49 +11:00
Philip Jay
7c6e26cbd9 Merge pull request #9 from reecetech/v-prefix
Add `v` prefixed version output
2021-11-22 10:04:07 +11:00
Phil Jay
38a48eeef1 Add v prefixed version outputs
See: https://github.com/reecetech/version-increment/issues/8
2021-11-15 06:54:57 +11:00
Phil Jay
4988018178 Add tests for v prefixed version output 2021-11-15 06:54:21 +11:00
Philip Jay
3016172c72 Merge pull request #7 from reecetech/update-version-in-README
Replace with latest version
2021-11-03 13:14:27 +11:00
Phil Jay
a17b442bee Replace with latest version
2021.10.4 had a bug, we should have updated this when 2021.10.5 came
out.  Now the next version will be 2021.11.1
2021-11-01 19:08:01 +11:00
Philip Jay
406cc3a662 Merge pull request #6 from reecetech/fix-for-inputs-in-composites
Fix for inputs in composites
2021-10-22 12:00:08 +11:00
Phil Jay
a7121378a5 Fix for composite actions not having INPUT_ vars
See: https://github.com/actions/runner/issues/665
2021-10-22 11:54:47 +11:00
Phil Jay
f9aea6e594 Use latest BATS 2021-10-22 11:54:47 +11:00
Philip Jay
c0c7194013 Merge pull request #5 from reecetech/rework
Rework for slightly better input validation
2021-10-22 07:35:13 +11:00
Phil Jay
a54c16bb35 Rework for slightly better code style 2021-10-21 23:38:59 +11:00
Philip Jay
8766e6c6af Merge pull request #4 from reecetech/fixup-for-env
Fix for `env`, fix for README
2021-10-20 13:54:55 +11:00
Phil Jay
8700256121 Fix: composite runs using bash require env 2021-10-20 12:11:22 +11:00
Phil Jay
2fa6f4f0f9 Update to show version 2021-10-20 12:07:00 +11:00
Philip Jay
ef5bc12fc4 Merge pull request #2 from reecetech/fixup-action.yml
Fix metadata syntax in `action.yml` 🛠
2021-10-20 11:40:15 +11:00
Phil Jay
efc89dc7d0 Fix metadata syntax in action.yml 🛠
```
Description must be less than 125 characters.
```
2021-10-20 11:31:17 +11:00
9 changed files with 461 additions and 215 deletions

View File

@@ -13,10 +13,10 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: Run ShellCheck - name: Run ShellCheck
uses: ludeeus/action-shellcheck@94e0aab03ca135d11a35e5bfc14e6746dc56e7e9 uses: ludeeus/action-shellcheck@2.0.0
with: with:
check_together: 'yes' check_together: 'yes'
@@ -24,12 +24,12 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: Setup bats - name: Setup bats
uses: mig4/setup-bats@af9a00deb21b5d795cabfeaa8d9060410377686d uses: mig4/setup-bats@af9a00deb21b5d795cabfeaa8d9060410377686d # v1.2.0
with: with:
bats-version: 1.2.1 bats-version: 1.8.0
- name: Test - name: Test
run: bats tests/*.bats run: bats tests/*.bats
@@ -41,7 +41,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: Lookup version - name: Lookup version
id: version-lookup id: version-lookup
@@ -51,14 +51,13 @@ jobs:
id: version-increment id: version-increment
run: ./version-increment.sh run: ./version-increment.sh
env: env:
current_version: ${{ steps.version-lookup.outputs.current-version }} current_version: ${{ steps.version-lookup.outputs.CURRENT_VERSION }}
INPUT_SCHEME: calver scheme: calver
- name: Release version - name: Release version
uses: marvinpinto/action-automatic-releases@919008cf3f741b179569b7a6fb4d8860689ab7f0 uses: softprops/action-gh-release@v1
if: ${{ github.ref == 'refs/heads/main' }} if: ${{ github.ref_name == github.event.repository.default_branch }}
with: with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
draft: false draft: false
prerelease: false prerelease: false
automatic_release_tag: "${{ steps.version-increment.outputs.version }}" tag_name: "${{ steps.version-increment.outputs.VERSION }}"

View File

@@ -5,8 +5,11 @@
### ⌨️ Example ### ⌨️ Example
```yaml ```yaml
- name: Checkout code
uses: actions/checkout@v2
- name: Get next version - name: Get next version
uses: reecetech/version-increment uses: reecetech/version-increment@2023.9.3
id: version id: version
with: with:
scheme: semver scheme: semver
@@ -21,6 +24,7 @@
``` ```
### 🔖 semver ### 🔖 semver
This action will detect the current latest _normal_ semantic version (semver) from the tags in 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 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 the patch digit). Both the current latest and the incremented version are
@@ -49,14 +53,16 @@ e.g. `2021.6.2`
| minor | month | `6` | | minor | month | `6` |
| patch | release | `2` | The *n*th release for the month | | 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. set to the current year and month, and the release digit will be reset to 1.
### 🎋 Default branch vs. any other branch ### 🎋 Default branch vs. any other branch
**Default 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: Examples:
* `1.2.7` * `1.2.7`
@@ -64,7 +70,10 @@ Examples:
**Any other branch** **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: Examples:
* `1.2.7-pre.41218aa78` * `1.2.7-pre.41218aa78`
@@ -72,17 +81,28 @@ Examples:
### 📥 Inputs ### 📥 Inputs
| 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` or `calver` | No | `semver` |
| increment | The digit to increment, either `major`, `minor` or `patch`, ignored if `scheme` == `calver` | No | `patch` | | 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` |
| release_branch | Specify a non-default branch to use for the release tag (the one without -pre) | 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 |
| version | The incremented version number (e.g. the next version) | | 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) |
| v-version | The incremented version number (e.g. the next version), prefixed with a `v` character |
| major-version | Major number of the incremented version |
| minor-version | Minor number of the incremented version |
| patch-version | Patch number 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 |
| 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 |
## 💕 Contributing ## 💕 Contributing

View File

@@ -1,17 +1,20 @@
--- ---
name: 'Version Increment' name: 'Version Increment'
description: | description: Inspects the git tags to determine the current normal version, and returns the next version number
Inspects the git tags to determine the current normal version, and returns the
next version number.
A normal version will be returned if the branch is the default branch branding:
(usually `main`), otherwise a pre-release version will be returned. icon: plus
color: purple
inputs: inputs:
scheme: scheme:
description: 'Versioning scheme - semver, or, calver (defaults to semver)' description: 'Versioning scheme - semver, or, calver (defaults to semver)'
required: false required: false
default: 'semver' default: 'semver'
pep440:
description: 'PEP440 compatibility mode - shifts the pre-release version information into build metadata instead'
required: false
default: false
increment: increment:
description: | description: |
Field to increment - major, minor, or, patch (defaults to patch) Field to increment - major, minor, or, patch (defaults to patch)
@@ -19,14 +22,45 @@ inputs:
Not applicable to `calver` scheme Not applicable to `calver` scheme
required: false required: false
default: 'patch' default: 'patch'
release_branch:
description: 'Specify a non-default branch to use for the release tag (the one without -pre)'
required: false
type: string
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:
description: 'Current normal version detected, prefixed with a `v` charatcter'
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:
description: 'Incremented version calculated, prefixed with a `v` charatcter'
value: ${{ steps.version-increment.outputs.V_VERSION }}
major-version:
description: 'Major number of the incremented version'
value: ${{ steps.version-increment.outputs.MAJOR_VERSION }}
minor-version:
description: 'Minor number of the incremented version'
value: ${{ steps.version-increment.outputs.MINOR_VERSION }}
patch-version:
description: 'Patch number of the incremented version'
value: ${{ steps.version-increment.outputs.PATCH_VERSION }}
pre-release-label:
description: 'Pre-release label of the incremented version'
value: ${{ steps.version-increment.outputs.PRE_RELEASE_LABEL }}
major-v-version:
description: 'Major number of the incremented version, prefixed with a `v` charatcter'
value: ${{ steps.version-increment.outputs.MAJOR_V_VERSION }}
minor-v-version:
description: 'Minor number of the incremented version, prefixed with a `v` charatcter'
value: ${{ steps.version-increment.outputs.MINOR_V_VERSION }}
patch-v-version:
description: 'Patch number of the incremented version, prefixed with a `v` charatcter'
value: ${{ steps.version-increment.outputs.PATCH_V_VERSION }}
runs: runs:
using: "composite" using: "composite"
@@ -34,9 +68,15 @@ runs:
- 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:
scheme: ${{ inputs.scheme }}
- id: version-increment - id: version-increment
run: ${{ github.action_path }}/version-increment.sh run: ${{ github.action_path }}/version-increment.sh
shell: bash shell: bash
with: env:
current_version: ${{ steps.version-lookup.outputs.current-version }} current_version: ${{ steps.version-lookup.outputs.CURRENT_VERSION }}
increment: ${{ inputs.increment }}
pep440: ${{ inputs.pep440 }}
scheme: ${{ inputs.scheme }}
release_branch: ${{ inputs.release_branch }}

View File

@@ -2,12 +2,31 @@
# shellcheck disable=SC2034 # shellcheck disable=SC2034
set -euo pipefail set -euo pipefail
# see: https://semver.org/spec/v2.0.0.html#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string ##==----------------------------------------------------------------------------
## SemVer regexes
## see: https://semver.org/spec/v2.0.0.html#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
pcre_semver='^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$' pcre_semver='^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$'
pcre_master_ver='^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)$' pcre_master_ver='^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)$'
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*)$'
##==----------------------------------------------------------------------------
## 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
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 ## MacOS compatibility - for local testing
@@ -19,3 +38,10 @@ if [[ "$(uname)" == "Darwin" ]] ; then
exit 9 exit 9
fi fi
fi fi
##==----------------------------------------------------------------------------
## Non GitHub compatibility - for testing both locally and in BATS
if [[ -z "${GITHUB_OUTPUT:-}" || -n "${BATS_VERSION:-}" ]] ; then
export GITHUB_OUTPUT="/dev/stdout"
fi

View File

@@ -0,0 +1,274 @@
#!/usr/bin/env bats
# vim: set ft=sh sw=4 :
load helper_print-info
export repo=".tmp_testing/repo"
function init_repo {
rm -rf "${repo}" &&
mkdir -p "${repo}" &&
cd "${repo}" &&
git init &&
git checkout -b main &&
touch README.md &&
git add README.md &&
git config user.email test@example.com &&
git config user.name Tester &&
git commit -m "README" &&
export GITHUB_REF="refs/heads/main"
}
@test "fails if no current_version given" {
init_repo
run ../../version-increment.sh
print_run_info
[ "$status" -eq 8 ] &&
[[ "$output" = *"Environment variable 'current_version' is unset or empty"* ]]
}
@test "fails if invalid current_version given" {
init_repo
export current_version=1.3.5-prerelease
run ../../version-increment.sh
print_run_info
[ "$status" -eq 8 ] &&
[[ "$output" = *"Environment variable 'current_version' is not a valid normal version"* ]]
}
@test "fails if invalid scheme given" {
init_repo
export scheme="foover"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 8 ] &&
[[ "$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
export increment="critical"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 8 ] &&
[[ "$output" = *"Value of 'increment' is not valid, choose from 'major', 'minor', or 'patch'"* ]]
}
@test "no deprecated set-output calls made" {
run grep -q "::set-output" version-increment.sh
print_run_info
[ "$status" -eq 1 ]
}
@test "increments the patch digit correctly (semver)" {
init_repo
export current_version=1.2.3
export increment="patch"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"MAJOR_VERSION=1"* ]] &&
[[ "$output" = *"MINOR_VERSION=2"* ]] &&
[[ "$output" = *"PATCH_VERSION=4"* ]] &&
[[ "$output" = *"VERSION=1.2.4"* ]]
}
@test "increments the minor digit correctly (semver)" {
init_repo
export current_version=1.2.3
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 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
export current_version=1.2.3
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 "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
export current_version=1.2.3
export increment="major"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=2.0.0"* ]] &&
[[ "$output" = *"MAJOR_V_VERSION=v2"* ]] &&
[[ "$output" = *"MINOR_V_VERSION=v0"* ]] &&
[[ "$output" = *"PATCH_V_VERSION=v0"* ]] &&
[[ "$output" = *"V_VERSION=v2.0.0"* ]]
}
@test "increments to a new month (calver)" {
init_repo
export current_version=2020.6.4
export scheme="calver"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=$(date +%Y.%-m.1)"* ]]
}
@test "increments the patch digit within a month (calver)" {
init_repo
export current_version="$(date +%Y.%-m.123)"
export scheme="calver"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=$(date +%Y.%-m.124)"* ]]
}
@test "appends prerelease information if on a branch" {
init_repo
export current_version=1.2.3
export GITHUB_REF="refs/heads/super-awesome-feature"
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=1.2.4-pre.${short_ref}"* ]]
}
@test "does not append prerelease information if on a specified release_branch" {
init_repo
export current_version=1.2.3
export GITHUB_REF="refs/heads/releases"
export release_branch="releases"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" != *"PRE_RELEASE_LABEL=pre."* ]] &&
[[ "$output" != *"VERSION=1.2.4-pre."* ]] &&
[[ "$output" = *"VERSION=1.2.4"* ]]
}
@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}"* ]]
}

View File

@@ -20,7 +20,7 @@ function init_repo {
@test "fails if invalid scheme given" { @test "fails if invalid scheme given" {
init_repo init_repo
export INPUT_SCHEME="foover" export scheme="foover"
run ../../version-lookup.sh run ../../version-lookup.sh
@@ -29,6 +29,13 @@ function init_repo {
[[ "$output" = *"Value of 'scheme' is not valid"* ]] [[ "$output" = *"Value of 'scheme' is not valid"* ]]
} }
@test "no deprecated set-output calls made" {
run grep -q "::set-output" version-lookup.sh
print_run_info
[ "$status" -eq 1 ]
}
@test "finds the current normal version" { @test "finds the current normal version" {
init_repo init_repo
@@ -40,7 +47,20 @@ function init_repo {
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=current-version::0.1.2"* ]] [[ "$output" = *"CURRENT_VERSION=0.1.2"* ]]
}
@test "prefixes with a v" {
init_repo
git tag 0.1.2
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 even if there's a newer pre-release version" { @test "finds the current normal version even if there's a newer pre-release version" {
@@ -53,7 +73,7 @@ function init_repo {
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=current-version::1.2.300"* ]] [[ "$output" = *"CURRENT_VERSION=1.2.300"* ]]
} }
@test "returns 0.0.0 if no normal version detected" { @test "returns 0.0.0 if no normal version detected" {
@@ -63,7 +83,7 @@ function init_repo {
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=current-version::0.0.0"* ]] [[ "$output" = *"CURRENT_VERSION=0.0.0"* ]]
} }
@test "returns 0.0.0 if no normal version detected even if there's a pre-release version" { @test "returns 0.0.0 if no normal version detected even if there's a pre-release version" {
@@ -75,19 +95,19 @@ function init_repo {
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=current-version::0.0.0"* ]] [[ "$output" = *"CURRENT_VERSION=0.0.0"* ]]
} }
@test "returns a calver if no normal version detected and calver scheme specified" { @test "returns a calver if no normal version detected and calver scheme specified" {
init_repo init_repo
export INPUT_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" = *"::set-output name=current-version::$(date '+%Y.%-m.0')"* ]] [[ "$output" = *"CURRENT_VERSION=$(date '+%Y.%-m.0')"* ]]
} }
@test "converts from older calver scheme automatically" { @test "converts from older calver scheme automatically" {
@@ -99,7 +119,7 @@ function init_repo {
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=current-version::2020.9.2"* ]] [[ "$output" = *"CURRENT_VERSION=2020.9.2"* ]]
} }
@test "strips v from the version" { @test "strips v from the version" {
@@ -111,5 +131,5 @@ function init_repo {
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=current-version::3.4.5"* ]] [[ "$output" = *"CURRENT_VERSION=3.4.5"* ]]
} }

View File

@@ -1,147 +0,0 @@
#!/usr/bin/env bats
# vim: set ft=sh sw=4 :
load helper_print-info
export repo=".tmp_testing/repo"
function init_repo {
rm -rf "${repo}" &&
mkdir -p "${repo}" &&
cd "${repo}" &&
git init &&
git checkout -b main &&
touch README.md &&
git add README.md &&
git config user.email test@example.com &&
git config user.name Tester &&
git commit -m "README" &&
export GITHUB_REF="refs/heads/main"
}
@test "fails if no current_version given" {
init_repo
run ../../version-increment.sh
print_run_info
[ "$status" -eq 5 ] &&
[[ "$output" = *"Environment variable 'current_version' is unset or empty"* ]]
}
@test "fails if invalid current_version given" {
init_repo
export current_version=1.3.5-prerelease
run ../../version-increment.sh
print_run_info
[ "$status" -eq 6 ] &&
[[ "$output" = *"Environment variable 'current_version' is not a valid normal version"* ]]
}
@test "fails if invalid scheme given" {
init_repo
export current_version=1.2.3
export INPUT_SCHEME="foover"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 8 ] &&
[[ "$output" = *"Value of 'scheme' is not valid"* ]]
}
@test "fails if invalid increment given" {
init_repo
export current_version=1.2.3
export INPUT_INCREMENT="critical"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 7 ] &&
[[ "$output" = *"Value of 'increment' is not valid, choose from 'major', 'minor', or 'patch'"* ]]
}
@test "increments the patch digit correctly (semver)" {
init_repo
export current_version=1.2.3
export INPUT_INCREMENT="patch"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=version::1.2.4"* ]]
}
@test "increments the minor digit correctly (semver)" {
init_repo
export current_version=1.2.3
export INPUT_INCREMENT="minor"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=version::1.3.0"* ]]
}
@test "increments the major digit correctly (semver)" {
init_repo
export current_version=1.2.3
export INPUT_INCREMENT="major"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=version::2.0.0"* ]]
}
@test "increments to a new month (calver)" {
init_repo
export current_version=2020.6.4
export INPUT_SCHEME="calver"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=version::$(date +%Y.%-m.1)"* ]]
}
@test "increments the patch digit within a month (calver)" {
init_repo
export current_version="$(date +%Y.%-m.123)"
export INPUT_SCHEME="calver"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=version::$(date +%Y.%-m.124)"* ]]
}
@test "appends prerelease information if on a branch" {
init_repo
export current_version=1.2.3
export GITHUB_REF="refs/heads/super-awesome-feature"
export short_ref="$(git rev-parse --short HEAD | sed 's/0*//')"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=version::1.2.4-pre.${short_ref}"* ]]
}

View File

@@ -6,25 +6,21 @@ script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "${script_dir}/shared.sh" source "${script_dir}/shared.sh"
if [[ -z "${current_version:-}" ]] ; then increment="${increment:-patch}"
echo "🛑 Environment variable 'current_version' is unset or empty" 1>&2
exit 5
fi
if [[ -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
exit 6
fi
increment="${INPUT_INCREMENT:-patch}"
if [[ "${increment}" != 'patch' && "${increment}" != 'minor' && "${increment}" != 'major' ]] ; then if [[ "${increment}" != 'patch' && "${increment}" != 'minor' && "${increment}" != 'major' ]] ; then
echo "🛑 Value of 'increment' is not valid, choose from 'major', 'minor', or 'patch'" 1>&2 echo "🛑 Value of 'increment' is not valid, choose from 'major', 'minor', or 'patch'" 1>&2
exit 7 input_errors='true'
fi fi
scheme="${INPUT_SCHEME:-semver}" if [[ -z "${current_version:-}" ]] ; then
if [[ "${scheme}" != 'semver' && "${scheme}" != 'calver' ]] ; then echo "🛑 Environment variable 'current_version' is unset or empty" 1>&2
echo "🛑 Value of 'scheme' is not valid, choose from 'semver' or 'calver'" 1>&2 input_errors='true'
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
input_errors='true'
fi
if [[ "${input_errors}" == 'true' ]] ; then
exit 8 exit 8
fi fi
@@ -36,6 +32,11 @@ default_branch='main'
if [[ -z "${BATS_VERSION:-}" ]] ; then if [[ -z "${BATS_VERSION:-}" ]] ; then
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
# use release_branch if not empty
if [[ -n "${release_branch:-}" ]] ; then
default_branch="${release_branch}"
fi
current_ref="${GITHUB_REF:-}" current_ref="${GITHUB_REF:-}"
git_commit="$(git rev-parse --short HEAD | sed 's/0*//')" # trim leading zeros, because semver doesn't allow that in git_commit="$(git rev-parse --short HEAD | sed 's/0*//')" # trim leading zeros, because semver doesn't allow that in
# the 'pre-release version' part, but we can't use the + char # the 'pre-release version' part, but we can't use the + char
@@ -78,7 +79,13 @@ fi
# add pre-release info to version if not the default branch # add pre-release info to version if not the default branch
if [[ "${current_ref}" != "refs/heads/${default_branch}" ]] ; then if [[ "${current_ref}" != "refs/heads/${default_branch}" ]] ; then
new_version="${new_version}-pre.${git_commit}" pre_release="pre.${git_commit}"
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 fi
if [[ -z "$(echo "${new_version}" | ${grep} -P "${pcre_semver}")" ]] ; then if [[ -z "$(echo "${new_version}" | ${grep} -P "${pcre_semver}")" ]] ; then
@@ -90,4 +97,12 @@ fi
echo " The new version is ${new_version}" echo " The new version is ${new_version}"
echo "::set-output name=version::${new_version}" # shellcheck disable=SC2129
echo "VERSION=${new_version}" >> "${GITHUB_OUTPUT}"
echo "V_VERSION=v${new_version}" >> "${GITHUB_OUTPUT}"
echo "MAJOR_VERSION=${version_array[0]}" >> "${GITHUB_OUTPUT}"
echo "MINOR_VERSION=${version_array[1]}" >> "${GITHUB_OUTPUT}"
echo "PATCH_VERSION=${version_array[2]}" >> "${GITHUB_OUTPUT}"
echo "MAJOR_V_VERSION=v${version_array[0]}" >> "${GITHUB_OUTPUT}"
echo "MINOR_V_VERSION=v${version_array[1]}" >> "${GITHUB_OUTPUT}"
echo "PATCH_V_VERSION=v${version_array[2]}" >> "${GITHUB_OUTPUT}"

View File

@@ -6,9 +6,7 @@ script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "${script_dir}/shared.sh" source "${script_dir}/shared.sh"
scheme="${INPUT_SCHEME:-semver}" if [[ "${input_errors}" == 'true' ]] ; then
if [[ "${scheme}" != 'semver' && "${scheme}" != 'calver' ]] ; then
echo "🛑 Value of 'scheme' is not valid, choose from 'semver' or 'calver'" 1>&2
exit 8 exit 8
fi fi
@@ -29,18 +27,18 @@ fi
# Skip if testing, otherwise pull tags # Skip if testing, otherwise pull tags
if [[ -z "${BATS_VERSION:-}" ]] ; then if [[ -z "${BATS_VERSION:-}" ]] ; then
git fetch --quiet origin 'refs/tags/*:refs/tags/*' git fetch --quiet --force origin 'refs/tags/*:refs/tags/*'
fi fi
##==---------------------------------------------------------------------------- ##==----------------------------------------------------------------------------
## Version parsing ## Version parsing
# detect current version - removing "v" from start of tag if it exists # detect current version - removing "v" from start of tag if it exists
current_version="$(git tag -l | { ${grep} -P "${pcre_allow_vprefix}" || true; } | sed 's/^v//g' | sort -V --reverse | head -n1)" current_version="$(git tag -l | { ${grep} -P "${pcre_allow_vprefix}" || true; } | sed 's/^v//g' | sort -V | tail -n 1)"
# 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) # 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 if [[ -z "${current_version:-}" ]] ; then
current_version="$(git tag -l | { ${grep} -P "${pcre_old_calver}" || true; } | sort -V --reverse | head -n1)" current_version="$(git tag -l | { ${grep} -P "${pcre_old_calver}" || true; } | sort -V | tail -n 1)"
if [[ -n "${current_version:-}" ]] ; then if [[ -n "${current_version:-}" ]] ; then
# convert - to . and drop leading zeros & the R # 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/')" current_version="$(echo "${current_version}" | sed -r 's/^([0-9]+)-0{0,1}([0-9]+)-R0{0,1}([0-9]+)$/\1.\2.\3/')"
@@ -63,4 +61,5 @@ fi
echo " The current normal version is ${current_version}" echo " The current normal version is ${current_version}"
echo "::set-output name=current-version::${current_version}" echo "CURRENT_VERSION=${current_version}" >> "${GITHUB_OUTPUT}"
echo "CURRENT_V_VERSION=v${current_version}" >> "${GITHUB_OUTPUT}"