travis-pre-release
Version:
Append pre-release build number to version in package.json
104 lines (87 loc) • 3.51 kB
JavaScript
#!/usr/bin/env node
const semver = require('semver');
const semverUtils = require('semver-utils');
const jsonfile = require('jsonfile');
const getLastRelease = require('../util/get-last-release');
const {argv: Argv, env, stderr} = require('process');
const {tag, push, getGitHead} = require('../util/git.js');
const {template} = require('lodash');
async function resolvePreRelease() {
jsonfile.spaces = 2;
const argv = require('yargs')
.usage('Usage: $0 [-r "releaseVersion"] [-b "buildVersion"]')
.option('pre', {
alias: 'prefix',
demand: false,
default: 'rc',
describe: 'Change release version prefix',
type: 'string'
})
.option('b', {alias: 'build', demand: false, default: '', describe: 'Build meta data', type: 'string'})
.option('p', {alias: 'path', demand: false, default: '.', describe: 'Path to package.json', type: 'string'})
.option('t', {alias: 'tag-format', describe: 'Git tag format', type: 'string', group: 'Options'})
.count('verbose')
.help('?')
.alias('?', 'help')
.example('$0 -r 12', 'creates 1.0.0-rc.12')
.example('$0 -r 12 --pre alpha -b 420', 'creates 1.0.0-alpha.12+420')
.example('$0 -r dev --pre \'\' -b 12', 'creates 1.0.0-dev+12')
.example('$0 -b build.12 -p /path/to/project', 'creates 1.0.0+build.12')
.argv;
const buildNumber = argv.b;
try {
const tagFormat = argv.tagFormat || 'rc${version}';
const lastRelease = await getLastRelease(tagFormat);
const nextVersion = lastRelease.version ? semver.inc(lastRelease.version, 'minor') : '1.0.0';
const parsedNextVersion = semverUtils.parse(nextVersion);
const lastPreRelease = await getLastPreRelease({version: parsedNextVersion, argv, buildNumber, tagFormat});
if (lastPreRelease.gitHead === await getGitHead()) {
console.log(`There is nothing commit after tag ${lastPreRelease.gitTag}`);
return 0;
}
const nextPreVersion = lastPreRelease.version ? parseInt(lastPreRelease.version) + 1 : 1;
const nextVersionWithPreVersion = semverUtils.stringify({
major: parsedNextVersion.major,
minor: parsedNextVersion.minor,
patch: parsedNextVersion.patch,
release: argv.pre + '.' + nextPreVersion,
build: buildNumber
});
updateVersionInFile(nextVersionWithPreVersion, argv);
const gitTag = template(tagFormat)({version: nextVersionWithPreVersion});
await addGitTag(gitTag);
console.log(`New version is ${nextVersionWithPreVersion}, Generate tag ${gitTag}`)
return 0;
} catch (error) {
console.log('ERROR Occured: ', error);
return 1;
}
}
async function getLastPreRelease({version, argv, buildNumber, tagFormat}) {
const newPackageVersion = semverUtils.stringify({
major: version.major,
minor: version.minor,
patch: version.patch,
release: argv.pre + '.${version}',
build: buildNumber
});
const preTagFormat = template(tagFormat)({version: newPackageVersion});
return await getLastRelease(preTagFormat, true);
}
function updateVersionInFile(nextVersionWithPreVersion, argv) {
const packagePath = argv.p + '/package.json';
const packagejson = jsonfile.readFileSync(packagePath);
packagejson.version = nextVersionWithPreVersion;
jsonfile.writeFileSync(packagePath, packagejson);
}
async function addGitTag(gitTag) {
await tag(gitTag);
await push();
}
resolvePreRelease()
.then(exitCode => {
process.exitCode = exitCode;
})
.catch(() => {
process.exitCode = 1;
});