feat: Added version-file, version-path, skip-version-file options
package-json is renamed to version-file to be more generic so we can support other formats version-path is the location of the string version skip-version-file is a option to prevent updating the version filereleases/v3
parent
4d8a290748
commit
d022b0d7e9
16
action.yml
16
action.yml
|
@ -54,13 +54,25 @@ inputs:
|
||||||
default: '5'
|
default: '5'
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
package-json:
|
version-file:
|
||||||
description: 'The path to the package.json to use'
|
description: 'The path to the file that contains the version to bump'
|
||||||
default: './package.json'
|
default: './package.json'
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
|
version-path:
|
||||||
|
description: 'The place inside the version file to bump'
|
||||||
|
default: 'version'
|
||||||
|
required: false
|
||||||
|
|
||||||
skip-on-empty:
|
skip-on-empty:
|
||||||
description: 'Do nothing when the changelog from the latest release is empty'
|
description: 'Do nothing when the changelog from the latest release is empty'
|
||||||
|
default: 'true'
|
||||||
|
required: false
|
||||||
|
|
||||||
|
skip-version-file:
|
||||||
|
description: 'Do not update the version file'
|
||||||
|
default: 'false'
|
||||||
|
required: false
|
||||||
|
|
||||||
skip-commit:
|
skip-commit:
|
||||||
description: 'Do create a release commit'
|
description: 'Do create a release commit'
|
||||||
|
|
64
src/index.js
64
src/index.js
|
@ -1,66 +1,96 @@
|
||||||
const core = require('@actions/core')
|
const core = require('@actions/core')
|
||||||
const conventionalRecommendedBump = require('conventional-recommended-bump')
|
const conventionalRecommendedBump = require('conventional-recommended-bump')
|
||||||
|
const path = require('path')
|
||||||
|
|
||||||
|
const getVersioning = require('./version')
|
||||||
const git = require('./helpers/git')
|
const git = require('./helpers/git')
|
||||||
const packageJson = require('./helpers/packageJson')
|
|
||||||
const changelog = require('./helpers/generateChangelog')
|
const changelog = require('./helpers/generateChangelog')
|
||||||
|
|
||||||
async function run() {
|
async function run() {
|
||||||
try {
|
try {
|
||||||
const commitMessage = core.getInput('git-message')
|
const gitCommitMessage = core.getInput('git-message')
|
||||||
|
const gitUserName = core.getInput('git-user-name')
|
||||||
|
const gitUserEmail = core.getInput('git-user-email')
|
||||||
const tagPrefix = core.getInput('tag-prefix')
|
const tagPrefix = core.getInput('tag-prefix')
|
||||||
const preset = core.getInput('preset')
|
const preset = core.getInput('preset')
|
||||||
const outputFile = core.getInput('output-file')
|
const outputFile = core.getInput('output-file')
|
||||||
const releaseCount = core.getInput('release-count')
|
const releaseCount = core.getInput('release-count')
|
||||||
const packageJsonToUse = core.getInput('package-json')
|
const versionFile = core.getInput('version-file')
|
||||||
const skipOnEmptyRelease = core.getInput('skip-on-empty').toLowerCase() === 'true'
|
const versionPath = core.getInput('version-path')
|
||||||
|
const skipVersionFile = core.getInput('skip-version-file').toLowerCase() === 'true'
|
||||||
|
const skipTag = core.getInput('skip-tag').toLowerCase() === 'true'
|
||||||
|
const skipCommit = core.getInput('skip-commit').toLowerCase() === 'true'
|
||||||
|
const skipEmptyRelease = core.getInput('skip-on-empty').toLowerCase() === 'true'
|
||||||
|
|
||||||
core.info(`Using "${preset}" preset`)
|
core.info(`Using "${preset}" preset`)
|
||||||
core.info(`Using "${commitMessage}" as commit message`)
|
core.info(`Using "${gitCommitMessage}" as commit message`)
|
||||||
|
core.info(`Using "${gitUserName}" as git user.name`)
|
||||||
|
core.info(`Using "${gitUserEmail}" as git user.email`)
|
||||||
core.info(`Using "${releaseCount}" release count`)
|
core.info(`Using "${releaseCount}" release count`)
|
||||||
core.info(`Using "${packageJsonToUse}"`)
|
core.info(`Using "${versionFile}" as version file`)
|
||||||
|
core.info(`Using "${versionPath}" as version path`)
|
||||||
core.info(`Using "${tagPrefix}" as tag prefix`)
|
core.info(`Using "${tagPrefix}" as tag prefix`)
|
||||||
core.info(`Using "${outputFile}" as output file`)
|
core.info(`Using "${outputFile}" as output file`)
|
||||||
|
|
||||||
|
core.info(`Skipping empty releases is "${skipEmptyRelease ? 'enabled' : 'disabled'}"`)
|
||||||
|
core.info(`Skipping the update of the version file is "${skipVersionFile ? 'enabled' : 'disabled'}"`)
|
||||||
|
core.info(`Skipping the creation of the GIT tag is "${skipTag ? 'enabled' : 'disabled'}"`)
|
||||||
|
|
||||||
core.info('Pull to make sure we have the full git history')
|
core.info('Pull to make sure we have the full git history')
|
||||||
await git.pull()
|
await git.pull()
|
||||||
|
|
||||||
conventionalRecommendedBump({ preset, tagPrefix }, async (error, recommendation) => {
|
conventionalRecommendedBump({ preset, tagPrefix }, async(error, recommendation) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
core.setFailed(error.message)
|
core.setFailed(error.message)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
core.info(`Recommended release type: ${recommendation.releaseType}`)
|
core.info(`Recommended release type: ${recommendation.releaseType}`)
|
||||||
recommendation.reason && core.info(`because: ${recommendation.reason}`)
|
|
||||||
|
// If we have a reason also log it
|
||||||
|
if (recommendation.reason) {
|
||||||
|
core.info(`Because: ${recommendation.reason}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If skipVersionFile is true we use GIT to determine the new version
|
||||||
|
const fileExtension = skipVersionFile
|
||||||
|
? 'git'
|
||||||
|
: versionFile.split('.').pop()
|
||||||
|
|
||||||
|
const versioning = getVersioning(fileExtension)
|
||||||
|
|
||||||
|
// File type not supported
|
||||||
|
if (versioning === null) {
|
||||||
|
throw new Error(`File extension "${fileExtension}" from file "${versionFile}" is not supported`)
|
||||||
|
}
|
||||||
|
|
||||||
|
versioning.init(path.resolve(versionFile), versionPath)
|
||||||
|
|
||||||
// Bump the version in the package.json
|
// Bump the version in the package.json
|
||||||
const jsonPackage = packageJson.bump(
|
versioning.bump(
|
||||||
packageJson.get(),
|
|
||||||
recommendation.releaseType,
|
recommendation.releaseType,
|
||||||
)
|
)
|
||||||
|
|
||||||
const stringChangelog = await changelog.generateStringChangelog(tagPrefix, preset, jsonPackage, 1)
|
// Generate the string changelog
|
||||||
|
const stringChangelog = await changelog.generateStringChangelog(tagPrefix, preset, versioning.newVersion, 1)
|
||||||
core.info('Changelog generated')
|
core.info('Changelog generated')
|
||||||
core.info(stringChangelog)
|
core.info(stringChangelog)
|
||||||
|
|
||||||
|
// Removes the version number from the changelog
|
||||||
const cleanChangelog = stringChangelog.split('\n').slice(3).join('\n').trim()
|
const cleanChangelog = stringChangelog.split('\n').slice(3).join('\n').trim()
|
||||||
|
|
||||||
if (skipOnEmptyRelease && cleanChangelog === '') {
|
if (skipEmptyRelease && cleanChangelog === '') {
|
||||||
core.info('Generated changelog is empty and skip-on-empty has been activated so we skip this step')
|
core.info('Generated changelog is empty and skip-on-empty has been activated so we skip this step')
|
||||||
core.setOutput('skipped', 'true')
|
core.setOutput('skipped', 'true')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the package.json file
|
core.info(`New version: ${versioning.newVersion}`)
|
||||||
packageJson.update(jsonPackage)
|
|
||||||
|
|
||||||
core.info(`New version: ${jsonPackage.version}`)
|
|
||||||
|
|
||||||
// If output file === 'false' we don't write it to file
|
// If output file === 'false' we don't write it to file
|
||||||
if (outputFile !== 'false') {
|
if (outputFile !== 'false') {
|
||||||
// Generate the changelog
|
// Generate the changelog
|
||||||
await changelog.generateFileChangelog(tagPrefix, preset, jsonPackage, outputFile, releaseCount)
|
await changelog.generateFileChangelog(tagPrefix, preset, versioning.newVersion, outputFile, releaseCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
const gitTag = `${tagPrefix}${versioning.newVersion}`
|
const gitTag = `${tagPrefix}${versioning.newVersion}`
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
const JSON = require('./json')
|
||||||
|
|
||||||
|
module.exports = (fileExtension) => {
|
||||||
|
switch (fileExtension.toLowerCase()) {
|
||||||
|
case 'json':
|
||||||
|
return JSON
|
||||||
|
|
||||||
|
// case 'yaml':
|
||||||
|
// case 'yml':
|
||||||
|
// return Yaml
|
||||||
|
//
|
||||||
|
// case 'toml':
|
||||||
|
// return Toml
|
||||||
|
//
|
||||||
|
// case 'git':
|
||||||
|
// return Git
|
||||||
|
|
||||||
|
default:
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
const fs = require('fs')
|
||||||
|
|
||||||
|
module.exports = new (class JSON {
|
||||||
|
|
||||||
|
fileLocation = null
|
||||||
|
|
||||||
|
versionPath = null
|
||||||
|
|
||||||
|
newVersion = null
|
||||||
|
|
||||||
|
init = (fileLocation, versionPath) => {
|
||||||
|
this.fileLocation = fileLocation
|
||||||
|
this.versionPath = versionPath
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get's the JSON file
|
||||||
|
*
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
read = () => {
|
||||||
|
return JSON.parse(fs.readFileSync(this.fileLocation))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bumps the version in the package.json
|
||||||
|
*
|
||||||
|
* @param {!string} releaseType - The type of release
|
||||||
|
* @return {*}
|
||||||
|
*/
|
||||||
|
bump = (releaseType) => {
|
||||||
|
// Read the JSON file
|
||||||
|
const packageJson = this.read()
|
||||||
|
|
||||||
|
let [major, minor, patch] = packageJson.version.split('.')
|
||||||
|
|
||||||
|
switch (releaseType) {
|
||||||
|
case 'major':
|
||||||
|
major = parseInt(major, 10) + 1
|
||||||
|
minor = 0
|
||||||
|
patch = 0
|
||||||
|
break
|
||||||
|
|
||||||
|
case 'minor':
|
||||||
|
minor = parseInt(minor, 10) + 1
|
||||||
|
patch = 0
|
||||||
|
break
|
||||||
|
|
||||||
|
default:
|
||||||
|
patch = parseInt(patch, 10) + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the package.json with the new version
|
||||||
|
// TODO:: Test and make sure we can use path.to.version
|
||||||
|
packageJson[this.versionPath] = this.newVersion = `${major}.${minor}.${patch}`
|
||||||
|
|
||||||
|
// Update the JSON file
|
||||||
|
this.update(packageJson)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update JSON file
|
||||||
|
*
|
||||||
|
* @param {!string} newJSONContent - New content for the JSON file
|
||||||
|
* @return {*}
|
||||||
|
*/
|
||||||
|
update = (newJSONContent) => (
|
||||||
|
fs.writeFileSync(this.fileLocation, JSON.stringify(newJSONContent, null, 2))
|
||||||
|
)
|
||||||
|
|
||||||
|
})
|
||||||
|
|
Loading…
Reference in New Issue