mirror of
https://github.com/reecetech/version-increment.git
synced 2025-12-21 06:25:44 +00:00
Compare commits
61 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
71036b212b | ||
|
|
bfdbc118ba | ||
|
|
68bf4fe26d | ||
|
|
89a53df5e6 | ||
|
|
aac681e0d0 | ||
|
|
95f6bcc37a | ||
|
|
8b80e08158 | ||
|
|
27ee2a7786 | ||
|
|
de5ab041fb | ||
|
|
3ac8392aa4 | ||
|
|
72c1fa6077 | ||
|
|
f21e559797 | ||
|
|
4415fcb6c0 | ||
|
|
4846cbaf9d | ||
|
|
468208262a | ||
|
|
e5f8667dfc | ||
|
|
2ef15157dd | ||
|
|
0974302def | ||
|
|
67d70b45a4 | ||
|
|
47e175a747 | ||
|
|
8202de8885 | ||
|
|
fa8feb816e | ||
|
|
1e4c88d873 | ||
|
|
d5f78b25d1 | ||
|
|
bfb5689c4d | ||
|
|
f81c317cbd | ||
|
|
bb0e075f8b | ||
|
|
f1fae3d6b7 | ||
|
|
77dfab16c0 | ||
|
|
2414f2fa44 | ||
|
|
f6d4e915f4 | ||
|
|
5f9f764060 | ||
|
|
0fd6f1742d | ||
|
|
8e33684d42 | ||
|
|
b7be5e00c2 | ||
|
|
ced1d4ac1d | ||
|
|
e7c0a5aac2 | ||
|
|
c1893b945a | ||
|
|
5d4fc14ad5 | ||
|
|
1d159768e8 | ||
|
|
69cfa4fa80 | ||
|
|
b9bae4a2dc | ||
|
|
53a0819e66 | ||
|
|
e53268eb3f | ||
|
|
8d649fcfa3 | ||
|
|
ccbbbe93a8 | ||
|
|
ddbbe72b7f | ||
|
|
ba14b463c4 | ||
|
|
fde70f2da9 | ||
|
|
8b854651df | ||
|
|
40611bca96 | ||
|
|
ddfcb5bc04 | ||
|
|
3d00642def | ||
|
|
827489c005 | ||
|
|
ee28762c5b | ||
|
|
1c6699b17a | ||
|
|
822afeb70c | ||
|
|
9492ff84fb | ||
|
|
7c6e26cbd9 | ||
|
|
38a48eeef1 | ||
|
|
4988018178 |
94
.github/workflows/test-and-release.yml
vendored
94
.github/workflows/test-and-release.yml
vendored
@@ -13,10 +13,10 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Run ShellCheck
|
||||
uses: ludeeus/action-shellcheck@94e0aab03ca135d11a35e5bfc14e6746dc56e7e9
|
||||
uses: ludeeus/action-shellcheck@2.0.0
|
||||
with:
|
||||
check_together: 'yes'
|
||||
|
||||
@@ -24,24 +24,95 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup bats
|
||||
uses: mig4/setup-bats@af9a00deb21b5d795cabfeaa8d9060410377686d
|
||||
uses: mig4/setup-bats@af9a00deb21b5d795cabfeaa8d9060410377686d # v1.2.0
|
||||
with:
|
||||
bats-version: 1.4.1
|
||||
bats-version: 1.8.0
|
||||
|
||||
- name: Test
|
||||
run: bats tests/*.bats
|
||||
|
||||
release:
|
||||
test-api-mode: # requires github API, didn't want to mock it
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
github_token: ${{ github.token }}
|
||||
steps:
|
||||
- name: Checkout code # have to checkout to have the source code available
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Remove .git directory # remove the git directory to make the testing valid
|
||||
run: rm -rf .git/
|
||||
|
||||
- name: Test lookup version (with API)
|
||||
id: version-lookup
|
||||
env:
|
||||
use_api: 'true'
|
||||
run: ./version-lookup.sh
|
||||
|
||||
- name: Check lookup result
|
||||
shell: bash
|
||||
run: '[[ -n "${{ steps.version-lookup.outputs.CURRENT_VERSION }}" ]]'
|
||||
|
||||
- name: Test increment version (with API)
|
||||
id: version-increment
|
||||
run: ./version-increment.sh
|
||||
env:
|
||||
current_version: ${{ steps.version-lookup.outputs.CURRENT_VERSION }}
|
||||
scheme: calver
|
||||
use_api: 'true'
|
||||
|
||||
- name: Check increment result
|
||||
shell: bash
|
||||
run: '[[ "$(date +%Y.%m)" == "$(echo "${{ steps.version-increment.outputs.VERSION }}" | cut -d "." -f 1-2)" ]]'
|
||||
|
||||
test-action-yml: # integration testing
|
||||
needs:
|
||||
- lint
|
||||
- test
|
||||
- test-api-mode
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code # have to checkout to have the source code available
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Remove .git directory # remove the git directory to make the testing valid
|
||||
run: rm -rf .git/
|
||||
|
||||
- name: Get next version via API
|
||||
uses: ./
|
||||
id: version-via-api
|
||||
with:
|
||||
scheme: 'calver'
|
||||
use_api: true
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Get next version via Git
|
||||
uses: ./
|
||||
id: version-via-git
|
||||
with:
|
||||
scheme: 'calver'
|
||||
use_api: false
|
||||
|
||||
- name: Check results agree
|
||||
shell: bash
|
||||
run: |
|
||||
[[ "${{ steps.version-via-api.outputs.current-version }}" == "${{ steps.version-via-git.outputs.current-version }}" ]]
|
||||
[[ "${{ steps.version-via-api.outputs.major-version }}" == "${{ steps.version-via-git.outputs.major-version }}" ]]
|
||||
[[ "${{ steps.version-via-api.outputs.minor-version }}" == "${{ steps.version-via-git.outputs.minor-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)
|
||||
|
||||
release:
|
||||
needs:
|
||||
- test-action-yml
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Lookup version
|
||||
id: version-lookup
|
||||
@@ -51,14 +122,13 @@ jobs:
|
||||
id: version-increment
|
||||
run: ./version-increment.sh
|
||||
env:
|
||||
current_version: ${{ steps.version-lookup.outputs.current-version }}
|
||||
current_version: ${{ steps.version-lookup.outputs.CURRENT_VERSION }}
|
||||
scheme: calver
|
||||
|
||||
- name: Release version
|
||||
uses: marvinpinto/action-automatic-releases@919008cf3f741b179569b7a6fb4d8860689ab7f0
|
||||
if: ${{ github.ref == 'refs/heads/main' }}
|
||||
uses: softprops/action-gh-release@v1
|
||||
if: ${{ github.ref_name == github.event.repository.default_branch }}
|
||||
with:
|
||||
repo_token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
draft: false
|
||||
prerelease: false
|
||||
automatic_release_tag: "${{ steps.version-increment.outputs.version }}"
|
||||
tag_name: "${{ steps.version-increment.outputs.VERSION }}"
|
||||
|
||||
72
README.md
72
README.md
@@ -1,15 +1,15 @@
|
||||
# ➕ Version Increment
|
||||
# Version Increment ➕
|
||||
|
||||
## 📄 Use
|
||||
## Use 📄
|
||||
|
||||
### ⌨️ Example
|
||||
### Example ⌨️
|
||||
|
||||
```yaml
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Get next version
|
||||
uses: reecetech/version-increment@2021.11.1
|
||||
uses: reecetech/version-increment@2023.9.3
|
||||
id: version
|
||||
with:
|
||||
scheme: semver
|
||||
@@ -23,7 +23,21 @@
|
||||
context: .
|
||||
```
|
||||
|
||||
### 🔖 semver
|
||||
#### API mode 🔗
|
||||
|
||||
Maybe you don't want to checkout your code in the job that calculates the version number. That's okay, you can
|
||||
use the API mode:
|
||||
|
||||
```yaml
|
||||
- name: Get next version
|
||||
uses: reecetech/version-increment@2023.10.1
|
||||
id: version
|
||||
with:
|
||||
use_api: true
|
||||
```
|
||||
|
||||
### 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
|
||||
@@ -36,7 +50,7 @@ e.g. `1.2.7`
|
||||
|
||||
See: https://semver.org/spec/v2.0.0.html
|
||||
|
||||
### 📅 calver (semver compliant)
|
||||
### calver (semver compliant) 📅
|
||||
|
||||
Optionally, this action can provide semver compliant calendar versions (calver).
|
||||
In this calver scheme, the semver major, minor and patch digits map to year,
|
||||
@@ -52,42 +66,70 @@ 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 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`
|
||||
* `2021.6.2`
|
||||
|
||||
You may override the branch to consider the release branch if it is not the default branch, by providing a specific
|
||||
release branch name as an input. For example:
|
||||
|
||||
```yaml
|
||||
- name: Get next version
|
||||
uses: reecetech/version-increment@2023.10.1
|
||||
id: version
|
||||
with:
|
||||
release_branch: publish
|
||||
```
|
||||
|
||||
**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`
|
||||
* `2021.6.2-pre.32fd19841`
|
||||
|
||||
### 📥 Inputs
|
||||
### Inputs 📥
|
||||
|
||||
| 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` |
|
||||
| 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` |
|
||||
|
||||
### 📤 Outputs
|
||||
### Outputs 📤
|
||||
|
||||
| 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 |
|
||||
| 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 💕
|
||||
|
||||
Please raise a pull request, but note the testing tools below
|
||||
|
||||
|
||||
53
action.yml
53
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)
|
||||
@@ -18,14 +22,49 @@ inputs:
|
||||
Not applicable to `calver` scheme
|
||||
required: false
|
||||
default: 'patch'
|
||||
release_branch:
|
||||
description: 'Specify a non-default branch to use for the release tag (the one without -pre)'
|
||||
required: false
|
||||
type: string
|
||||
use_api:
|
||||
description: 'Use the GitHub API to discover current tags, which avoids the need for a git checkout, but requires `curl` and `jq`'
|
||||
required: false
|
||||
default: false
|
||||
|
||||
outputs:
|
||||
current_version:
|
||||
current-version:
|
||||
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:
|
||||
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:
|
||||
using: "composite"
|
||||
@@ -34,12 +73,18 @@ runs:
|
||||
run: ${{ github.action_path }}/version-lookup.sh
|
||||
shell: bash
|
||||
env:
|
||||
github_token: ${{ github.token }}
|
||||
scheme: ${{ inputs.scheme }}
|
||||
use_api: ${{ inputs.use_api }}
|
||||
|
||||
- id: version-increment
|
||||
run: ${{ github.action_path }}/version-increment.sh
|
||||
shell: bash
|
||||
env:
|
||||
current_version: ${{ steps.version-lookup.outputs.current-version }}
|
||||
current_version: ${{ steps.version-lookup.outputs.CURRENT_VERSION }}
|
||||
increment: ${{ inputs.increment }}
|
||||
github_token: ${{ github.token }}
|
||||
pep440: ${{ inputs.pep440 }}
|
||||
scheme: ${{ inputs.scheme }}
|
||||
release_branch: ${{ inputs.release_branch }}
|
||||
use_api: ${{ inputs.use_api }}
|
||||
|
||||
27
shared.sh
27
shared.sh
@@ -21,6 +21,26 @@ 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
|
||||
|
||||
use_api="${use_api:-false}"
|
||||
if [[ "${use_api}" != 'false' && "${use_api}" != 'true' ]] ; then
|
||||
echo "🛑 Value of 'use_api' is not valid, choose from 'false' or 'true'" 1>&2
|
||||
input_errors='true'
|
||||
fi
|
||||
|
||||
if [[ "${use_api}" == 'true' ]] ; then
|
||||
if [[ -z "${github_token:-}" ]] ; then
|
||||
echo "🛑 'use_api' is true, but environment variable 'github_token' is not set" 1>&2
|
||||
input_errors='true'
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
##==----------------------------------------------------------------------------
|
||||
## MacOS compatibility - for local testing
|
||||
|
||||
@@ -32,3 +52,10 @@ if [[ "$(uname)" == "Darwin" ]] ; then
|
||||
exit 9
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -65,6 +77,13 @@ function init_repo {
|
||||
[[ "$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
|
||||
|
||||
@@ -75,7 +94,10 @@ function init_repo {
|
||||
|
||||
print_run_info
|
||||
[ "$status" -eq 0 ] &&
|
||||
[[ "$output" = *"::set-output name=version::1.2.4"* ]]
|
||||
[[ "$output" = *"MAJOR_VERSION=1"* ]] &&
|
||||
[[ "$output" = *"MINOR_VERSION=2"* ]] &&
|
||||
[[ "$output" = *"PATCH_VERSION=4"* ]] &&
|
||||
[[ "$output" = *"VERSION=1.2.4"* ]]
|
||||
}
|
||||
|
||||
@test "increments the minor digit correctly (semver)" {
|
||||
@@ -88,7 +110,27 @@ function init_repo {
|
||||
|
||||
print_run_info
|
||||
[ "$status" -eq 0 ] &&
|
||||
[[ "$output" = *"::set-output name=version::1.3.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)" {
|
||||
@@ -101,7 +143,44 @@ function init_repo {
|
||||
|
||||
print_run_info
|
||||
[ "$status" -eq 0 ] &&
|
||||
[[ "$output" = *"::set-output name=version::2.0.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)" {
|
||||
@@ -114,7 +193,7 @@ function init_repo {
|
||||
|
||||
print_run_info
|
||||
[ "$status" -eq 0 ] &&
|
||||
[[ "$output" = *"::set-output name=version::$(date +%Y.%-m.1)"* ]]
|
||||
[[ "$output" = *"VERSION=$(date +%Y.%-m.1)"* ]]
|
||||
}
|
||||
|
||||
@test "increments the patch digit within a month (calver)" {
|
||||
@@ -127,7 +206,7 @@ function init_repo {
|
||||
|
||||
print_run_info
|
||||
[ "$status" -eq 0 ] &&
|
||||
[[ "$output" = *"::set-output name=version::$(date +%Y.%-m.124)"* ]]
|
||||
[[ "$output" = *"VERSION=$(date +%Y.%-m.124)"* ]]
|
||||
}
|
||||
|
||||
@test "appends prerelease information if on a branch" {
|
||||
@@ -141,5 +220,55 @@ function init_repo {
|
||||
|
||||
print_run_info
|
||||
[ "$status" -eq 0 ] &&
|
||||
[[ "$output" = *"::set-output name=version::1.2.4-pre.${short_ref}"* ]]
|
||||
[[ "$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}"* ]]
|
||||
}
|
||||
|
||||
@@ -29,6 +29,13 @@ function init_repo {
|
||||
[[ "$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" {
|
||||
init_repo
|
||||
|
||||
@@ -40,7 +47,20 @@ function init_repo {
|
||||
|
||||
print_run_info
|
||||
[ "$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" {
|
||||
@@ -53,7 +73,7 @@ function init_repo {
|
||||
|
||||
print_run_info
|
||||
[ "$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" {
|
||||
@@ -63,7 +83,7 @@ function init_repo {
|
||||
|
||||
print_run_info
|
||||
[ "$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" {
|
||||
@@ -75,7 +95,7 @@ function init_repo {
|
||||
|
||||
print_run_info
|
||||
[ "$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" {
|
||||
@@ -87,19 +107,7 @@ function init_repo {
|
||||
|
||||
print_run_info
|
||||
[ "$status" -eq 0 ] &&
|
||||
[[ "$output" = *"::set-output name=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" = *"::set-output name=current-version::2020.9.2"* ]]
|
||||
[[ "$output" = *"CURRENT_VERSION=$(date '+%Y.%-m.0')"* ]]
|
||||
}
|
||||
|
||||
@test "strips v from the version" {
|
||||
@@ -111,5 +119,5 @@ function init_repo {
|
||||
|
||||
print_run_info
|
||||
[ "$status" -eq 0 ] &&
|
||||
[[ "$output" = *"::set-output name=current-version::3.4.5"* ]]
|
||||
[[ "$output" = *"CURRENT_VERSION=3.4.5"* ]]
|
||||
}
|
||||
|
||||
@@ -28,15 +28,34 @@ fi
|
||||
## Git info - branch names, commit short ref
|
||||
|
||||
default_branch='main'
|
||||
# use release_branch if not empty
|
||||
if [[ -n "${release_branch:-}" ]] ; then
|
||||
default_branch="${release_branch}"
|
||||
elif [[ -z "${BATS_VERSION:-}" ]] ; then
|
||||
# if we're _not_ testing, then _actually_ check the origin
|
||||
if [[ -z "${BATS_VERSION:-}" ]] ; then
|
||||
if [[ "${use_api:-}" == 'true' ]] ; then
|
||||
default_branch="$(
|
||||
curl -fsSL \
|
||||
-H "Accept: application/vnd.github+json" \
|
||||
-H "Authorization: Bearer ${github_token}" \
|
||||
-H "X-GitHub-Api-Version: 2022-11-28" \
|
||||
"${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}" \
|
||||
| jq -r '.default_branch'
|
||||
)"
|
||||
else
|
||||
default_branch="$(git remote show origin | ${grep} 'HEAD branch' | cut -d ' ' -f 5)"
|
||||
fi
|
||||
fi
|
||||
|
||||
current_ref="${GITHUB_REF:-}"
|
||||
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
|
||||
# to make it 'build metadata' as that's not supported in K8s
|
||||
# labels
|
||||
|
||||
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
|
||||
# shellcheck disable=SC2001
|
||||
git_commit="$(echo "${GITHUB_SHA:0:9}" | sed 's/0*//')" # Also, trim leading zeros, because semver doesn't allow that in
|
||||
else # the 'pre-release version' part, but we can't use the + char
|
||||
git_commit="$(git rev-parse --short HEAD | sed 's/0*//')" # to make it 'build metadata' as that's not supported in K8s
|
||||
fi # labels
|
||||
|
||||
##==----------------------------------------------------------------------------
|
||||
## Version increment
|
||||
@@ -74,7 +93,13 @@ fi
|
||||
|
||||
# add pre-release info to version if not the default branch
|
||||
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
|
||||
|
||||
if [[ -z "$(echo "${new_version}" | ${grep} -P "${pcre_semver}")" ]] ; then
|
||||
@@ -86,4 +111,12 @@ fi
|
||||
|
||||
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}"
|
||||
|
||||
@@ -10,39 +10,35 @@ if [[ "${input_errors}" == 'true' ]] ; then
|
||||
exit 8
|
||||
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
|
||||
|
||||
# Skip if testing, otherwise pull tags
|
||||
# Skip if testing, or if use_api is true, otherwise pull tags
|
||||
if [[ -z "${BATS_VERSION:-}" ]] ; then
|
||||
git fetch --quiet origin 'refs/tags/*:refs/tags/*'
|
||||
if [[ "${use_api:-}" != 'true' ]] ; then
|
||||
git fetch --quiet --force origin 'refs/tags/*:refs/tags/*'
|
||||
fi
|
||||
fi
|
||||
|
||||
##==----------------------------------------------------------------------------
|
||||
## Version parsing
|
||||
|
||||
# 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)"
|
||||
|
||||
# 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 --reverse | head -n1)"
|
||||
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
|
||||
if [[ "${use_api:-}" == 'true' ]] ; then
|
||||
current_version="$(
|
||||
curl -fsSL \
|
||||
-H "Accept: application/vnd.github+json" \
|
||||
-H "Authorization: Bearer ${github_token}" \
|
||||
-H "X-GitHub-Api-Version: 2022-11-28" \
|
||||
"${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/git/matching-refs/tags/" \
|
||||
| jq -r '.[].ref' | sed 's|refs/tags/||g' \
|
||||
| { ${grep} -P "${pcre_allow_vprefix}" || true; } | sed 's/^v//g' | sort -V | tail -n 1
|
||||
)"
|
||||
else
|
||||
current_version="$(
|
||||
git tag -l \
|
||||
| { ${grep} -P "${pcre_allow_vprefix}" || true; } | sed 's/^v//g' | sort -V | tail -n 1
|
||||
)"
|
||||
fi
|
||||
|
||||
# handle no version detected - start versioning!
|
||||
@@ -61,4 +57,5 @@ fi
|
||||
|
||||
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}"
|
||||
|
||||
Reference in New Issue
Block a user