fix: harmonize parameters passed to getError

This commit is contained in:
Pierre Vanduynslager 2018-12-18 17:34:06 -05:00
parent 4aad9cd490
commit f96c660c1b
7 changed files with 54 additions and 69 deletions

View File

@ -86,7 +86,7 @@ async function run(context, plugins) {
} }
} catch (error) { } catch (error) {
logger.error(`The command "${error.cmd}" failed with the error message ${error.stderr}.`); logger.error(`The command "${error.cmd}" failed with the error message ${error.stderr}.`);
throw getError('EGITNOPERMISSION', {options}); throw getError('EGITNOPERMISSION', context);
} }
logger.success(`Allowed to push to the Git repository`); logger.success(`Allowed to push to the Git repository`);
@ -98,8 +98,8 @@ async function run(context, plugins) {
context.releases = []; context.releases = [];
await pEachSeries(releasesToAdd, async ({lastRelease, currentRelease, nextRelease}) => { await pEachSeries(releasesToAdd, async ({lastRelease, currentRelease, nextRelease}) => {
if (context.branch['merge-range'] && !semver.satisfies(nextRelease.version, context.branch['merge-range'])) { if (context.branch.mergeRange && !semver.satisfies(nextRelease.version, context.branch.mergeRange)) {
errors.push(getError('EINVALIDMAINTENANCEMERGE', {nextRelease, branch: context.branch})); errors.push(getError('EINVALIDMAINTENANCEMERGE', {...context, nextRelease}));
return; return;
} }

View File

@ -51,7 +51,7 @@ function maintenance({maintenance, release}) {
tags, tags,
range: getRange(min, max), range: getRange(min, max),
accept: diff ? RELEASE_TYPE.slice(0, RELEASE_TYPE.indexOf(diff)) : [], accept: diff ? RELEASE_TYPE.slice(0, RELEASE_TYPE.indexOf(diff)) : [],
'merge-range': getRange(maintenanceMin, getUpperBound(range)), mergeRange: getRange(maintenanceMin, getUpperBound(range)),
}; };
}); });
} }

View File

