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 Feb 2, 2023
1 parent 7fa235b commit ff9ef6d
Show file tree
Hide file tree
Showing 12 changed files with 430 additions and 88 deletions.
8 changes: 8 additions & 0 deletions README.md
Expand Up @@ -337,6 +337,14 @@ 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 `prerelease-identifer` option. It accept any string, but it's recommended to use [Semantic Versioning](https://semver.org/) pre-release identifiers (alpha, beta, rc, etc).

```yml
prerelease-identifer: '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
115 changes: 101 additions & 14 deletions dist/index.js
Expand Up @@ -142377,11 +142377,14 @@ module.exports = (app, { getRouter }) => {
config['footer'] = footer
}

const findPrerelease = isPreRelease && config['prerelease-identifier']

const { draftRelease, lastRelease } = await findReleases({
context,
targetCommitish,
filterByCommitish,
tagPrefix,
findPrerelease,
})

const { commits, pullRequests: mergedPullRequests } =
Expand Down Expand Up @@ -142773,7 +142776,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 @@ -142791,6 +142794,7 @@ const DEFAULT_CONFIG = Object.freeze({
'sort-by': SORT_BY.mergedAt,
'sort-direction': SORT_DIRECTIONS.descending,
prerelease: false,
'prerelease-identifier': '',
'filter-by-commitish': false,
commitish: '',
'category-template': `## $TITLE`,
Expand Down Expand Up @@ -142885,6 +142889,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 @@ -142910,6 +142915,7 @@ const findReleases = async ({
targetCommitish,
filterByCommitish,
tagPrefix,
findPrerelease,
}) => {
let releaseCount = 0
let releases = await context.octokit.paginate(
Expand Down Expand Up @@ -142941,12 +142947,14 @@ const findReleases = async ({
const filteredReleases = tagPrefix
? commitishFilteredReleases.filter((r) => r.tag_name.startsWith(tagPrefix))
: commitishFilteredReleases
const sortedPublishedReleases = sortReleases(
filteredReleases.filter((r) => !r.draft && !r.prerelease)
)
const draftRelease = filteredReleases.find((r) => r.draft)
const lastRelease =
sortedPublishedReleases[sortedPublishedReleases.length - 1]

const sortedReleases = sortReleases(filteredReleases)

const draftRelease = sortedReleases.filter((r) => r.draft).at(-1)

const lastRelease = sortedReleases
.filter((r) => !r.draft && (findPrerelease || !r.prerelease))
.at(-1)

if (draftRelease) {
log({ context, message: `Draft release: ${draftRelease.tag_name}` })
Expand All @@ -142955,7 +142963,12 @@ const findReleases = async ({
}

if (lastRelease) {
log({ context, message: `Last release: ${lastRelease.tag_name}` })
log({
context,
message: `Last release${
findPrerelease ? ' (including prerelease)' : ''
}: ${lastRelease.tag_name}`,
})
} else {
log({ context, message: `No last release found` })
}
Expand Down Expand Up @@ -143166,12 +143179,17 @@ 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) => [
Expand All @@ -143189,7 +143207,17 @@ const resolveVersionKeyIncrement = (mergedPullRequests, config) => {
const versionKey = Object.keys(priorityMap).find(
(key) => priorityMap[key] === priority
)
return versionKey || config['version-resolver'].default

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

const shouldIncrementAsPrerelease =
isPreRelease && config['prerelease-identifier']

if (!shouldIncrementAsPrerelease) {
return versionKeyIncrement
}

return `pre${versionKeyIncrement}`
}

const generateReleaseInfo = ({
Expand Down Expand Up @@ -143225,16 +143253,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['prerelease-identifier']
)

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

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

core.debug('tag: ' + tag)

if (name === undefined) {
name = versionInfo
? template(config['name-template'] || '', versionInfo)
Expand All @@ -143253,6 +143294,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 @@ -143416,6 +143459,9 @@ const schema = (context) => {
.default(DEFAULT_CONFIG['sort-direction']),

prerelease: Joi.boolean().default(DEFAULT_CONFIG.prerelease),
'prerelease-identifier': Joi.string()
.allow('')
.default(DEFAULT_CONFIG['prerelease-identifier']),

'filter-by-commitish': Joi.boolean().default(
DEFAULT_CONFIG['filter-by-commitish']
Expand Down Expand Up @@ -143756,15 +143802,18 @@ const splitSemVersion = (input, versionKey = 'version') => {
}

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 @@ -143779,6 +143828,7 @@ const defaultVersionInfo = {
$MAJOR: 1,
$MINOR: 0,
$PATCH: 0,
$PRERELEASE: '',
},
$NEXT_MINOR_VERSION: {
version: '0.1.0',
Expand All @@ -143789,6 +143839,7 @@ const defaultVersionInfo = {
$MAJOR: 0,
$MINOR: 1,
$PATCH: 0,
$PRERELEASE: '',
},
$NEXT_PATCH_VERSION: {
version: '0.1.0',
Expand All @@ -143799,6 +143850,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 @@ -143810,6 +143874,7 @@ const defaultVersionInfo = {
$MAJOR: 0,
$MINOR: 1,
$PATCH: 0,
$PRERELEASE: '',
},
}

Expand Down Expand Up @@ -143863,6 +143928,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 @@ -143906,21 +143976,38 @@ 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'
}

return {
...getTemplatableVersion({
version,
template,
inputVersion,
versionKeyIncrement,
prereleaseIdentifier,
}),
}
}
Expand Down
3 changes: 3 additions & 0 deletions index.js
Expand Up @@ -174,11 +174,14 @@ module.exports = (app, { getRouter }) => {
config['footer'] = footer
}

const findPrerelease = isPreRelease && config['prerelease-identifier']

const { draftRelease, lastRelease } = await findReleases({
context,
targetCommitish,
filterByCommitish,
tagPrefix,
findPrerelease,
})

const { commits, pullRequests: mergedPullRequests } =
Expand Down
3 changes: 2 additions & 1 deletion lib/default-config.js
Expand Up @@ -7,7 +7,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 @@ -25,6 +25,7 @@ const DEFAULT_CONFIG = Object.freeze({
'sort-by': SORT_BY.mergedAt,
'sort-direction': SORT_DIRECTIONS.descending,
prerelease: false,
'prerelease-identifier': '',
'filter-by-commitish': false,
commitish: '',
'category-template': `## $TITLE`,
Expand Down

0 comments on commit ff9ef6d

Please sign in to comment.