Skip to content

Commit

Permalink
Support custom separator (#48)
Browse files Browse the repository at this point in the history
* Support custom separator

* Single PR per branch

* Fix pre-release check
  • Loading branch information
michaelpaul authored Nov 7, 2023
1 parent 881a897 commit 1ec54b1
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 73 deletions.
25 changes: 17 additions & 8 deletions .github/workflows/reusable-github-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,20 @@ jobs:
id: current-version
run: echo "current-version=$(cat VERSION)" >> $GITHUB_OUTPUT
- name: Create new release
env:
GH_TOKEN: ${{ secrets.token }}
CURRENT_VERSION: ${{ steps.current-version.outputs.current-version }}
run: |
prerelease=$(node -pe "process.env.CURRENT_VERSION.includes('-') ? '--prerelease' : ''")
gh release create "v${CURRENT_VERSION}" \
--title "${{ inputs.release-title }} v${CURRENT_VERSION}" \
--generate-notes $prerelease --target ${{ inputs.develop-branch }}
uses: actions/github-script@v6
with:
github-token: ${{ secrets.token }}
script: |
const currentVersion = "${{ steps.current-version.outputs.current-version }}";
const stableVersion = /^\d+\.\d+\.\d+$/;
const preRelease = !stableVersion.test(currentVersion);
github.rest.repos.createRelease({
owner: context.repo.owner,
repo: context.repo.repo,
tag_name: `v${currentVersion}`,
target_commitish: "${{ inputs.develop-branch }}",
name: `${{ inputs.release-title }} v${currentVersion}`,
generate_release_notes: true,
prerelease: preRelease
});
86 changes: 41 additions & 45 deletions __tests__/release.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -357,53 +357,47 @@ describe('Detect changes', () => {
})

describe('Get next version', () => {
test('Major', () => {
const ver = release.nextVersion('13.1.2', 'major', '')

expect(ver).toBe('14.0.0')
})

test('Minor', () => {
const ver = release.nextVersion('13.1.2', 'minor', '')

expect(ver).toBe('13.2.0')
})

test('Patch', () => {
const ver = release.nextVersion('13.1.2', 'patch', '')

expect(ver).toBe('13.1.3')
})

test('Unchanged', () => {
const ver = release.nextVersion('1.2.3', '', '')

expect(ver).toBe('1.2.3')
})

test('Start pre-release', () => {
const ver = release.nextVersion('14.1.5', 'major', 'true')

expect(ver).toBe('15.0.0-beta')
})

test('Bump first pre-release', () => {
const ver = release.nextVersion('15.0.0-beta', 'minor', 'true')

expect(ver).toBe('15.0.0-beta.1')
})

test('Bump second pre-release', () => {
const ver = release.nextVersion('15.0.0-beta.1', 'patch', 'true')
const separator = '-beta'
const customSeparator = '.pre'

expect(ver).toBe('15.0.0-beta.2')
test('Missing separator', () => {
expect(() =>
release.nextVersion('15.0.0-beta', 'major', 'false', '')
).toThrow('Separator is required')
})

test('End pre-release', () => {
const ver = release.nextVersion('15.0.0-beta', 'major', 'false')

expect(ver).toBe('15.0.0')
})
test.each([
// 'Major'
['13.1.2', 'major', '', separator, '14.0.0'],
// 'Minor'
['13.1.2', 'minor', '', separator, '13.2.0'],
// 'Patch'
['13.1.2', 'patch', '', separator, '13.1.3'],
// 'Unchanged'
['1.2.3', '', '', separator, '1.2.3'],
// 'Start pre-release'
['14.1.5', 'major', 'true', separator, '15.0.0-beta'],
['14.1.5', 'major', 'true', customSeparator, '15.0.0.pre'],
['14.1.5', 'major', 'true', '.pre.alpha', '15.0.0.pre.alpha'],
// 'Bump first pre-release'
['15.0.0-beta', 'minor', 'true', separator, '15.0.0-beta.1'],
['15.0.0.pre', 'minor', 'true', customSeparator, '15.0.0.pre.1'],
['15.0.0.pre.beta', 'minor', 'true', '.pre.beta', '15.0.0.pre.beta.1'],
// 'Bump second pre-release'
['15.0.0-beta.1', 'patch', 'true', separator, '15.0.0-beta.2'],
['15.0.0.pre.1', 'patch', 'true', customSeparator, '15.0.0.pre.2'],
['15.0.0.pre.beta.1', 'patch', 'true', '.pre.beta', '15.0.0.pre.beta.2'],
// 'End pre-release'
['15.0.0-beta', 'major', 'false', separator, '15.0.0'],
['8.0.0.pre.beta.1', 'major', 'false', customSeparator, '8.0.0']
])(
'current(%s), increment(%s), preRelease(%s), separator(%s)',
(current, increment, preRelease, separator, expected) => {
const ver = release.nextVersion(current, increment, preRelease, separator)

expect(ver).toBe(expected)
}
)
})

test('Compare branches', async () => {
Expand All @@ -429,6 +423,8 @@ test('Bump', async () => {
switch (input) {
case 'current-version':
return '1.2.3'
case 'separator':
return '-beta'
default:
return ''
}
Expand All @@ -448,4 +444,4 @@ test('Bump', async () => {
expect(core.setOutput).toHaveBeenCalledTimes(3)
expect(core.setOutput).toHaveBeenCalledWith('increment', 'major')
expect(core.setOutput).toHaveBeenCalledWith('next-version', '2.0.0')
})
})
6 changes: 5 additions & 1 deletion action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ inputs:
pre-release:
description: 'This release will be labeled as non-production ready'
default: false
separator:
description: 'Separator between main version and pre-release version'
default: '-beta'
develop-branch:
description: 'Branch used for development and distribution'
default: develop
Expand Down Expand Up @@ -35,6 +38,7 @@ runs:
env:
INPUT_TOKEN: ${{ inputs.token }}
INPUT_PRE-RELEASE: ${{ inputs.pre-release }}
INPUT_SEPARATOR: ${{ inputs.separator }}
INPUT_DEVELOP-BRANCH: ${{ inputs.develop-branch }}
INPUT_CURRENT-VERSION: ${{ steps.current-version.outputs.current-version }}
- name: Bump
Expand All @@ -48,7 +52,7 @@ runs:
with:
token: ${{ inputs.token }}
base: ${{ inputs.develop-branch }}
branch: promote/${{ inputs.develop-branch }}/to/v${{ steps.release.outputs.next-version }}
branch: promote/${{ inputs.develop-branch }}
title: Release v${{steps.release.outputs.next-version}}
body: |
Merged pull requests to be released:
Expand Down
21 changes: 13 additions & 8 deletions dist/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/index.js.map

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 20 additions & 8 deletions src/release.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,30 +60,36 @@ export function changelog(changeset: Comparison): string[] {
export function nextVersion(
current: string,
increment: string,
preRelease: string
preRelease: string,
separator: string
): string {
let major: number
let minor: number
let patch: number
const parts: number[] = current.split('.').map(x => parseInt(x, 10))
;[major, minor, patch] = parts
const [unstaged, stage] = current.split('-')
const [unstaged, stage] = current.split(separator)
const isPreRelease: boolean = preRelease === 'true'
const hasStaging: boolean = current.includes(separator)

if (!separator) {
throw new Error('Separator is required')
}

// end pre-release
if (!isPreRelease && stage) {
if (!isPreRelease && hasStaging) {
return unstaged
}

// bump pre-release
if (isPreRelease && stage) {
if (isPreRelease && hasStaging) {
const [, stageVersion] = stage.split('.')
let version: number = parseInt(stageVersion)
if (isNaN(version)) {
version = 0
}
version++
return `${unstaged}-beta.${version}`
return `${unstaged}${separator}.${version}`
}

switch (increment) {
Expand All @@ -104,8 +110,8 @@ export function nextVersion(
const version = [major, minor, patch].join('.')

// start pre-release
if (isPreRelease && !stage) {
return `${version}-beta`
if (isPreRelease && !hasStaging) {
return `${version}${separator}`
}

return version
Expand Down Expand Up @@ -205,6 +211,7 @@ export async function bump(): Promise<void> {
required: true
})
const preRelease: string = core.getInput('pre-release')
const customSeparator: string = core.getInput('separator')
const base = `v${currentVersion}`
const head: string = core.getInput('develop-branch')

Expand All @@ -215,7 +222,12 @@ export async function bump(): Promise<void> {
})
const logs = changelog(changeset)
const increment = detectChanges(changeset)
const next = nextVersion(currentVersion, increment, preRelease)
const next = nextVersion(
currentVersion,
increment,
preRelease,
customSeparator
)

core.setOutput('increment', increment)
core.setOutput('next-version', next)
Expand Down

0 comments on commit 1ec54b1

Please sign in to comment.