72 lines
2.2 KiB
JavaScript
72 lines
2.2 KiB
JavaScript
import lodash from 'lodash'
|
|
const {isString, isRegExp} = lodash
|
|
import AggregateError from 'aggregate-error';
|
|
import pEachSeries from 'p-each-series';
|
|
import DEFINITIONS from '../definitions/branches.js';
|
|
import getError from '../get-error.js';
|
|
import {fetch, fetchNotes, verifyBranchName} from '../git.js';
|
|
import expand from './expand.js';
|
|
import getTags from './get-tags.js';
|
|
import normalize from './normalize.js';
|
|
|
|
export default async (repositoryUrl, ciBranch, context) => {
|
|
const {cwd, env} = context;
|
|
|
|
const remoteBranches = await expand(
|
|
repositoryUrl,
|
|
context,
|
|
context.options.branches.map((branch) => (isString(branch) || isRegExp(branch) ? {name: branch} : branch))
|
|
);
|
|
|
|
await pEachSeries(remoteBranches, async ({name}) => {
|
|
await fetch(repositoryUrl, name, ciBranch, {cwd, env});
|
|
});
|
|
|
|
await fetchNotes(repositoryUrl, {cwd, env});
|
|
|
|
const branches = await getTags(context, remoteBranches);
|
|
|
|
const errors = [];
|
|
const branchesByType = Object.entries(DEFINITIONS).reduce(
|
|
(branchesByType, [type, {filter}]) => ({[type]: branches.filter(filter), ...branchesByType}),
|
|
{}
|
|
);
|
|
|
|
const result = Object.entries(DEFINITIONS).reduce((result, [type, {branchesValidator, branchValidator}]) => {
|
|
branchesByType[type].forEach((branch) => {
|
|
if (branchValidator && !branchValidator(branch)) {
|
|
errors.push(getError(`E${type.toUpperCase()}BRANCH`, {branch}));
|
|
}
|
|
});
|
|
|
|
const branchesOfType = normalize[type](branchesByType);
|
|
|
|
if (!branchesValidator(branchesOfType)) {
|
|
errors.push(getError(`E${type.toUpperCase()}BRANCHES`, {branches: branchesOfType}));
|
|
}
|
|
|
|
return {...result, [type]: branchesOfType};
|
|
}, {});
|
|
|
|
const duplicates = [...branches]
|
|
.map((branch) => branch.name)
|
|
.sort()
|
|
.filter((_, idx, array) => array[idx] === array[idx + 1] && array[idx] !== array[idx - 1]);
|
|
|
|
if (duplicates.length > 0) {
|
|
errors.push(getError('EDUPLICATEBRANCHES', {duplicates}));
|
|
}
|
|
|
|
await pEachSeries(branches, async (branch) => {
|
|
if (!(await verifyBranchName(branch.name))) {
|
|
errors.push(getError('EINVALIDBRANCHNAME', branch));
|
|
}
|
|
});
|
|
|
|
if (errors.length > 0) {
|
|
throw new AggregateError(errors);
|
|
}
|
|
|
|
return [...result.maintenance, ...result.release, ...result.prerelease];
|
|
};
|