diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index aec3180..8a088c4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,6 +21,49 @@ jobs: with: github-token: ${{ secrets.github_token }} + test-json-new: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + path: "./" + + - name: Generate changelog + id: changelog + uses: ./ + env: + ENV: 'dont-use-git' + with: + github-token: ${{ secrets.github_token }} + version-file: 'test-file-new.json' + + - name: Show file + id: show + run: | + echo "$( { - let [major, minor, patch] = version.split('.') + let major, minor, patch - switch (releaseType) { - case 'major': - major = parseInt(major, 10) + 1 - minor = 0 + if (version) { + [major, minor, patch] = 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 + } + } else { + let version = semverValid(core.getInput('fallback-version')) + + if (version) { + [major, minor, patch] = version.split('.') + } else { + // default + major = 0 + minor = 1 patch = 0 - break + } - case 'minor': - minor = parseInt(minor, 10) + 1 - patch = 0 - break - - default: - patch = parseInt(patch, 10) + 1 + core.info(`The version could not be detected, using fallback version '${major}.${minor}.${patch}'.`) } return `${major}.${minor}.${patch}` diff --git a/src/helpers/git.js b/src/helpers/git.js index de5c185..05b5bf1 100644 --- a/src/helpers/git.js +++ b/src/helpers/git.js @@ -97,7 +97,7 @@ module.exports = new (class Git { * @return {Promise<>} */ pull = () => ( - this.exec(`pull --unshallow ${core.getInput('git-pull-method')}`) + this.exec(`pull --unshallow --tags ${core.getInput('git-pull-method')}`) ) /** diff --git a/src/version/base.js b/src/version/base.js index 04a172d..c9e142a 100644 --- a/src/version/base.js +++ b/src/version/base.js @@ -25,7 +25,7 @@ module.exports = class BaseVersioning { * @return {string} */ read = () => { - return fs.readFileSync(this.fileLocation, 'utf8') + return fs.existsSync(this.fileLocation) ? fs.readFileSync(this.fileLocation, 'utf8') : '' } /** diff --git a/src/version/git.js b/src/version/git.js index b73cc38..4077c93 100644 --- a/src/version/git.js +++ b/src/version/git.js @@ -13,7 +13,7 @@ module.exports = new (class Git extends BaseVersioning { gitSemverTags({ tagPrefix, }, (err, tags) => { - const currentVersion = tags.shift().replace(tagPrefix, '') + const currentVersion = tags.length > 0 ? tags.shift().replace(tagPrefix, '') : null // Get the new version this.newVersion = bumpVersion( diff --git a/src/version/json.js b/src/version/json.js index 150e9a3..7a75c52 100644 --- a/src/version/json.js +++ b/src/version/json.js @@ -1,3 +1,4 @@ +const core = require('@actions/core') const objectPath = require('object-path') const BaseVersioning = require('./base') @@ -14,8 +15,22 @@ module.exports = new (class Json extends BaseVersioning { bump = (releaseType) => { // Read the file const fileContent = this.read() - const jsonContent = JSON.parse(fileContent) - const oldVersion = objectPath.get(jsonContent, this.versionPath) + + // Parse the file + let jsonContent + try { + jsonContent = JSON.parse(fileContent) + } catch (error) { + core.startGroup(`Error when parsing the file '${this.fileLocation}'`) + core.info(`File-Content: ${fileContent}`) + core.info(error) // should be 'warning' ? + core.endGroup() + + jsonContent = {} + } + + // Get the old version + const oldVersion = objectPath.get(jsonContent, this.versionPath, null) // Get the new version this.newVersion = bumpVersion( diff --git a/src/version/toml.js b/src/version/toml.js index e164e38..ff889ee 100644 --- a/src/version/toml.js +++ b/src/version/toml.js @@ -1,5 +1,5 @@ const objectPath = require('object-path') -const toml = require('toml') +const toml = require('@iarna/toml') const BaseVersioning = require('./base') const bumpVersion = require('../helpers/bumpVersion') @@ -16,7 +16,7 @@ module.exports = new (class Toml extends BaseVersioning{ // Read the file const fileContent = this.read() const tomlContent = toml.parse(fileContent) - const oldVersion = objectPath.get(tomlContent, this.versionPath) + const oldVersion = objectPath.get(tomlContent, this.versionPath, null) // Get the new version this.newVersion = bumpVersion( @@ -24,17 +24,23 @@ module.exports = new (class Toml extends BaseVersioning{ oldVersion, ) - // Get the name of where the version is in - const versionName = this.versionPath.split('.').pop() - // Update the file - this.update( - // We use replace so we can preserve white spaces and comments - fileContent.replace( - `${versionName} = "${oldVersion}"`, - `${versionName} = "${this.newVersion}"`, - ), - ) + if (oldVersion) { + // Get the name of where the version is in + const versionName = this.versionPath.split('.').pop() + + this.update( + // We use replace instead of yaml.stringify so we can preserve white spaces and comments + fileContent.replace( + `${versionName} = "${oldVersion}"`, + `${versionName} = "${this.newVersion}"`, + ), + ) + } else { + // Update the content with the new version + objectPath.set(tomlContent, this.versionPath, this.newVersion) + this.update(toml.stringify(tomlContent)) + } } }) diff --git a/src/version/yaml.js b/src/version/yaml.js index da7db77..c29b9b2 100644 --- a/src/version/yaml.js +++ b/src/version/yaml.js @@ -15,8 +15,8 @@ module.exports = new (class Yaml extends BaseVersioning{ bump = (releaseType) => { // Read the file const fileContent = this.read() - const yamlContent = yaml.parse(fileContent) - const oldVersion = objectPath.get(yamlContent, this.versionPath) + const yamlContent = yaml.parse(fileContent) || {} + const oldVersion = objectPath.get(yamlContent, this.versionPath, null) // Get the new version this.newVersion = bumpVersion( @@ -24,17 +24,23 @@ module.exports = new (class Yaml extends BaseVersioning{ oldVersion, ) - // Get the name of where the version is in - const versionName = this.versionPath.split('.').pop() - // Update the file - this.update( - // We use replace instead of yaml.stringify so we can preserve white spaces and comments - fileContent.replace( - `${versionName}: '${oldVersion}'`, - `${versionName}: '${this.newVersion}'`, - ), - ) + if (oldVersion) { + // Get the name of where the version is in + const versionName = this.versionPath.split('.').pop() + + this.update( + // We use replace instead of yaml.stringify so we can preserve white spaces and comments + fileContent.replace( + `${versionName}: '${oldVersion}'`, + `${versionName}: '${this.newVersion}'`, + ), + ) + } else { + // Update the content with the new version + objectPath.set(yamlContent, this.versionPath, this.newVersion) + this.update(yaml.stringify(yamlContent)) + } } })