@ -29,11 +29,9 @@ Please make sure to add the \`repositoryUrl\` to the [semantic-release configura
'docs/usage/configuration.md' 'docs/usage/configuration.md'
)}).`, )}).`,
}), }),
EGITNOPERMISSION: ({options}) => ({ EGITNOPERMISSION: ({options: {repositoryUrl}, branch: {name}}) => ({
message: 'The push permission to the Git repository is required.', message: 'The push permission to the Git repository is required.',
details: `**semantic-release** cannot push the version tag to the branch \`${ details: `**semantic-release** cannot push the version tag to the branch \`${name}\` on remote Git repository with URL \`${repositoryUrl}\`.
options.branch
}\` on remote Git repository with URL \`${options.repositoryUrl}\`.
Please refer to the [authentication configuration documentation](${linkify( Please refer to the [authentication configuration documentation](${linkify(
'docs/usage/ci-configuration.md#authentication' 'docs/usage/ci-configuration.md#authentication'
@ -41,7 +39,7 @@ Please refer to the [authentication configuration documentation](${linkify(
'docs/usage/configuration.md#repositoryurl' 'docs/usage/configuration.md#repositoryurl'
)}) is configured with a [valid Git URL](https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols).`, )}) is configured with a [valid Git URL](https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols).`,
}), }),
EINVALIDTAGFORMAT: ({tagFormat}) => ({ EINVALIDTAGFORMAT: ({options: {tagFormat}}) => ({
message: 'Invalid `tagFormat` option.', message: 'Invalid `tagFormat` option.',
details: `The [tagFormat](${linkify( details: `The [tagFormat](${linkify(
'docs/usage/configuration.md#tagformat' 'docs/usage/configuration.md#tagformat'
@ -49,7 +47,7 @@ Please refer to the [authentication configuration documentation](${linkify(
Your configuration for the \`tagFormat\` option is \`${stringify(tagFormat)}\`.`, Your configuration for the \`tagFormat\` option is \`${stringify(tagFormat)}\`.`,
}), }),
ETAGNOVERSION: ({tagFormat}) => ({ ETAGNOVERSION: ({options: {tagFormat}}) => ({
message: 'Invalid `tagFormat` option.', message: 'Invalid `tagFormat` option.',
details: `The [tagFormat](${linkify( details: `The [tagFormat](${linkify(
'docs/usage/configuration.md#tagformat' 'docs/usage/configuration.md#tagformat'
@ -205,40 +203,26 @@ Your configuration for the problematic branch is \`${stringify(branch)}\`.`,
Your configuration for the problematic branches is \`${stringify(branches)}\`.`, Your configuration for the problematic branches is \`${stringify(branches)}\`.`,
}), }),
EINVALIDNEXTVERSION: ({nextRelease, branch, commits, validBranches}) => ({ EINVALIDNEXTVERSION: ({nextRelease: {version}, branch: {name, range}, commits, validBranches}) => ({
message: `The release \`${nextRelease.version}\` on branch \`${ message: `The release \`${version}\` on branch \`${name}\` cannot be published as it is out of range.`,
branch.name details: `Based on the releases published on other branches, only versions within the range \`${range}\` can be published from branch \`${name}\`.
}\` cannot be published as it is out of range.`,
details: `Based on the releases published on other branches, only versions within the range \`${
branch.range
}\` can be published from branch \`${branch.name}\`.
The following commit${commits.length > 1 ? 's are' : ' is'} responsible for the invalid release: The following commit${commits.length > 1 ? 's are' : ' is'} responsible for the invalid release:
${commits.map(({commit: {short}, subject}) => `- ${subject} (${short})`).join('\n')} ${commits.map(({commit: {short}, subject}) => `- ${subject} (${short})`).join('\n')}
${ ${
commits.length > 1 ? 'Those commits' : 'This commit' commits.length > 1 ? 'Those commits' : 'This commit'
} should be moved to a valid branch with [git merge](https://git-scm.com/docs/git-merge) or [git cherry-pick](https://git-scm.com/docs/git-cherry-pick) and removed from branch \`${ } should be moved to a valid branch with [git merge](https://git-scm.com/docs/git-merge) or [git cherry-pick](https://git-scm.com/docs/git-cherry-pick) and removed from branch \`${name}\` with [git revert](https://git-scm.com/docs/git-revert) or [git reset](https://git-scm.com/docs/git-reset).
branch.name
}\` with [git revert](https://git-scm.com/docs/git-revert) or [git reset](https://git-scm.com/docs/git-reset).
A valid branch could be ${wordsList(validBranches.map(({name}) => `\`${name}\``))}. A valid branch could be ${wordsList(validBranches.map(({name}) => `\`${name}\``))}.
See the [workflow configuration documentation](${linkify('docs/usage/workflow-configuration.md')}) for more details.`, See the [workflow configuration documentation](${linkify('docs/usage/workflow-configuration.md')}) for more details.`,
}), }),
EINVALIDMAINTENANCEMERGE: ({nextRelease, branch}) => ({ EINVALIDMAINTENANCEMERGE: ({nextRelease: {channel, gitTag, version}, branch: {mergeRange, name}}) => ({
message: `The release \`${nextRelease.version}\` on branch \`${ message: `The release \`${version}\` on branch \`${name}\` cannot be published as it is out of range.`,
branch.name details: `Only releases within the range \`${mergeRange}\` can be merged into the maintenance branch \`${name}\` and published to the \`${channel}\` distribution channel.
}\` cannot be published as it is out of range.`,
details: `Only releases within the range \`${branch['merge-range']}\` can be merged into the maintenance branch \`${
branch.name
}\` and published to the \`${nextRelease.channel}\` distribution channel.
The branch \`${ The branch \`${name}\` head should be [reset](https://git-scm.com/docs/git-reset) to a previous commit so the commit with tag \`${gitTag}\` is removed from the branch history.
branch.name
}\` head should be [reset](https://git-scm.com/docs/git-reset) to a previous commit so the commit with tag \`${
nextRelease.gitTag
}\` is removed from the branch history.
See the [workflow configuration documentation](${linkify('docs/usage/workflow-configuration.md')}) for more details.`, See the [workflow configuration documentation](${linkify('docs/usage/workflow-configuration.md')}) for more details.`,
}), }),

View File

@ -34,7 +34,7 @@ module.exports = context => {
({channel, version}) => ({channel, version}) =>
channel === higherBranch.channel && channel === higherBranch.channel &&
channel !== branch.channel && channel !== branch.channel &&
(branch.type !== 'maintenance' || semver.gte(version, getLowerBound(branch['merge-range']))) (branch.type !== 'maintenance' || semver.gte(version, getLowerBound(branch.mergeRange)))
) )
) )
// Find ones that are not released on the building branch channel // Find ones that are not released on the building branch channel

View File

@ -3,7 +3,12 @@ const AggregateError = require('aggregate-error');
const {isGitRepo, verifyTagName} = require('./git'); const {isGitRepo, verifyTagName} = require('./git');
const getError = require('./get-error'); const getError = require('./get-error');
module.exports = async ({cwd, env, options: {repositoryUrl, tagFormat, branches}}) => { module.exports = async context => {
const {
cwd,
env,
options: {repositoryUrl, tagFormat, branches},
} = context;
const errors = []; const errors = [];
if (!(await isGitRepo({cwd, env}))) { if (!(await isGitRepo({cwd, env}))) {
@ -14,14 +19,14 @@ module.exports = async ({cwd, env, options: {repositoryUrl, tagFormat, branches}
// Verify that compiling the `tagFormat` produce a valid Git tag // Verify that compiling the `tagFormat` produce a valid Git tag
if (!(await verifyTagName(template(tagFormat)({version: '0.0.0'})))) { if (!(await verifyTagName(template(tagFormat)({version: '0.0.0'})))) {
errors.push(getError('EINVALIDTAGFORMAT', {tagFormat})); errors.push(getError('EINVALIDTAGFORMAT', context));
} }
// Verify the `tagFormat` contains the variable `version` by compiling the `tagFormat` template // Verify the `tagFormat` contains the variable `version` by compiling the `tagFormat` template
// with a space as the `version` value and verify the result contains the space. // with a space as the `version` value and verify the result contains the space.
// The space is used as it's an invalid tag character, so it's guaranteed to no be present in the `tagFormat`. // The space is used as it's an invalid tag character, so it's guaranteed to no be present in the `tagFormat`.
if ((template(tagFormat)({version: ' '}).match(/ /g) || []).length !== 1) { if ((template(tagFormat)({version: ' '}).match(/ /g) || []).length !== 1) {
errors.push(getError('ETAGNOVERSION', {tagFormat})); errors.push(getError('ETAGNOVERSION', context));
} }
branches.forEach(branch => { branches.forEach(branch => {

View File

@ -7,16 +7,14 @@ test('Maintenance branches - initial state', t => {
const maintenance = [{name: '1.x', channel: '1.x', tags: []}, {name: '1.1.x', tags: []}, {name: '1.2.x', tags: []}]; const maintenance = [{name: '1.x', channel: '1.x', tags: []}, {name: '1.1.x', tags: []}, {name: '1.2.x', tags: []}];
const release = [{name: 'master', tags: []}]; const release = [{name: 'master', tags: []}];
t.deepEqual( t.deepEqual(
normalize normalize.maintenance({maintenance, release}).map(({type, name, range, accept, channel, mergeRange}) => ({
.maintenance({maintenance, release}) type,
.map(({type, name, range, accept, channel, 'merge-range': maintenanceRange}) => ({ name,
type, range,
name, accept,
range, channel,
accept, mergeRange,
channel, })),
'merge-range': maintenanceRange,
})),
[ [
{ {
type: 'maintenance', type: 'maintenance',
@ -24,7 +22,7 @@ test('Maintenance branches - initial state', t => {
range: '>=1.1.0 <1.0.0', range: '>=1.1.0 <1.0.0',
accept: [], accept: [],
channel: '1.1.x', channel: '1.1.x',
'merge-range': '>=1.1.0 <1.2.0', mergeRange: '>=1.1.0 <1.2.0',
}, },
{ {
type: 'maintenance', type: 'maintenance',
@ -32,7 +30,7 @@ test('Maintenance branches - initial state', t => {
range: '>=1.2.0 <1.0.0', range: '>=1.2.0 <1.0.0',
accept: [], accept: [],
channel: '1.2.x', channel: '1.2.x',
'merge-range': '>=1.2.0 <1.3.0', mergeRange: '>=1.2.0 <1.3.0',
}, },
{ {
type: 'maintenance', type: 'maintenance',
@ -40,7 +38,7 @@ test('Maintenance branches - initial state', t => {
range: '>=1.3.0 <1.0.0', range: '>=1.3.0 <1.0.0',
accept: [], accept: [],
channel: '1.x', channel: '1.x',
'merge-range': '>=1.3.0 <2.0.0', mergeRange: '>=1.3.0 <2.0.0',
}, },
] ]
); );
@ -63,13 +61,13 @@ test('Maintenance branches - cap range to first release present on default branc
t.deepEqual( t.deepEqual(
normalize normalize
.maintenance({maintenance, release}) .maintenance({maintenance, release})
.map(({type, name, range, accept, channel, 'merge-range': maintenanceRange}) => ({ .map(({type, name, range, accept, channel, mergeRange: maintenanceRange}) => ({
type, type,
name, name,
range, range,
accept, accept,
channel, channel,
'merge-range': maintenanceRange, mergeRange: maintenanceRange,
})), })),
[ [
{ {
@ -78,7 +76,7 @@ test('Maintenance branches - cap range to first release present on default branc
range: '>=1.1.1 <1.2.0', range: '>=1.1.1 <1.2.0',
accept: ['patch'], accept: ['patch'],
channel: 'name', channel: 'name',
'merge-range': '>=1.1.0 <1.2.0', mergeRange: '>=1.1.0 <1.2.0',
}, },
{ {
type: 'maintenance', type: 'maintenance',
@ -86,7 +84,7 @@ test('Maintenance branches - cap range to first release present on default branc
range: '>=1.2.1 <1.3.0', range: '>=1.2.1 <1.3.0',
accept: ['patch'], accept: ['patch'],
channel: '1.2.x', channel: '1.2.x',
'merge-range': '>=1.2.0 <1.3.0', mergeRange: '>=1.2.0 <1.3.0',
}, },
{ {
type: 'maintenance', type: 'maintenance',
@ -94,7 +92,7 @@ test('Maintenance branches - cap range to first release present on default branc
range: '>=1.5.0 <1.6.0', range: '>=1.5.0 <1.6.0',
accept: ['patch'], accept: ['patch'],
channel: '1.x', channel: '1.x',
'merge-range': '>=1.3.0 <2.0.0', mergeRange: '>=1.3.0 <2.0.0',
}, },
{ {
type: 'maintenance', type: 'maintenance',
@ -102,7 +100,7 @@ test('Maintenance branches - cap range to first release present on default branc
range: '>=2.0.0 <1.6.0', range: '>=2.0.0 <1.6.0',
accept: [], accept: [],
channel: '2.x.x', channel: '2.x.x',
'merge-range': '>=2.0.0 <3.0.0', mergeRange: '>=2.0.0 <3.0.0',
}, },
] ]
); );
@ -116,16 +114,14 @@ test('Maintenance branches - cap range to default branch last release if all rel
const release = [{name: 'master', tags: toTags(['1.0.0', '1.2.0', '1.3.0', '2.0.0'])}]; const release = [{name: 'master', tags: toTags(['1.0.0', '1.2.0', '1.3.0', '2.0.0'])}];
t.deepEqual( t.deepEqual(
normalize normalize.maintenance({maintenance, release}).map(({type, name, range, accept, channel, mergeRange}) => ({
.maintenance({maintenance, release}) type,
.map(({type, name, range, accept, channel, 'merge-range': maintenanceRange}) => ({ name,
type, range,
name, accept,
range, channel,
accept, mergeRange,
channel, })),
'merge-range': maintenanceRange,
})),
[ [
{ {
type: 'maintenance', type: 'maintenance',
@ -133,7 +129,7 @@ test('Maintenance branches - cap range to default branch last release if all rel
range: '>=1.3.0 <2.0.0', range: '>=1.3.0 <2.0.0',
accept: ['patch', 'minor'], accept: ['patch', 'minor'],
channel: '1.x', channel: '1.x',
'merge-range': '>=1.0.0 <2.0.0', mergeRange: '>=1.0.0 <2.0.0',
}, },
{ {
type: 'maintenance', type: 'maintenance',
@ -141,7 +137,7 @@ test('Maintenance branches - cap range to default branch last release if all rel
range: '>=2.0.0 <2.0.0', range: '>=2.0.0 <2.0.0',
accept: [], accept: [],
channel: '2.x.x', channel: '2.x.x',
'merge-range': '>=2.0.0 <3.0.0', mergeRange: '>=2.0.0 <3.0.0',
}, },
] ]
); );

View File

@ -7,7 +7,7 @@ test('Return versions merged from release to maintenance branch, excluding lower
name: '2.x', name: '2.x',
channel: '2.x', channel: '2.x',
type: 'maintenance', type: 'maintenance',
'merge-range': '>=2.0.0 <3.0.0', mergeRange: '>=2.0.0 <3.0.0',
tags: [ tags: [
{gitTag: 'v2.0.0@2.x', version: '2.0.0', channel: '2.x', gitHead: '111'}, {gitTag: 'v2.0.0@2.x', version: '2.0.0', channel: '2.x', gitHead: '111'},
{gitTag: 'v2.0.0', version: '2.0.0', gitHead: '111'}, {gitTag: 'v2.0.0', version: '2.0.0', gitHead: '111'},
@ -255,7 +255,7 @@ test('Exclude versions merged from release to maintenance branch if they have th
name: '2.x', name: '2.x',
channel: 'latest', channel: 'latest',
type: 'maintenance', type: 'maintenance',
'merge-range': '>=2.0.0 <3.0.0', mergeRange: '>=2.0.0 <3.0.0',
tags: [ tags: [
{gitTag: 'v2.0.0', version: '2.0.0', gitHead: '111'}, {gitTag: 'v2.0.0', version: '2.0.0', gitHead: '111'},
{gitTag: 'v2.0.0', version: '2.0.0', gitHead: '111'}, {gitTag: 'v2.0.0', version: '2.0.0', gitHead: '111'},