Support changelogs for groups (#257)

Closes #202 

* Externalise hbs templates

* Fix tests

* Move templates

* lint fix

* Pass all upgrades to ensurePr

* Group changelogs

* Fix lint

* Fix tests
This commit is contained in:
Rhys Arkins 2017-06-05 10:21:02 +02:00 committed by GitHub
parent 6df68a260c
commit d234a0d9dd
3 changed files with 38 additions and 24 deletions

View file

@ -257,7 +257,7 @@ async function updateBranch(upgrades) {
} }
const branchCreated = await branchWorker.ensureBranch(upgrades); const branchCreated = await branchWorker.ensureBranch(upgrades);
if (branchCreated) { if (branchCreated) {
const pr = await prWorker.ensurePr(upgrade0); const pr = await prWorker.ensurePr(upgrades);
if (pr) { if (pr) {
await prWorker.checkAutoMerge(pr, upgrade0); await prWorker.checkAutoMerge(pr, upgrade0);
} }

View file

@ -8,7 +8,9 @@ module.exports = {
}; };
// Ensures that PR exists with matching title/body // Ensures that PR exists with matching title/body
async function ensurePr(upgradeConfig) { async function ensurePr(upgrades) {
logger.debug(`ensurePr(${JSON.stringify(upgrades)})`);
const upgradeConfig = upgrades[0];
const config = Object.assign({}, upgradeConfig); const config = Object.assign({}, upgradeConfig);
logger.debug('Ensuring PR'); logger.debug('Ensuring PR');
@ -33,11 +35,23 @@ async function ensurePr(upgradeConfig) {
} }
// Get changelog and then generate template strings // Get changelog and then generate template strings
config.changelog = await getChangeLog( config.changelogs = [];
config.depName, for (const upgrade of upgrades) {
config.changeLogFromVersion, let log = await getChangeLog(
config.changeLogToVersion upgrade.depName,
); upgrade.changeLogFromVersion,
upgrade.changeLogToVersion
);
if (!(log && log.length)) {
log = 'No changelog available';
}
config.changelogs.push({
depName: upgrade.depName,
log,
});
}
// Configure changelog for backwards compatibility
config.changelog = config.changelogs[0].log;
const prTitle = handlebars.compile(config.prTitle)(config); const prTitle = handlebars.compile(config.prTitle)(config);
const prBody = handlebars.compile(config.prBody)(config); const prBody = handlebars.compile(config.prBody)(config);

View file

@ -70,7 +70,7 @@ describe('workers/pr', () => {
expect(config.api.mergePr.mock.calls.length).toBe(0); expect(config.api.mergePr.mock.calls.length).toBe(0);
}); });
}); });
describe('ensurePr(config)', () => { describe('ensurePr(upgrades)', () => {
let config; let config;
let existingPr; let existingPr;
beforeEach(() => { beforeEach(() => {
@ -81,7 +81,7 @@ describe('workers/pr', () => {
existingPr = { existingPr = {
title: 'Update dependency dummy to version 1.1.0', title: 'Update dependency dummy to version 1.1.0',
body: body:
'This Pull Request updates dependency dummy from version `1.0.0` to `1.1.0`\n\n', 'This Pull Request updates dependency dummy from version `1.0.0` to `1.1.0`\n\nNo changelog available',
displayNumber: 'Existing PR', displayNumber: 'Existing PR',
}; };
}); });
@ -89,45 +89,45 @@ describe('workers/pr', () => {
config.api.getBranchPr = jest.fn(() => { config.api.getBranchPr = jest.fn(() => {
throw new Error('oops'); throw new Error('oops');
}); });
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
expect(pr).toBe(null); expect(pr).toBe(null);
}); });
it('should return null if waiting for success', async () => { it('should return null if waiting for success', async () => {
config.api.getBranchStatus = jest.fn(() => 'failed'); config.api.getBranchStatus = jest.fn(() => 'failed');
config.prCreation = 'status-success'; config.prCreation = 'status-success';
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
expect(pr).toBe(null); expect(pr).toBe(null);
}); });
it('should create PR if success', async () => { it('should create PR if success', async () => {
config.api.getBranchStatus = jest.fn(() => 'success'); config.api.getBranchStatus = jest.fn(() => 'success');
config.api.getBranchPr = jest.fn(); config.api.getBranchPr = jest.fn();
config.prCreation = 'status-success'; config.prCreation = 'status-success';
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
expect(pr).toMatchObject({ displayNumber: 'New Pull Request' }); expect(pr).toMatchObject({ displayNumber: 'New Pull Request' });
}); });
it('should return null if waiting for not pending', async () => { it('should return null if waiting for not pending', async () => {
config.api.getBranchStatus = jest.fn(() => 'pending'); config.api.getBranchStatus = jest.fn(() => 'pending');
config.prCreation = 'not-pending'; config.prCreation = 'not-pending';
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
expect(pr).toBe(null); expect(pr).toBe(null);
}); });
it('should create PR if no longer pending', async () => { it('should create PR if no longer pending', async () => {
config.api.getBranchStatus = jest.fn(() => 'failed'); config.api.getBranchStatus = jest.fn(() => 'failed');
config.api.getBranchPr = jest.fn(); config.api.getBranchPr = jest.fn();
config.prCreation = 'not-pending'; config.prCreation = 'not-pending';
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
expect(pr).toMatchObject({ displayNumber: 'New Pull Request' }); expect(pr).toMatchObject({ displayNumber: 'New Pull Request' });
}); });
it('should create new branch if none exists', async () => { it('should create new branch if none exists', async () => {
config.api.getBranchPr = jest.fn(); config.api.getBranchPr = jest.fn();
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
expect(pr).toMatchObject({ displayNumber: 'New Pull Request' }); expect(pr).toMatchObject({ displayNumber: 'New Pull Request' });
}); });
it('should add labels to new PR', async () => { it('should add labels to new PR', async () => {
config.api.getBranchPr = jest.fn(); config.api.getBranchPr = jest.fn();
config.api.addLabels = jest.fn(); config.api.addLabels = jest.fn();
config.labels = ['foo']; config.labels = ['foo'];
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
expect(pr).toMatchObject({ displayNumber: 'New Pull Request' }); expect(pr).toMatchObject({ displayNumber: 'New Pull Request' });
expect(config.api.addLabels.mock.calls.length).toBe(1); expect(config.api.addLabels.mock.calls.length).toBe(1);
}); });
@ -135,7 +135,7 @@ describe('workers/pr', () => {
config.api.getBranchPr = jest.fn(); config.api.getBranchPr = jest.fn();
config.api.addLabels = jest.fn(); config.api.addLabels = jest.fn();
config.labels = []; config.labels = [];
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
expect(pr).toMatchObject({ displayNumber: 'New Pull Request' }); expect(pr).toMatchObject({ displayNumber: 'New Pull Request' });
expect(config.api.addLabels.mock.calls.length).toBe(0); expect(config.api.addLabels.mock.calls.length).toBe(0);
}); });
@ -145,7 +145,7 @@ describe('workers/pr', () => {
config.api.addReviewers = jest.fn(); config.api.addReviewers = jest.fn();
config.assignees = ['bar']; config.assignees = ['bar'];
config.reviewers = ['baz']; config.reviewers = ['baz'];
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
expect(pr).toMatchObject({ displayNumber: 'New Pull Request' }); expect(pr).toMatchObject({ displayNumber: 'New Pull Request' });
expect(config.api.addAssignees.mock.calls.length).toBe(1); expect(config.api.addAssignees.mock.calls.length).toBe(1);
expect(config.api.addReviewers.mock.calls.length).toBe(1); expect(config.api.addReviewers.mock.calls.length).toBe(1);
@ -157,7 +157,7 @@ describe('workers/pr', () => {
config.assignees = ['bar']; config.assignees = ['bar'];
config.reviewers = ['baz']; config.reviewers = ['baz'];
config.automerge = 'any'; config.automerge = 'any';
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
expect(pr).toMatchObject({ displayNumber: 'New Pull Request' }); expect(pr).toMatchObject({ displayNumber: 'New Pull Request' });
expect(config.api.addAssignees.mock.calls.length).toBe(0); expect(config.api.addAssignees.mock.calls.length).toBe(0);
expect(config.api.addReviewers.mock.calls.length).toBe(0); expect(config.api.addReviewers.mock.calls.length).toBe(0);
@ -170,7 +170,7 @@ describe('workers/pr', () => {
config.reviewers = ['baz']; config.reviewers = ['baz'];
config.upgradeType = 'minor'; config.upgradeType = 'minor';
config.automerge = 'minor'; config.automerge = 'minor';
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
expect(pr).toMatchObject({ displayNumber: 'New Pull Request' }); expect(pr).toMatchObject({ displayNumber: 'New Pull Request' });
expect(config.api.addAssignees.mock.calls.length).toBe(0); expect(config.api.addAssignees.mock.calls.length).toBe(0);
expect(config.api.addReviewers.mock.calls.length).toBe(0); expect(config.api.addReviewers.mock.calls.length).toBe(0);
@ -183,7 +183,7 @@ describe('workers/pr', () => {
config.reviewers = ['baz']; config.reviewers = ['baz'];
config.upgradeType = 'major'; config.upgradeType = 'major';
config.automerge = 'minor'; config.automerge = 'minor';
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
expect(pr).toMatchObject({ displayNumber: 'New Pull Request' }); expect(pr).toMatchObject({ displayNumber: 'New Pull Request' });
expect(config.api.addAssignees.mock.calls.length).toBe(1); expect(config.api.addAssignees.mock.calls.length).toBe(1);
expect(config.api.addReviewers.mock.calls.length).toBe(1); expect(config.api.addReviewers.mock.calls.length).toBe(1);
@ -194,7 +194,7 @@ describe('workers/pr', () => {
config.newVersion = '1.1.0'; config.newVersion = '1.1.0';
config.api.getBranchPr = jest.fn(() => existingPr); config.api.getBranchPr = jest.fn(() => existingPr);
config.api.updatePr = jest.fn(); config.api.updatePr = jest.fn();
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
expect(pr).toMatchObject(existingPr); expect(pr).toMatchObject(existingPr);
}); });
it('should return modified existing PR', async () => { it('should return modified existing PR', async () => {
@ -203,10 +203,10 @@ describe('workers/pr', () => {
config.newVersion = '1.2.0'; config.newVersion = '1.2.0';
config.api.getBranchPr = jest.fn(() => existingPr); config.api.getBranchPr = jest.fn(() => existingPr);
config.api.updatePr = jest.fn(); config.api.updatePr = jest.fn();
const pr = await prWorker.ensurePr(config); const pr = await prWorker.ensurePr([config]);
const updatedPr = Object.assign(existingPr, { const updatedPr = Object.assign(existingPr, {
body: body:
'This Pull Request updates dependency dummy from version `1.0.0` to `1.2.0`\n\n', 'This Pull Request updates dependency dummy from version `1.0.0` to `1.2.0`\n\nNo changelog available',
}); });
expect(pr).toMatchObject(updatedPr); expect(pr).toMatchObject(updatedPr);
}); });