diff --git a/cmds/release.js b/cmds/release.js index b8544d9c4..f0d118a7e 100644 --- a/cmds/release.js +++ b/cmds/release.js @@ -83,6 +83,11 @@ module.exports = { type: 'string', default: '' }, + metadata: { + describe: 'SemVer metadata to be appended to released version', + type: 'string', + default: '' + }, type: { describe: 'The type of version bump for this release', type: 'string', diff --git a/src/release/index.js b/src/release/index.js index c988490e7..3e6b6ef15 100644 --- a/src/release/index.js +++ b/src/release/index.js @@ -10,6 +10,7 @@ const docs = require('../docs') const releaseChecks = require('./prerelease') const bump = require('./bump') +const metadata = require('./metadata') const changelog = require('./changelog') const commit = require('./commit') const tag = require('./tag') @@ -35,6 +36,11 @@ function release (opts) { task: bump, enabled: (ctx) => ctx.bump }, + { + title: 'Metadata', + task: metadata, + enabled: (ctx) => ctx.metadata + }, { title: 'Build', task: (ctx) => build(ctx), diff --git a/src/release/metadata.js b/src/release/metadata.js new file mode 100644 index 000000000..0453d4f41 --- /dev/null +++ b/src/release/metadata.js @@ -0,0 +1,22 @@ +'use strict' + +const fs = require('fs-extra') + +const getPathToPkg = require('../utils').getPathToPkg + +function metadata (ctx, task) { + const { metadata } = ctx + + return fs.readJson(getPathToPkg()) + .then((pkg) => { + const version = pkg.version + const newVersion = `${version}+${metadata}` + + task.title += `: v${version} -> v${newVersion}` + + pkg.version = newVersion + return fs.writeJson(getPathToPkg(), pkg, { spaces: 2 }) + }) +} + +module.exports = metadata diff --git a/src/release/prerelease.js b/src/release/prerelease.js index 54b9dc64c..5e6347836 100644 --- a/src/release/prerelease.js +++ b/src/release/prerelease.js @@ -10,7 +10,7 @@ function validGh (opts) { if (!opts.ghtoken) { return Promise.reject(new Error('Missing GitHub access token. ' + - 'Have you set `AEGIR_GHTOKEN`?')) + 'Have you set `AEGIR_GHTOKEN`?')) } return Promise.resolve() } @@ -24,13 +24,23 @@ async function isDirty () { } } +function isMetadataValid (opts) { + if (opts.metadata && !opts.metadata.match(/^[0-9A-Za-z-]+$/)) { + return Promise.reject(new Error('The metadata has to consists only of alphanumeric characters and hypen!')) + } + + return Promise.resolve() +} + // Validate that all requirements are met before starting the release // - No dirty git // - github token for github release, if github release is enabled +// - Metadata is valid string function prerelease (opts) { return Promise.all([ isDirty(), - validGh(opts) + validGh(opts), + isMetadataValid(opts) ]) }