Skip to content

Commit 6fc7287

Browse files
committed
feat(ng-dev): add support for verifying merge-mode reset before caretaker handoff
1 parent 0dfcbec commit 6fc7287

File tree

3 files changed

+53
-8
lines changed

3 files changed

+53
-8
lines changed

ng-dev/caretaker/handoff/cli.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,10 @@
77
*/
88

99
import {Argv, CommandModule} from 'yargs';
10-
1110
import {addGithubTokenOption} from '../../utils/git/github-yargs.js';
12-
1311
import {updateCaretakerTeamViaPrompt} from './update-github-team.js';
14-
15-
export interface CaretakerHandoffOptions {}
12+
import {assertValidGithubConfig, getConfig} from '../../utils/config.js';
13+
import {verifyMergeMode} from './verify-merge-mode.js';
1614

1715
/** Builds the command. */
1816
function builder(argv: Argv) {
@@ -21,11 +19,15 @@ function builder(argv: Argv) {
2119

2220
/** Handles the command. */
2321
async function handler() {
22+
const {mergeMode} = (await getConfig([assertValidGithubConfig])).github;
23+
if (!(await verifyMergeMode(mergeMode))) {
24+
return;
25+
}
2426
await updateCaretakerTeamViaPrompt();
2527
}
2628

2729
/** yargs command module for assisting in handing off caretaker. */
28-
export const HandoffModule: CommandModule<{}, CaretakerHandoffOptions> = {
30+
export const HandoffModule: CommandModule<{}, {}> = {
2931
handler,
3032
builder,
3133
command: 'handoff',

ng-dev/caretaker/handoff/update-github-team.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ export async function updateCaretakerTeamViaPrompt() {
2222
const config = await getConfig([assertValidCaretakerConfig, assertValidGithubConfig]);
2323
/** The github team name for the caretaker group. */
2424
const caretakerGroup = `${config.github.name}-caretaker`;
25+
/** The github team name for the group containing the repository releaser. */
26+
const releaserGroup = `${config.github.name}-releaser`;
2527
/** The github team name for the group containing all possible caretakers. */
2628
const caretakerGroupRoster = `${config.github.name}-caretaker-roster`;
2729
/** The github team name for the group containing all possible emea caretakers. */
@@ -74,7 +76,8 @@ export async function updateCaretakerTeamViaPrompt() {
7476
}
7577

7678
try {
77-
await setCaretakerGroup(caretakerGroup, Array.from(selected));
79+
await setGithubTeam(caretakerGroup, Array.from(selected));
80+
await setGithubTeam(releaserGroup, Array.from(selected));
7881
} catch {
7982
return Log.error(' ✘ Failed to update caretaker group.');
8083
}
@@ -98,7 +101,7 @@ async function getGroupMembers(group: string) {
98101
}
99102
}
100103

101-
async function setCaretakerGroup(group: string, members: string[]) {
104+
async function setGithubTeam(group: string, members: string[]) {
102105
/** The authenticated GitClient instance. */
103106
const git = await AuthenticatedGitClient.get();
104107
/** The full name of the group <org>/<group name>. */
@@ -127,7 +130,7 @@ async function setCaretakerGroup(group: string, members: string[]) {
127130
});
128131
};
129132

130-
Log.debug(`Caretaker Group: ${fullSlug}`);
133+
Log.debug(`Github Team: ${fullSlug}`);
131134
Log.debug(`Current Membership: ${current.join(', ')}`);
132135
Log.debug(`New Membership: ${members.join(', ')}`);
133136
Log.debug(`Removed: ${removed.join(', ')}`);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/**
2+
* @license
3+
* Copyright Google LLC
4+
*
5+
* Use of this source code is governed by an MIT-style license that can be
6+
* found in the LICENSE file at https://angular.io/license
7+
*/
8+
9+
import {RepositoryMergeModes} from '../../utils/config';
10+
import {bold, green, Log, red} from '../../utils/logging';
11+
import {Prompt} from '../../utils/prompt';
12+
import {getCurrentMergeMode, setRepoMergeMode} from '../../utils/git/repository-merge-mode';
13+
14+
export async function verifyMergeMode(expectedMode: RepositoryMergeModes): Promise<boolean> {
15+
const mode = await getCurrentMergeMode();
16+
if (mode === expectedMode) {
17+
return true;
18+
}
19+
20+
Log.info(`The repository merge-mode is currently ${bold(mode)} and must be reset before handoff`);
21+
if (
22+
await Prompt.confirm({
23+
message: `Would you like to reset this to ${expectedMode}`,
24+
default: true,
25+
})
26+
) {
27+
try {
28+
await setRepoMergeMode(expectedMode);
29+
Log.info(`${green('✔')} Successfuly set merge-mode to ${expectedMode}`);
30+
return true;
31+
} catch (err) {
32+
Log.info(`${red('✘')} Failed to update merge-mode`);
33+
Log.info(err);
34+
return false;
35+
}
36+
}
37+
// User chose not to reset merge-mode
38+
Log.info('Aborting...');
39+
return false;
40+
}

0 commit comments

Comments
 (0)