Skip to content

Commit

Permalink
feat: add pre-release increment behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
neilime committed Jun 18, 2023
1 parent 5f37b2a commit cbce15f
Show file tree
Hide file tree
Showing 12 changed files with 481 additions and 96 deletions.
10 changes: 10 additions & 0 deletions README.md
Expand Up @@ -338,6 +338,16 @@ autolabeler:
- '/JIRA-[0-9]{1,4}/'
```

## Pre-release increment

When creating Pre-release (`prerelease: true`), you can add a pre-release identifier to increment the pre-release version number, with the `pre-release-identifier` option. It accept any string, but it's recommended to use [Semantic Versioning](https://semver.org/) pre-release identifiers (alpha, beta, rc, etc).

Using `pre-release-identifier` automatically enable `include-pre-releases`.

```yml
pre-release-identifier: 'alpha' # will create a pre-release with version number x.x.x-alpha.x
```

## Projects that don't use Semantic Versioning

If your project doesn't follow [Semantic Versioning](https://semver.org) you can still use Release Drafter, but you may want to set the `version-template` option to customize how the `$NEXT_{PATCH,MINOR,MAJOR}_VERSION` environment variables are generated.
Expand Down
147 changes: 128 additions & 19 deletions dist/index.js
Expand Up @@ -142365,9 +142365,14 @@ module.exports = (app, { getRouter }) => {
const {
'filter-by-commitish': filterByCommitish,
'include-pre-releases': includePreReleases,
'pre-release-identifier': preReleaseIdentifier,
'tag-prefix': tagPrefix,
} = config

const shouldIncludePreReleases = Boolean(
includePreReleases || preReleaseIdentifier
)

// override header and footer when passed as input
const header = core.getInput('header')
const footer = core.getInput('footer')
Expand All @@ -142382,7 +142387,7 @@ module.exports = (app, { getRouter }) => {
context,
targetCommitish,
filterByCommitish,
includePreReleases,
includePreReleases: shouldIncludePreReleases,
tagPrefix,
})

Expand Down Expand Up @@ -142775,7 +142780,7 @@ const DEFAULT_CONFIG = Object.freeze({
'change-template': `* $TITLE (#$NUMBER) @$AUTHOR`,
'change-title-escapes': '',
'no-changes-template': `* No changes`,
'version-template': `$MAJOR.$MINOR.$PATCH`,
'version-template': `$MAJOR.$MINOR.$PATCH$PRERELEASE`,
'version-resolver': {
major: { labels: [] },
minor: { labels: [] },
Expand All @@ -142795,6 +142800,7 @@ const DEFAULT_CONFIG = Object.freeze({
prerelease: false,
'filter-by-commitish': false,
'include-pre-releases': false,
'pre-release-identifier': '',
commitish: '',
'category-template': `## $TITLE`,
header: '',
Expand Down Expand Up @@ -142888,6 +142894,7 @@ exports.paginate = paginate

const compareVersions = __nccwpck_require__(89296)
const regexEscape = __nccwpck_require__(98691)
const core = __nccwpck_require__(42186)

const { getVersionInfo } = __nccwpck_require__(49914)
const { template } = __nccwpck_require__(47282)
Expand All @@ -142896,19 +142903,17 @@ const { log } = __nccwpck_require__(71911)
const sortReleases = (releases, tagPrefix) => {
// For semver, we find the greatest release number
// For non-semver, we use the most recently merged
try {
const tagPrefixRexExp = new RegExp(`^${regexEscape(tagPrefix)}`)
return releases.sort((r1, r2) =>
compareVersions(
const tagPrefixRexExp = new RegExp(`^${regexEscape(tagPrefix)}`)
return releases.sort((r1, r2) => {
try {
return compareVersions(
r1.tag_name.replace(tagPrefixRexExp, ''),
r2.tag_name.replace(tagPrefixRexExp, '')
)
)
} catch {
return releases.sort(
(r1, r2) => new Date(r1.created_at) - new Date(r2.created_at)
)
}
} catch {
return new Date(r1.created_at) - new Date(r2.created_at)
}
})
}

// GitHub API currently returns a 500 HTTP response if you attempt to fetch over 1000 releases.
Expand Down Expand Up @@ -142967,7 +142972,12 @@ const findReleases = async ({
}

if (lastRelease) {
log({ context, message: `Last release: ${lastRelease.tag_name}` })
log({
context,
message: `Last release${
includePreReleases ? ' (including prerelease)' : ''
}: ${lastRelease.tag_name}`,
})
} else {
log({ context, message: `No last release found` })
}
Expand Down Expand Up @@ -143178,30 +143188,53 @@ const generateChangeLog = (mergedPullRequests, config) => {
return changeLog.join('').trim()
}

const resolveVersionKeyIncrement = (mergedPullRequests, config) => {
const resolveVersionKeyIncrement = (
mergedPullRequests,
config,
isPreRelease
) => {
const priorityMap = {
patch: 1,
minor: 2,
major: 3,
}

const labelToKeyMap = Object.fromEntries(
Object.keys(priorityMap)
.flatMap((key) => [
config['version-resolver'][key].labels.map((label) => [label, key]),
])
.flat()
)

core.debug('labelToKeyMap: ' + JSON.stringify(labelToKeyMap))

const keys = mergedPullRequests
.filter(getFilterExcludedPullRequests(config['exclude-labels']))
.filter(getFilterIncludedPullRequests(config['include-labels']))
.flatMap((pr) => pr.labels.nodes.map((node) => labelToKeyMap[node.name]))
.filter(Boolean)

core.debug('keys: ' + JSON.stringify(keys))

const keyPriorities = keys.map((key) => priorityMap[key])
const priority = Math.max(...keyPriorities)
const versionKey = Object.keys(priorityMap).find(
(key) => priorityMap[key] === priority
)
return versionKey || config['version-resolver'].default

core.debug('versionKey: ' + versionKey)

const versionKeyIncrement = versionKey || config['version-resolver'].default

const shouldIncrementAsPrerelease =
isPreRelease && config['pre-release-identifier']

if (!shouldIncrementAsPrerelease) {
return versionKeyIncrement
}

return `pre${versionKeyIncrement}`
}

const generateReleaseInfo = ({
Expand Down Expand Up @@ -143236,16 +143269,27 @@ const generateReleaseInfo = ({
config.replacers
)

const versionKeyIncrement = resolveVersionKeyIncrement(
mergedPullRequests,
config,
isPreRelease
)

core.debug('versionKeyIncrement: ' + versionKeyIncrement)

const versionInfo = getVersionInfo(
lastRelease,
config['version-template'],
// Use the first override parameter to identify
// a version, from the most accurate to the least
version || tag || name,
resolveVersionKeyIncrement(mergedPullRequests, config),
config['tag-prefix']
versionKeyIncrement,
config['tag-prefix'],
config['pre-release-identifier']
)

core.debug('versionInfo: ' + JSON.stringify(versionInfo, null, 2))

if (versionInfo) {
body = template(body, versionInfo)
}
Expand All @@ -143256,6 +143300,8 @@ const generateReleaseInfo = ({
tag = template(tag, versionInfo)
}

core.debug('tag: ' + tag)

if (name === undefined) {
name = versionInfo
? template(config['name-template'] || '', versionInfo)
Expand All @@ -143264,6 +143310,8 @@ const generateReleaseInfo = ({
name = template(name, versionInfo)
}

core.debug('name: ' + name)

// Tags are not supported as `target_commitish` by Github API.
// GITHUB_REF or the ref from webhook start with `refs/tags/`, so we handle
// those here. If it doesn't but is still a tag - it must have been set
Expand Down Expand Up @@ -143428,6 +143476,10 @@ const schema = (context) => {

prerelease: Joi.boolean().default(DEFAULT_CONFIG.prerelease),

'pre-release-identifier': Joi.string()
.allow('')
.default(DEFAULT_CONFIG['pre-release-identifier']),

'filter-by-commitish': Joi.boolean().default(
DEFAULT_CONFIG['filter-by-commitish']
),
Expand Down Expand Up @@ -143764,22 +143816,26 @@ exports.runnerIsActions = runnerIsActions
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {

const semver = __nccwpck_require__(11383)
const core = __nccwpck_require__(42186)

const splitSemVersion = (input, versionKey = 'version') => {
if (!input[versionKey]) {
return
}

const version = input.inc
? semver.inc(input[versionKey], input.inc, true)
? semver.inc(input[versionKey], input.inc, true, input.preReleaseIdentifier)
: input[versionKey].version

const prereleaseVersion = semver.prerelease(version)?.join('.') || ''

return {
...input,
version,
$MAJOR: semver.major(version),
$MINOR: semver.minor(version),
$PATCH: semver.patch(version),
$PRERELEASE: prereleaseVersion ? `-${prereleaseVersion}` : '',
$COMPLETE: version,
}
}
Expand All @@ -143794,6 +143850,7 @@ const defaultVersionInfo = {
$MAJOR: 1,
$MINOR: 0,
$PATCH: 0,
$PRERELEASE: '',
},
$NEXT_MINOR_VERSION: {
version: '0.1.0',
Expand All @@ -143804,6 +143861,7 @@ const defaultVersionInfo = {
$MAJOR: 0,
$MINOR: 1,
$PATCH: 0,
$PRERELEASE: '',
},
$NEXT_PATCH_VERSION: {
version: '0.1.0',
Expand All @@ -143814,6 +143872,19 @@ const defaultVersionInfo = {
$MAJOR: 0,
$MINOR: 1,
$PATCH: 0,
$PRERELEASE: '',
},
$NEXT_PRERELEASE_VERSION: {
version: '0.1.0-rc.0',
template: '$MAJOR.$MINOR.$PATCH$PRERELEASE',
inputVersion: null,
versionKeyIncrement: 'prerelease',
inc: 'prerelease',
preReleaseIdentifier: 'rc',
$MAJOR: 0,
$MINOR: 1,
$PATCH: 0,
$PRERELEASE: '-rc.0',
},
$INPUT_VERSION: null,
$RESOLVED_VERSION: {
Expand All @@ -143825,6 +143896,7 @@ const defaultVersionInfo = {
$MAJOR: 0,
$MINOR: 1,
$PATCH: 0,
$PRERELEASE: '',
},
}

Expand Down Expand Up @@ -143878,6 +143950,11 @@ const getTemplatableVersion = (input) => {
inc: 'patch',
template: '$PATCH',
}),
$NEXT_PRERELEASE_VERSION: splitSemVersion({
...input,
inc: 'prerelease',
template: '$PRERELEASE',
}),
$INPUT_VERSION: splitSemVersion(input, 'inputVersion'),
$RESOLVED_VERSION: splitSemVersion({
...input,
Expand Down Expand Up @@ -143921,21 +143998,53 @@ const getVersionInfo = (
template,
inputVersion,
versionKeyIncrement,
tagPrefix
tagPrefix,
preReleaseIdentifier
) => {
const version = coerceVersion(release, tagPrefix)
inputVersion = coerceVersion(inputVersion, tagPrefix)

const isPreVersionKeyIncrement = versionKeyIncrement?.startsWith('pre')

if (!version && !inputVersion) {
if (isPreVersionKeyIncrement) {
defaultVersionInfo['$RESOLVED_VERSION'] = {
...defaultVersionInfo['$NEXT_PRERELEASE_VERSION'],
}
}

return defaultVersionInfo
}

const shouldIncrementAsPrerelease =
isPreVersionKeyIncrement && version?.prerelease

if (shouldIncrementAsPrerelease) {
versionKeyIncrement = 'prerelease'
}

core.debug(
`version template params: ` +
JSON.stringify(
{
version,
template,
inputVersion,
versionKeyIncrement,
preReleaseIdentifier,
},
null,
true
)
)

return {
...getTemplatableVersion({
version,
template,
inputVersion,
versionKeyIncrement,
preReleaseIdentifier,
}),
}
}
Expand Down
7 changes: 6 additions & 1 deletion index.js
Expand Up @@ -162,9 +162,14 @@ module.exports = (app, { getRouter }) => {
const {
'filter-by-commitish': filterByCommitish,
'include-pre-releases': includePreReleases,
'pre-release-identifier': preReleaseIdentifier,
'tag-prefix': tagPrefix,
} = config

const shouldIncludePreReleases = Boolean(
includePreReleases || preReleaseIdentifier
)

// override header and footer when passed as input
const header = core.getInput('header')
const footer = core.getInput('footer')
Expand All @@ -179,7 +184,7 @@ module.exports = (app, { getRouter }) => {
context,
targetCommitish,
filterByCommitish,
includePreReleases,
includePreReleases: shouldIncludePreReleases,
tagPrefix,
})

Expand Down

0 comments on commit cbce15f

Please sign in to comment.