Skip to content

Commit e378cd5

Browse files
committed
feat(ng-dev): add support for verifying merge-mode reset before caretaker handoff
1 parent b81bb20 commit e378cd5

File tree

4 files changed

+62
-6
lines changed

4 files changed

+62
-6
lines changed

.github/local-actions/branch-manager/main.js

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

ng-dev/caretaker/handoff/cli.ts

Lines changed: 10 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 {assertValidCaretakerConfig, 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,18 @@ function builder(argv: Argv) {
2119

2220
/** Handles the command. */
2321
async function handler() {
22+
// TODO(josephperrott): require merge mode to be defined in all caretaker configs.
23+
const {
24+
caretaker: {repositoryMergeMode},
25+
} = await getConfig([assertValidCaretakerConfig]);
26+
if (repositoryMergeMode && !(await verifyMergeMode(repositoryMergeMode))) {
27+
return;
28+
}
2429
await updateCaretakerTeamViaPrompt();
2530
}
2631

2732
/** yargs command module for assisting in handing off caretaker. */
28-
export const HandoffModule: CommandModule<{}, CaretakerHandoffOptions> = {
33+
export const HandoffModule: CommandModule<{}, {}> = {
2934
handler,
3035
builder,
3136
command: 'handoff',
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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 {getRepoConfigValue} from '../config/get';
13+
import {setRepoConfigValue} from '../config/set';
14+
15+
export async function verifyMergeMode(expectedMode: RepositoryMergeModes): Promise<boolean> {
16+
const currentMergeMode = await getRepoConfigValue('merge-mode');
17+
if (currentMergeMode === expectedMode) {
18+
return true;
19+
}
20+
21+
Log.info(
22+
`The repository is currently set to ${bold(currentMergeMode)} and needs to be reset before handoff`,
23+
);
24+
if (
25+
await Prompt.confirm({
26+
message: `Would you like to reset this to ${expectedMode}`,
27+
default: true,
28+
})
29+
) {
30+
try {
31+
await setRepoConfigValue('merge-mode', expectedMode);
32+
Log.info(`${green('✔')} Successfuly set merge-mode to ${expectedMode}`);
33+
return true;
34+
} catch (err) {
35+
Log.info(`${red('✘')} Failed to update merge-mode`);
36+
Log.info(err);
37+
return false;
38+
}
39+
}
40+
// User chose not to reset merge-mode
41+
Log.info('Aborting...');
42+
return false;
43+
}

ng-dev/utils/config.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ export interface GoogleSyncConfig {
6161
separateFilePatterns: string[];
6262
}
6363

64+
/** The available merge modes for repositories to utilize for normal usage. */
65+
export type RepositoryMergeModes = 'team-only' | 'caretaker-only';
66+
6467
export interface CaretakerConfig {
6568
/** Github queries showing a snapshot of pulls/issues caretakers need to monitor. */
6669
githubQueries?: {name: string; query: string}[];
@@ -74,6 +77,11 @@ export interface CaretakerConfig {
7477
* The configuration file is expected to be valid JSONC and match {@see GoogleSyncConfig}.
7578
*/
7679
g3SyncConfigPath?: string;
80+
/**
81+
* The merge mode to use for the repository, either allowing only the caretaker to perform
82+
* merges, or allowing all team members to do so.
83+
*/
84+
repositoryMergeMode?: RepositoryMergeModes;
7785
}
7886

7987
/** The filename expected for creating the ng-dev config. */

0 commit comments

Comments
 (0)