Skip to content

Commit

Permalink
refactor: branch worker handle existing PR
Browse files Browse the repository at this point in the history
  • Loading branch information
rarkins committed Apr 15, 2021
1 parent 14c5227 commit 227f9f7
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 97 deletions.
44 changes: 44 additions & 0 deletions lib/workers/branch/handle-existing.ts
@@ -0,0 +1,44 @@
import { getAdminConfig } from '../../config/admin';
import { logger } from '../../logger';
import { Pr, platform } from '../../platform';
import { PrState } from '../../types';
import { branchExists, deleteBranch } from '../../util/git';
import { BranchConfig } from '../types';

export async function handlepr(config: BranchConfig, pr: Pr): Promise<void> {
if (pr.state === PrState.Closed) {
let content;
if (config.updateType === 'major') {
content = `As this PR has been closed unmerged, Renovate will ignore this upgrade and you will not receive PRs for *any* future ${config.newMajor}.x releases. However, if you upgrade to ${config.newMajor}.x manually then Renovate will then reenable updates for minor and patch updates automatically.`;
} else if (config.updateType === 'digest') {
content = `As this PR has been closed unmerged, Renovate will ignore this upgrade updateType and you will not receive PRs for *any* future ${config.depName}:${config.currentValue} digest updates. Digest updates will resume if you update the specified tag at any time.`;
} else {
content = `As this PR has been closed unmerged, Renovate will now ignore this update (${config.newValue}). You will still receive a PR once a newer version is released, so if you wish to permanently ignore this dependency, please add it to the \`ignoreDeps\` array of your renovate config.`;
}
content +=
'\n\nIf this PR was closed by mistake or you changed your mind, you can simply rename this PR and you will soon get a fresh replacement PR opened.';
if (!config.suppressNotifications.includes('prIgnoreNotification')) {
const ignoreTopic = `Renovate Ignore Notification`;
if (getAdminConfig().dryRun) {
logger.info(
`DRY-RUN: Would ensure closed PR comment in PR #${pr.number}`
);
} else {
await platform.ensureComment({
number: pr.number,
topic: ignoreTopic,
content,
});
}
}
if (branchExists(config.branchName)) {
if (getAdminConfig().dryRun) {
logger.info('DRY-RUN: Would delete branch ' + config.branchName);
} else {
await deleteBranch(config.branchName);
}
}
} else if (pr.state === PrState.Merged) {
logger.debug({ pr: pr.number }, 'Merged PR is blocking this branch');
}
}
74 changes: 37 additions & 37 deletions lib/workers/branch/index.spec.ts
Expand Up @@ -111,7 +111,7 @@ describe(getName(__filename), () => {
it('skips branch if not scheduled and not updating out of schedule', async () => {
schedule.isScheduledNow.mockReturnValueOnce(false);
config.updateNotScheduled = false;
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
const res = await branchWorker.processBranch(config);
expect(res).toEqual(BranchResult.NotScheduled);
});
Expand All @@ -134,7 +134,7 @@ describe(getName(__filename), () => {
*/
] as never;

git.branchExists.mockReturnValueOnce(false);
git.branchExists.mockReturnValue(false);
const res = await branchWorker.processBranch(config);
expect(res).toEqual(BranchResult.Pending);
});
Expand All @@ -153,7 +153,7 @@ describe(getName(__filename), () => {
it('processes branch if not scheduled but updating out of schedule', async () => {
schedule.isScheduledNow.mockReturnValueOnce(false);
config.updateNotScheduled = true;
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
state: PrState.Open,
} as Pr);
Expand All @@ -163,7 +163,7 @@ describe(getName(__filename), () => {
});
it('skips branch if closed major PR found', async () => {
schedule.isScheduledNow.mockReturnValueOnce(false);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
config.updateType = 'major';
checkExisting.prAlreadyExisted.mockResolvedValueOnce({
number: 13,
Expand All @@ -174,7 +174,7 @@ describe(getName(__filename), () => {
});
it('skips branch if closed digest PR found', async () => {
schedule.isScheduledNow.mockReturnValueOnce(false);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
config.updateType = 'digest';
checkExisting.prAlreadyExisted.mockResolvedValueOnce({
number: 13,
Expand All @@ -185,7 +185,7 @@ describe(getName(__filename), () => {
});
it('skips branch if closed minor PR found', async () => {
schedule.isScheduledNow.mockReturnValueOnce(false);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
checkExisting.prAlreadyExisted.mockResolvedValueOnce({
number: 13,
state: PrState.Closed,
Expand All @@ -195,7 +195,7 @@ describe(getName(__filename), () => {
});
it('skips branch if merged PR found', async () => {
schedule.isScheduledNow.mockReturnValueOnce(false);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
checkExisting.prAlreadyExisted.mockResolvedValueOnce({
number: 13,
state: PrState.Merged,
Expand All @@ -205,7 +205,7 @@ describe(getName(__filename), () => {
});
it('throws error if closed PR found', async () => {
schedule.isScheduledNow.mockReturnValueOnce(false);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
state: PrState.Merged,
} as Pr);
Expand All @@ -216,7 +216,7 @@ describe(getName(__filename), () => {
});
it('does not skip branch if edited PR found with rebaseLabel', async () => {
schedule.isScheduledNow.mockReturnValueOnce(false);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
state: PrState.Open,
labels: ['rebase'],
Expand All @@ -227,7 +227,7 @@ describe(getName(__filename), () => {
});
it('skips branch if edited PR found', async () => {
schedule.isScheduledNow.mockReturnValueOnce(false);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
state: PrState.Open,
body: '**Rebasing**: something',
Expand All @@ -238,7 +238,7 @@ describe(getName(__filename), () => {
});
it('skips branch if target branch changed', async () => {
schedule.isScheduledNow.mockReturnValueOnce(false);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
state: PrState.Open,
targetBranch: 'v6',
Expand All @@ -249,21 +249,21 @@ describe(getName(__filename), () => {
expect(res).toEqual(BranchResult.PrEdited);
});
it('skips branch if branch edited and no PR found', async () => {
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
git.isBranchModified.mockResolvedValueOnce(true);
const res = await branchWorker.processBranch(config);
expect(res).toEqual(BranchResult.PrEdited);
});
it('continues branch if branch edited and but PR found', async () => {
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
git.isBranchModified.mockResolvedValueOnce(true);
git.getBranchCommit.mockReturnValueOnce('abc123');
platform.findPr.mockResolvedValueOnce({ sha: 'abc123' } as any);
const res = await branchWorker.processBranch(config);
expect(res).toEqual(BranchResult.Error);
});
it('skips branch if branch edited and and PR found with sha mismatch', async () => {
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
git.isBranchModified.mockResolvedValueOnce(true);
git.getBranchCommit.mockReturnValueOnce('abc123');
platform.findPr.mockResolvedValueOnce({ sha: 'def456' } as any);
Expand Down Expand Up @@ -324,7 +324,7 @@ describe(getName(__filename), () => {
artifactErrors: [],
updatedArtifacts: [],
});
git.branchExists.mockReturnValueOnce(false);
git.branchExists.mockReturnValue(false);
commit.commitFilesToBranch.mockResolvedValueOnce(null);
expect(await branchWorker.processBranch(config)).toEqual(
BranchResult.NoWork
Expand All @@ -338,7 +338,7 @@ describe(getName(__filename), () => {
artifactErrors: [],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
commit.commitFilesToBranch.mockResolvedValueOnce(null);
automerge.tryBranchAutomerge.mockResolvedValueOnce('automerged');
await branchWorker.processBranch(config);
Expand All @@ -354,7 +354,7 @@ describe(getName(__filename), () => {
artifactErrors: [],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(false);
git.branchExists.mockReturnValue(false);
automerge.tryBranchAutomerge.mockResolvedValueOnce('automerged');
await branchWorker.processBranch({
...config,
Expand All @@ -372,7 +372,7 @@ describe(getName(__filename), () => {
artifactErrors: [],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
commit.commitFilesToBranch.mockResolvedValueOnce(null);
automerge.tryBranchAutomerge.mockResolvedValueOnce('automerged');
setAdminConfig({ dryRun: true });
Expand All @@ -388,7 +388,7 @@ describe(getName(__filename), () => {
artifactErrors: [],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
commit.commitFilesToBranch.mockResolvedValueOnce(null);
automerge.tryBranchAutomerge.mockResolvedValueOnce('failed');
prWorker.ensurePr.mockResolvedValueOnce({
Expand All @@ -407,7 +407,7 @@ describe(getName(__filename), () => {
artifactErrors: [],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
commit.commitFilesToBranch.mockResolvedValueOnce(null);
automerge.tryBranchAutomerge.mockResolvedValueOnce('failed');
prWorker.ensurePr.mockResolvedValueOnce({
Expand Down Expand Up @@ -445,7 +445,7 @@ describe(getName(__filename), () => {
artifactErrors: [],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
automerge.tryBranchAutomerge.mockResolvedValueOnce('failed');
prWorker.ensurePr.mockResolvedValueOnce({
prResult: PrResult.Created,
Expand All @@ -466,7 +466,7 @@ describe(getName(__filename), () => {
artifactErrors: [{}],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
automerge.tryBranchAutomerge.mockResolvedValueOnce('failed');
prWorker.ensurePr.mockResolvedValueOnce({
prResult: PrResult.Created,
Expand All @@ -487,7 +487,7 @@ describe(getName(__filename), () => {
artifactErrors: [{}],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
automerge.tryBranchAutomerge.mockResolvedValueOnce('failed');
prWorker.ensurePr.mockResolvedValueOnce({
prResult: PrResult.Created,
Expand All @@ -509,7 +509,7 @@ describe(getName(__filename), () => {
artifactErrors: [{}],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
automerge.tryBranchAutomerge.mockResolvedValueOnce('failed');
prWorker.ensurePr.mockResolvedValueOnce({
prResult: PrResult.Created,
Expand All @@ -531,7 +531,7 @@ describe(getName(__filename), () => {
artifactErrors: [{}],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(false);
git.branchExists.mockReturnValue(false);
automerge.tryBranchAutomerge.mockResolvedValueOnce('failed');
prWorker.ensurePr.mockResolvedValueOnce({
prResult: PrResult.Created,
Expand All @@ -552,7 +552,7 @@ describe(getName(__filename), () => {
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
config.recreateClosed = true;
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
automerge.tryBranchAutomerge.mockResolvedValueOnce('failed');
prWorker.ensurePr.mockResolvedValueOnce({
prResult: PrResult.Created,
Expand Down Expand Up @@ -591,7 +591,7 @@ describe(getName(__filename), () => {
artifactErrors: [],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
automerge.tryBranchAutomerge.mockResolvedValueOnce('failed');
prWorker.ensurePr.mockImplementationOnce(() => {
throw new Error('some error');
Expand All @@ -601,7 +601,7 @@ describe(getName(__filename), () => {
});

it('closed pr (dry run)', async () => {
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
checkExisting.prAlreadyExisted.mockResolvedValueOnce({
state: PrState.Closed,
} as Pr);
Expand All @@ -612,7 +612,7 @@ describe(getName(__filename), () => {
});

it('branch pr no rebase (dry run)', async () => {
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
state: PrState.Open,
} as Pr);
Expand All @@ -632,7 +632,7 @@ describe(getName(__filename), () => {
artifactErrors: [],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
title: 'rebase!',
state: PrState.Open,
Expand Down Expand Up @@ -661,7 +661,7 @@ describe(getName(__filename), () => {
artifactErrors: [],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
title: 'rebase!',
state: PrState.Open,
Expand Down Expand Up @@ -692,7 +692,7 @@ describe(getName(__filename), () => {
artifactErrors: [],
updatedArtifacts: [{}],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
title: 'rebase!',
state: PrState.Open,
Expand Down Expand Up @@ -729,7 +729,7 @@ describe(getName(__filename), () => {
},
],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
title: 'rebase!',
state: PrState.Open,
Expand Down Expand Up @@ -809,7 +809,7 @@ describe(getName(__filename), () => {
},
],
} as never);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
title: 'rebase!',
state: PrState.Open,
Expand Down Expand Up @@ -879,7 +879,7 @@ describe(getName(__filename), () => {
},
],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
title: 'rebase!',
state: PrState.Open,
Expand Down Expand Up @@ -948,7 +948,7 @@ describe(getName(__filename), () => {
},
],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
title: 'rebase!',
state: PrState.Open,
Expand Down Expand Up @@ -1086,7 +1086,7 @@ describe(getName(__filename), () => {
},
],
} as WriteExistingFilesResult);
git.branchExists.mockReturnValueOnce(true);
git.branchExists.mockReturnValue(true);
platform.getBranchPr.mockResolvedValueOnce({
title: 'rebase!',
state: PrState.Open,
Expand Down

0 comments on commit 227f9f7

Please sign in to comment.