Skip to content

Commit e66864c

Browse files
committed
feat(ng-dev): create a caretaker config subcommand for updated repo properties
Create a config subcommand to allow for `get` and `set` actions against a defined list of custom properties on angular repositories. These will be used to set the merge mode of the repository being configured.
1 parent 518b99c commit e66864c

File tree

14 files changed

+230
-6
lines changed

14 files changed

+230
-6
lines changed

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

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

ng-dev/caretaker/cli.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,15 @@ import {Argv} from 'yargs';
1111
import {assertValidCaretakerConfig, assertValidGithubConfig, getConfig} from '../utils/config.js';
1212
import {CheckModule} from './check/cli.js';
1313
import {HandoffModule} from './handoff/cli.js';
14+
import {MergeModeModule} from './merge-mode/cli.js';
1415

1516
/** Build the parser for the caretaker commands. */
1617
export function buildCaretakerParser(argv: Argv) {
17-
return argv.middleware(caretakerCommandCanRun, false).command(CheckModule).command(HandoffModule);
18+
return argv
19+
.middleware(caretakerCommandCanRun, false)
20+
.command(MergeModeModule)
21+
.command(CheckModule)
22+
.command(HandoffModule);
1823
}
1924

2025
function caretakerCommandCanRun() {

ng-dev/caretaker/merge-mode/cli.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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 {Argv, Arguments, CommandModule} from 'yargs';
10+
import {Log} from '../../utils/logging';
11+
import {addGithubTokenOption} from '../../utils/git/github-yargs';
12+
import {setMergeModeRelease} from './release';
13+
import {resetMergeMode} from './reset';
14+
import {getCurrentMergeMode} from '../../utils/git/repository-merge-mode';
15+
16+
interface Options {
17+
mode?: string;
18+
}
19+
20+
async function setMergeModeBuilder(argv: Argv): Promise<Argv<Options>> {
21+
return addGithubTokenOption(argv).positional('mode', {
22+
type: 'string',
23+
choices: ['release', 'reset'],
24+
});
25+
}
26+
27+
async function setMergeModeHandler({mode}: Arguments<Options>) {
28+
if (mode === undefined) {
29+
const currentMode = await getCurrentMergeMode();
30+
Log.info(`Repository merge-mode is currently set to: ${currentMode}`);
31+
return;
32+
}
33+
if (mode === 'reset') {
34+
return await resetMergeMode();
35+
}
36+
if (mode === 'release') {
37+
return await setMergeModeRelease();
38+
}
39+
Log.error(`Unable to set the merge mode to the provided mode: ${mode}`);
40+
}
41+
42+
export const MergeModeModule: CommandModule<{}, {}> = {
43+
builder: setMergeModeBuilder,
44+
handler: setMergeModeHandler,
45+
command: ['merge-mode [mode]'],
46+
describe: 'Set the repository merge mode',
47+
};
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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 {setRepoMergeMode} from '../../utils/git/repository-merge-mode';
10+
import {green, Log, red} from '../../utils/logging';
11+
12+
export async function setMergeModeRelease() {
13+
try {
14+
await setRepoMergeMode('release');
15+
Log.info(`${green('✔')} Repository is set for release`);
16+
} catch (err) {
17+
Log.info(`${red('✘')} Failed to setup of repository for release`);
18+
if (err instanceof Error) {
19+
Log.info(err.message);
20+
Log.debug(err.stack);
21+
return;
22+
}
23+
Log.info(err);
24+
}
25+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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 {assertValidGithubConfig, getConfig} from '../../utils/config';
10+
import {setRepoMergeMode} from '../../utils/git/repository-merge-mode';
11+
import {green, Log, red} from '../../utils/logging';
12+
13+
export async function resetMergeMode() {
14+
try {
15+
const {
16+
github: {mergeMode},
17+
} = await getConfig([assertValidGithubConfig]);
18+
await setRepoMergeMode(mergeMode);
19+
Log.info(`${green('✔')} Repository has been reset to the normal mode: ${mergeMode}`);
20+
} catch (err) {
21+
Log.info(`${red('✘')} Failed to reset the merge mode of the repository`);
22+
if (err instanceof Error) {
23+
Log.info(err.message);
24+
Log.debug(err.stack);
25+
return;
26+
}
27+
Log.info(err);
28+
}
29+
}

ng-dev/pr/merge/integration.spec.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ describe('default target labels', () => {
3535

3636
beforeEach(() => {
3737
api = new GithubClient();
38-
githubConfig = {owner: 'angular', name: 'dev-infra-test', mainBranchName: 'master'};
38+
githubConfig = {
39+
mergeMode: 'caretaker-only',
40+
owner: 'angular',
41+
name: 'dev-infra-test',
42+
mainBranchName: 'master',
43+
};
3944
releaseConfig = {
4045
representativeNpmPackage: '@angular/dev-infra-test-pkg',
4146
npmPackages: [{name: '@angular/dev-infra-test-pkg'}],

ng-dev/release/notes/changelog.spec.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ describe('Changelog', () => {
1212
beforeEach(() => {
1313
cleanTestTmpDir();
1414
gitClient = getMockGitClient(
15-
{owner: 'angular', name: 'dev-infra-test', mainBranchName: 'main'},
15+
{
16+
mergeMode: 'team-only',
17+
owner: 'angular',
18+
name: 'dev-infra-test',
19+
mainBranchName: 'main',
20+
},
1621
/* useSandboxGitClient */ false,
1722
);
1823
spyOn(GitClient, 'get').and.resolveTo(gitClient);

ng-dev/release/publish/test/release-notes/context.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const defaultContextData: RenderContextData = {
1616
hiddenScopes: undefined,
1717
groupOrder: undefined,
1818
github: {
19+
mergeMode: 'caretaker-only',
1920
name: 'repoName',
2021
owner: 'repoOwner',
2122
mainBranchName: 'master',

ng-dev/release/publish/test/release-notes/generation.spec.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,12 @@ describe('release notes generation', () => {
3333
representativeNpmPackage: 'test-pkg',
3434
buildPackages: async () => [],
3535
};
36-
githubConfig = {owner: 'angular', name: 'dev-infra-test', mainBranchName: 'main'};
36+
githubConfig = {
37+
mergeMode: 'caretaker-only',
38+
owner: 'angular',
39+
name: 'dev-infra-test',
40+
mainBranchName: 'main',
41+
};
3742
setConfig({github: githubConfig, release: releaseConfig});
3843
client = getMockGitClient(githubConfig, /* useSandboxGitClient */ true);
3944

ng-dev/release/publish/test/test-utils/action-mocks.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export const testReleasePackages: NpmPackage[] = [
4545
/** Gets test configurations for running testing a publish action. */
4646
export function getTestConfigurationsForAction() {
4747
const githubConfig: GithubConfig = {
48+
mergeMode: 'caretaker-only',
4849
owner: 'angular',
4950
name: 'dev-infra-test',
5051
mainBranchName: 'master',

0 commit comments

Comments
 (0)