fix: do not call addChannelfor 2 merged branches configured with the same channel

This commit is contained in:
Pierre Vanduynslager 2018-12-18 01:53:09 -05:00
parent 390e966341
commit 4aad9cd490
6 changed files with 104 additions and 15 deletions

View File

@ -20,12 +20,12 @@ The type of the branch is automatically determined based on naming convention an
## Branches properties ## Branches properties
| Property | Branch type | Description | Default | | Property | Branch type | Description | Default |
|--------------|-------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------| |--------------|-------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------|
| `name` | All | **Required.** The Git branch holding the commits to analyze and the code to release. See [name](#name). | - The value itself if defined as a `String` or the matching branches name if defined as a glob. | | `name` | All | **Required.** The Git branch holding the commits to analyze and the code to release. See [name](#name). | - The value itself if defined as a `String` or the matching branches name if defined as a glob. |
| `channel` | All | The distribution channel on which to publish releases from this branch. See [channel](#channel). | `undefined` for the first release branch, the value of `name` for subsequent ones. | | `channel` | All | The distribution channel on which to publish releases from this branch. Set to `false` to force the default distribution channel instead of using the default. See [channel](#channel). | `undefined` for the first release branch, the value of `name` for subsequent ones. |
| `range` | [maintenance](#maintenance-branches) only | **Required unless `name` is formatted like `N.N.x` or `N.x` (`N` is a number).** The range of [semantic versions](https://semver.org) to support on this branch. See [range](#range). | The value of `name`. | | `range` | [maintenance](#maintenance-branches) only | **Required unless `name` is formatted like `N.N.x` or `N.x` (`N` is a number).** The range of [semantic versions](https://semver.org) to support on this branch. See [range](#range). | The value of `name`. |
| `prerelease` | [pre-release](#pre-release-branches) only | **Required.** The pre-release detonation to append to [semantic versions](https://semver.org) released from this branch. See [prerelease](#prerelease). | - | | `prerelease` | [pre-release](#pre-release-branches) only | **Required.** The pre-release detonation to append to [semantic versions](https://semver.org) released from this branch. See [prerelease](#prerelease). | - |
### name ### name

View File

@ -1,4 +1,4 @@
const {sortBy} = require('lodash'); const {sortBy, isNil} = require('lodash');
const semver = require('semver'); const semver = require('semver');
const semverDiff = require('semver-diff'); const semverDiff = require('semver-diff');
const {FIRST_RELEASE, RELEASE_TYPE} = require('../definitions/constants'); const {FIRST_RELEASE, RELEASE_TYPE} = require('../definitions/constants');
@ -20,7 +20,7 @@ function maintenance({maintenance, release}) {
...rest, ...rest,
name, name,
range: range || name, range: range || name,
channel: channel || name, channel: isNil(channel) ? name : channel,
})), })),
'range' 'range'
).map(({name, range, tags, ...rest}, idx, branches) => { ).map(({name, range, tags, ...rest}, idx, branches) => {
@ -83,7 +83,7 @@ function release({release}) {
const diff = bound ? semverDiff(min, bound) : null; const diff = bound ? semverDiff(min, bound) : null;
return { return {
...rest, ...rest,
channel: idx === 0 ? channel : channel || name, channel: idx === 0 ? channel : isNil(channel) ? name : channel,
tags, tags,
type: 'release', type: 'release',
name, name,
@ -98,7 +98,7 @@ function prerelease({prerelease}) {
const preid = prerelease === true ? name : prerelease; const preid = prerelease === true ? name : prerelease;
return { return {
...rest, ...rest,
channel: channel || name, channel: isNil(channel) ? name : channel,
type: 'prerelease', type: 'prerelease',
name, name,
prerelease: preid, prerelease: preid,

View File

@ -33,6 +33,7 @@ module.exports = context => {
branch.tags.filter( branch.tags.filter(
({channel, version}) => ({channel, version}) =>
channel === higherBranch.channel && channel === higherBranch.channel &&
channel !== branch.channel &&
(branch.type !== 'maintenance' || semver.gte(version, getLowerBound(branch['merge-range']))) (branch.type !== 'maintenance' || semver.gte(version, getLowerBound(branch['merge-range'])))
) )
) )

View File

@ -4,7 +4,7 @@ import normalize from '../../lib/branches/normalize';
const toTags = versions => versions.map(version => ({version})); const toTags = versions => versions.map(version => ({version}));
test('Maintenance branches - initial state', t => { test('Maintenance branches - initial state', t => {
const maintenance = [{name: '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
@ -148,7 +148,11 @@ test('Maintenance branches - cap range to default branch last release if all rel
}); });
test('Release branches - initial state', t => { test('Release branches - initial state', t => {
const release = [{name: 'master', tags: []}, {name: 'next', tags: []}, {name: 'next-major', tags: []}]; const release = [
{name: 'master', tags: []},
{name: 'next', channel: 'next', tags: []},
{name: 'next-major', tags: []},
];
t.deepEqual( t.deepEqual(
normalize.release({release}).map(({type, name, range, accept, channel}) => ({type, name, range, accept, channel})), normalize.release({release}).map(({type, name, range, accept, channel}) => ({type, name, range, accept, channel})),
@ -298,10 +302,29 @@ test('Release branches - limit releases on 2nd and 3rd branche based on 1st bran
}); });
test('Prerelease branches', t => { test('Prerelease branches', t => {
const prerelease = [{name: 'beta', prerelease: true, tags: []}, {name: 'alpha', prerelease: 'preview', tags: []}]; const prerelease = [
{name: 'beta', channel: 'beta', prerelease: true, tags: []},
{name: 'alpha', prerelease: 'preview', tags: []},
];
t.deepEqual(normalize.prerelease({prerelease}).map(({type, name, channel}) => ({type, name, channel})), [ t.deepEqual(normalize.prerelease({prerelease}).map(({type, name, channel}) => ({type, name, channel})), [
{type: 'prerelease', name: 'beta', channel: 'beta'}, {type: 'prerelease', name: 'beta', channel: 'beta'},
{type: 'prerelease', name: 'alpha', channel: 'alpha'}, {type: 'prerelease', name: 'alpha', channel: 'alpha'},
]); ]);
}); });
test('Allow to set channel to "false" to prevent default', t => {
const maintenance = [{name: '1.x', channel: false, tags: []}];
const release = [{name: 'master', channel: false, tags: []}, {name: 'next', channel: false, tags: []}];
const prerelease = [{name: 'beta', channel: false, prerelease: true, tags: []}];
t.deepEqual(normalize.maintenance({maintenance, release}).map(({name, channel}) => ({name, channel})), [
{name: '1.x', channel: false},
]);
t.deepEqual(normalize.release({release}).map(({name, channel}) => ({name, channel})), [
{name: 'master', channel: false},
{name: 'next', channel: false},
]);
t.deepEqual(normalize.prerelease({prerelease}).map(({name, channel}) => ({name, channel})), [
{name: 'beta', channel: false},
]);
});

View File

@ -63,7 +63,7 @@ test('Return versions merged from release to maintenance branch, excluding lower
]); ]);
}); });
test('Return versions merged from future branch to release branch', t => { test('Return versions merged between release branches', t => {
const result = getReleasesToAdd({ const result = getReleasesToAdd({
branch: { branch: {
name: 'master', name: 'master',
@ -177,7 +177,7 @@ test('Return releases sorted by ascending order', t => {
]); ]);
}); });
test('no lastRelease', t => { test('No lastRelease', t => {
const result = getReleasesToAdd({ const result = getReleasesToAdd({
branch: {name: 'master', tags: [{gitTag: 'v1.0.0@next', version: '1.0.0', channel: 'next', gitHead: '111'}]}, branch: {name: 'master', tags: [{gitTag: 'v1.0.0@next', version: '1.0.0', channel: 'next', gitHead: '111'}]},
branches: [{name: 'master'}, {name: 'next', channel: 'next'}], branches: [{name: 'master'}, {name: 'next', channel: 'next'}],
@ -248,3 +248,66 @@ test('Ignore pre-release versions', t => {
}, },
]); ]);
}); });
test('Exclude versions merged from release to maintenance branch if they have the same "channel"', t => {
const result = getReleasesToAdd({
branch: {
name: '2.x',
channel: 'latest',
type: 'maintenance',
'merge-range': '>=2.0.0 <3.0.0',
tags: [
{gitTag: 'v2.0.0', version: '2.0.0', gitHead: '111'},
{gitTag: 'v2.0.0', version: '2.0.0', gitHead: '111'},
{gitTag: 'v2.1.0', version: '2.1.0', gitHead: '222'},
{gitTag: 'v2.1.1', version: '2.1.1', gitHead: '333'},
{gitTag: 'v1.0.0', version: '1.0.0', gitHead: '444'},
{gitTag: 'v1.1.0', version: '1.1.0', gitHead: '555'},
],
},
branches: [{name: '2.x', channel: 'latest'}, {name: 'master', channel: 'latest'}],
options: {tagFormat: `v\${version}`},
});
t.deepEqual(result, []);
});
test('Exclude versions merged between release branches if they have the same "channel"', t => {
const result = getReleasesToAdd({
branch: {
name: 'master',
channel: 'latest',
tags: [
{gitTag: 'v1.0.0', channel: 'latest', version: '1.0.0', gitHead: '111'},
{gitTag: 'v1.1.0', channel: 'latest', version: '1.1.0', gitHead: '222'},
{gitTag: 'v2.0.0', channel: 'latest', version: '2.0.0', gitHead: '333'},
],
},
branches: [
{name: 'master', channel: 'latest'},
{name: 'next', channel: 'latest'},
{name: 'next-major', channel: 'latest'},
],
options: {tagFormat: `v\${version}`},
});
t.deepEqual(result, []);
});
test('Exclude versions merged between release branches if they all have "channel" set to "false"', t => {
const result = getReleasesToAdd({
branch: {
name: 'master',
channel: false,
tags: [
{gitTag: 'v1.0.0', version: '1.0.0', gitHead: '111'},
{gitTag: 'v1.1.0', version: '1.1.0', gitHead: '222'},
{gitTag: 'v2.0.0', version: '2.0.0', gitHead: '333'},
],
},
branches: [{name: 'master', channel: false}, {name: 'next', channel: false}, {name: 'next-major', channel: false}],
options: {tagFormat: `v\${version}`},
});
t.deepEqual(result, []);
});

View File

@ -173,6 +173,8 @@ test('getRange', t => {
test('makeTag', t => { test('makeTag', t => {
t.is(makeTag(`v\${version}`, '1.0.0'), 'v1.0.0'); t.is(makeTag(`v\${version}`, '1.0.0'), 'v1.0.0');
t.is(makeTag(`v\${version}`, '1.0.0', false), 'v1.0.0');
t.is(makeTag(`v\${version}`, '1.0.0', null), 'v1.0.0');
t.is(makeTag(`v\${version}`, '1.0.0', 'next'), 'v1.0.0@next'); t.is(makeTag(`v\${version}`, '1.0.0', 'next'), 'v1.0.0@next');
t.is(makeTag(`v\${version}@test`, '1.0.0', 'next'), 'v1.0.0@next@test'); t.is(makeTag(`v\${version}@test`, '1.0.0', 'next'), 'v1.0.0@next@test');
}); });