feat: gitlab branch cleanup (#1475)

Removes the GitHub-only check when cleaning/pruning branches.
This commit is contained in:
Rhys Arkins 2018-02-03 12:06:25 +01:00 committed by GitHub
parent aa0b0d68fd
commit 720b46696a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 64 additions and 16 deletions

View file

@ -68,7 +68,7 @@ async function getRepos(token, endpoint) {
}
function urlEscape(str) {
return str.replace(/\//g, '%2F');
return str ? str.replace(/\//g, '%2F') : str;
}
// Initialize GitLab by getting base branch
@ -170,9 +170,17 @@ async function branchExists(branchName) {
}
}
function getAllRenovateBranches() {
logger.warn('Unimplemented in GitLab: getAllRenovateBranches');
return [];
async function getAllRenovateBranches(branchPrefix) {
logger.debug(`getAllRenovateBranches(${branchPrefix})`);
const allBranches = await get(
`projects/${config.repository}/repository/branches`
);
return allBranches.body.reduce((arr, branch) => {
if (branch.name.startsWith(branchPrefix)) {
arr.push(branch.name);
}
return arr;
}, []);
}
function isBranchStale() {
@ -290,7 +298,22 @@ async function setBranchStatus(
await get.post(url, { body: options });
}
async function deleteBranch(branchName) {
async function deleteBranch(branchName, closePr = false) {
if (closePr) {
logger.debug('Closing PR');
const pr = await getBranchPr(branchName);
// istanbul ignore if
if (pr) {
await get.put(
`projects/${config.repository}/merge_requests/${pr.number}`,
{
body: {
state_event: 'close',
},
}
);
}
}
await get.delete(
`projects/${config.repository}/repository/branches/${urlEscape(branchName)}`
);

View file

@ -12,14 +12,12 @@ async function pruneStaleBranches(config) {
logger.debug('No branchList');
return;
}
if (config.platform !== 'github') {
// TODO: Implement for GitLab
logger.debug('Platform is not GitHub - returning');
return;
}
let renovateBranches = await platform.getAllRenovateBranches(
config.branchPrefix
);
if (!(renovateBranches && renovateBranches.length)) {
return;
}
logger.debug({ branchList, renovateBranches });
const lockFileBranch = `${config.branchPrefix}lock-file-maintenance`;
if (renovateBranches.includes(lockFileBranch)) {
@ -48,6 +46,7 @@ async function pruneStaleBranches(config) {
logger.info({ prNo: pr.number, prTitle: pr.title }, 'Autoclosing PR');
await platform.updatePr(pr.number, `${pr.title} - autoclosed`);
}
await platform.deleteBranch(branchName);
const closePr = true;
await platform.deleteBranch(branchName, closePr);
}
}

View file

@ -70,6 +70,13 @@ Array [
]
`;
exports[`platform/gitlab getAllRenovateBranches() should return all renovate branches 1`] = `
Array [
"renovate/a",
"renovate/b",
]
`;
exports[`platform/gitlab getBranchLastCommitTime should return a Date 1`] = `2012-09-20T08:50:22.000Z`;
exports[`platform/gitlab getBranchPr(branchName) should return null if no PR exists 1`] = `

View file

@ -219,8 +219,22 @@ describe('platform/gitlab', () => {
});
});
describe('getAllRenovateBranches()', () => {
it('exists', () => {
gitlab.getAllRenovateBranches();
it('should return all renovate branches', async () => {
get.mockImplementationOnce(() => ({
body: [
{
name: 'renovate/a',
},
{
name: 'master',
},
{
name: 'renovate/b',
},
],
}));
const res = await gitlab.getAllRenovateBranches('renovate/');
expect(res).toMatchSnapshot();
});
});
describe('isBranchStale()', () => {
@ -377,6 +391,12 @@ describe('platform/gitlab', () => {
await gitlab.deleteBranch('some-branch');
expect(get.delete.mock.calls.length).toBe(1);
});
it('should close PR', async () => {
get.delete = jest.fn();
get.mockReturnValueOnce({ body: [] }); // getBranchPr
await gitlab.deleteBranch('some-branch', true);
expect(get.delete.mock.calls.length).toBe(1);
});
});
describe('mergeBranch()', () => {
it('exists', () => {

View file

@ -16,11 +16,10 @@ describe('workers/repository/cleanup', () => {
await cleanup.pruneStaleBranches(config, config.branchList);
expect(platform.getAllRenovateBranches.mock.calls).toHaveLength(0);
});
it('returns if config is not github', async () => {
it('returns if no renovate branches', async () => {
config.branchList = [];
config.platform = 'gitlab';
platform.getAllRenovateBranches.mockReturnValueOnce([]);
await cleanup.pruneStaleBranches(config, config.branchList);
expect(platform.getAllRenovateBranches.mock.calls).toHaveLength(0);
});
it('returns if no remaining branches', async () => {
config.branchList = ['renovate/a', 'renovate/b'];