Skip to content

Commit 4744d0b

Browse files
fix: add default reviewers to manual backports (#274)
* fix: add default reviewers to manual backport * test: add test to updateManualBackport * fix: pass undefined user for manual backport * chore: remove .only and clean up imports * test: use const for context variable in updateManualbackport test --------- Co-authored-by: George Xu <[email protected]>
1 parent 2424034 commit 4744d0b

8 files changed

+138
-24
lines changed

spec/fixtures/backport_pull_request.closed.json

+6
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212
"head": {
1313
"ref": "123456789iuytdxcvbnjhfdriuyfedfgy54escghjnbg"
1414
},
15+
"base": {
16+
"ref": "main",
17+
"repo": {
18+
"default_branch": "main"
19+
}
20+
},
1521
"body": "Backport of #14\nSee that PR for details.\nNotes: <!-- One-line Change Summary Here-->",
1622
"created_at": "2018-11-01T17:29:51Z",
1723
"merged_at": "2018-11-01T17:30:11Z",

spec/fixtures/backport_pull_request.merged.json

+6
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212
"head": {
1313
"ref": "123456789iuytdxcvbnjhfdriuyfedfgy54escghjnbg"
1414
},
15+
"base": {
16+
"ref": "main",
17+
"repo": {
18+
"default_branch": "main"
19+
}
20+
},
1521
"body": "Backport of #14\nSee that PR for details.\nNotes: <!-- One-line Change Summary Here-->",
1622
"created_at": "2018-11-01T17:29:51Z",
1723
"merged_at": "2018-11-01T17:30:11Z",

spec/fixtures/backport_pull_request.opened.json

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"action": "opened",
55
"number": 7,
66
"pull_request": {
7+
"number": 7,
78
"url": "my_cool_url",
89
"title": "CHANGE README",
910
"merged": true,

spec/index.spec.ts

+12
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,12 @@ Notes: <!-- One-line Change Summary Here-->`,
392392
head: {
393393
ref: '123456789iuytdxcvbnjhfdriuyfedfgy54escghjnbg',
394394
},
395+
base: {
396+
ref: 'main',
397+
repo: {
398+
default_branch: 'main',
399+
},
400+
},
395401
labels: [
396402
{
397403
color: 'ededed',
@@ -429,6 +435,12 @@ Notes: <!-- One-line Change Summary Here-->`,
429435
head: {
430436
ref: '123456789iuytdxcvbnjhfdriuyfedfgy54escghjnbg',
431437
},
438+
base: {
439+
ref: 'main',
440+
repo: {
441+
default_branch: 'main',
442+
},
443+
},
432444
labels: [
433445
{
434446
color: 'ededed',

spec/operations.spec.ts

+66
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@ import * as fs from 'fs-extra';
33
import * as os from 'os';
44
import * as path from 'path';
55
import simpleGit from 'simple-git';
6+
7+
import { PRChange } from '../src/enums';
68
import { initRepo } from '../src/operations/init-repo';
79
import { setupRemotes } from '../src/operations/setup-remotes';
10+
import { updateManualBackport } from '../src/operations/update-manual-backport';
11+
import { tagBackportReviewers } from '../src/utils';
812

913
let dirObject: { dir?: string } | null = null;
1014

@@ -13,6 +17,22 @@ const saveDir = (o: { dir: string }) => {
1317
return o.dir;
1418
};
1519

20+
const backportPRClosedEvent = require('./fixtures/backport_pull_request.closed.json');
21+
const backportPRMergedEvent = require('./fixtures/backport_pull_request.merged.json');
22+
const backportPROpenedEvent = require('./fixtures/backport_pull_request.opened.json');
23+
24+
jest.mock('../src/utils', () => ({
25+
tagBackportReviewers: jest.fn().mockReturnValue(Promise.resolve()),
26+
isSemverMinorPR: jest.fn().mockReturnValue(false),
27+
}));
28+
29+
jest.mock('../src/utils/label-utils', () => ({
30+
labelExistsOnPR: jest.fn().mockResolvedValue(true),
31+
getSemverLabel: jest.fn().mockResolvedValue(false),
32+
addLabels: jest.fn(),
33+
removeLabel: jest.fn(),
34+
}));
35+
1636
describe('runner', () => {
1737
jest.setTimeout(30000);
1838
console.error = jest.fn();
@@ -101,4 +121,50 @@ describe('runner', () => {
101121
}
102122
});
103123
});
124+
125+
describe('updateManualBackport()', () => {
126+
const octokit = {
127+
pulls: {
128+
get: jest.fn().mockReturnValue(Promise.resolve({})),
129+
},
130+
issues: {
131+
createComment: jest.fn().mockReturnValue(Promise.resolve({})),
132+
listComments: jest.fn().mockReturnValue(Promise.resolve({ data: [] })),
133+
},
134+
};
135+
136+
it('tags reviewers on manual backport creation', async () => {
137+
const context = {
138+
...backportPROpenedEvent,
139+
octokit,
140+
repo: jest.fn(),
141+
};
142+
await updateManualBackport(context, PRChange.OPEN, 1234);
143+
expect(tagBackportReviewers).toHaveBeenCalled();
144+
expect(tagBackportReviewers).toHaveBeenCalledWith({
145+
context,
146+
targetPrNumber: 7,
147+
});
148+
});
149+
150+
it('does not tag reviewers on merged PRs', async () => {
151+
const context = {
152+
...backportPRMergedEvent,
153+
octokit,
154+
repo: jest.fn(),
155+
};
156+
await updateManualBackport(context, PRChange.MERGE, 1234);
157+
expect(tagBackportReviewers).not.toHaveBeenCalled();
158+
});
159+
160+
it('does not tag reviewers on closed PRs', async () => {
161+
const context = {
162+
...backportPRClosedEvent,
163+
octokit,
164+
repo: jest.fn(),
165+
};
166+
await updateManualBackport(context, PRChange.CLOSE, 1234);
167+
expect(tagBackportReviewers).not.toHaveBeenCalled();
168+
});
169+
});
104170
});

spec/queue.spec.ts

-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import * as sinon from 'sinon';
33

44
import { ExecutionQueue } from '../src/Queue';
55

6-
const noop = async () => {};
7-
86
const waitForEvent = (emitter: EventEmitter, event: string) => {
97
return new Promise<void>((resolve) => {
108
emitter.once(event, resolve);

src/operations/update-manual-backport.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import * as labelUtils from '../utils/label-utils';
2-
import { log } from '../utils/log-util';
3-
import { PRChange, PRStatus, LogLevel } from '../enums';
41
import {
52
BACKPORT_LABEL,
63
BACKPORT_REQUESTED_LABEL,
74
SKIP_CHECK_LABEL,
85
} from '../constants';
9-
import { isSemverMinorPR } from '../utils';
6+
import { PRChange, PRStatus, LogLevel } from '../enums';
107
import { WebHookPRContext } from '../types';
8+
import { isSemverMinorPR, tagBackportReviewers } from '../utils';
9+
import * as labelUtils from '../utils/label-utils';
10+
import { log } from '../utils/log-util';
1111

1212
/**
1313
* Updates the labels on a backport's original PR as well as comments with links
@@ -135,6 +135,12 @@ please check out #${pr.number}`;
135135
}),
136136
);
137137
}
138+
139+
// Tag default reviewers to manual backport
140+
await tagBackportReviewers({
141+
context,
142+
targetPrNumber: pr.number,
143+
});
138144
} else if (type === PRChange.MERGE) {
139145
log(
140146
'updateManualBackport',

src/utils.ts

+37-18
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,38 @@ const createBackportComment = async (
397397
return body;
398398
};
399399

400+
export const tagBackportReviewers = async ({
401+
context,
402+
targetPrNumber,
403+
user,
404+
}: {
405+
context: SimpleWebHookRepoContext;
406+
targetPrNumber: number;
407+
user?: string;
408+
}) => {
409+
const reviewers = [];
410+
411+
if (DEFAULT_BACKPORT_REVIEW_TEAM) {
412+
reviewers.push(DEFAULT_BACKPORT_REVIEW_TEAM);
413+
}
414+
415+
if (user) {
416+
const hasWrite = await checkUserHasWriteAccess(context, user);
417+
// Optionally request a default review team for backports.
418+
// If the PR author has write access, also request their review.
419+
if (hasWrite) reviewers.push(user);
420+
}
421+
422+
if (reviewers.length > 0) {
423+
await context.octokit.pulls.requestReviewers(
424+
context.repo({
425+
pull_number: targetPrNumber,
426+
reviewers,
427+
}),
428+
);
429+
}
430+
};
431+
400432
export const backportImpl = async (
401433
robot: Probot,
402434
context: SimpleWebHookRepoContext,
@@ -561,24 +593,11 @@ export const backportImpl = async (
561593
}),
562594
);
563595

564-
const reviewers = [];
565-
const hasWrite = await checkUserHasWriteAccess(context, pr.user.login);
566-
567-
// Optionally request a default review team for backports.
568-
// If the PR author has write access, also request their review.
569-
if (hasWrite) reviewers.push(pr.user.login);
570-
if (DEFAULT_BACKPORT_REVIEW_TEAM) {
571-
reviewers.push(DEFAULT_BACKPORT_REVIEW_TEAM);
572-
}
573-
574-
if (reviewers.length > 0) {
575-
await context.octokit.pulls.requestReviewers(
576-
context.repo({
577-
pull_number: newPr.number,
578-
reviewers,
579-
}),
580-
);
581-
}
596+
await tagBackportReviewers({
597+
context,
598+
targetPrNumber: newPr.number,
599+
user: pr.user.login,
600+
});
582601

583602
log(
584603
'backportImpl',

0 commit comments

Comments
 (0)