Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/local-actions/branch-manager/lib/git.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
GithubConfig,
setConfig,
} from '../../../../ng-dev/utils/config.js';
import {MergeMode} from '../../../../ng-dev/utils/git/repository-merge-mode.js';

/** The branch used as the primary branch for the temporary repo. */
const mainBranchName = 'main';
Expand All @@ -25,7 +26,7 @@ export async function setupConfigAndGitClient(token: string, repo: {owner: strin
mainBranchName,
owner: repo.owner,
name: repo.repo,
mergeMode: 'caretaker-only',
mergeMode: MergeMode.CARETAKER_ONLY,
},
pullRequest: {
githubApiMerge: false,
Expand Down
13 changes: 11 additions & 2 deletions .github/local-actions/branch-manager/main.js

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion ng-dev/caretaker/check/check.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ import {CiModule} from './ci.js';
import {G3Module} from './g3.js';
import {GithubQueriesModule} from './github.js';
import {ServicesModule} from './services.js';
import {RepoStatusModule} from './repo-status.js';

/** List of modules checked for the caretaker check command. */
const moduleList = [GithubQueriesModule, ServicesModule, CiModule, G3Module];
const moduleList = [RepoStatusModule, GithubQueriesModule, ServicesModule, CiModule, G3Module];

/** Check the status of services which Angular caretakers need to monitor. */
export async function checkServiceStatuses() {
Expand Down
25 changes: 25 additions & 0 deletions ng-dev/caretaker/check/repo-status.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/**
* @license
* Copyright Google LLC
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import {getCurrentMergeMode, MergeMode} from '../../utils/git/repository-merge-mode.js';
import {bold, Log} from '../../utils/logging.js';
import {BaseModule} from './base.js';

export class RepoStatusModule extends BaseModule<{mergeMode: MergeMode}> {
override async retrieveData() {
return {
mergeMode: await getCurrentMergeMode(),
};
}

override async printToTerminal() {
const data = await this.data;
Log.info(bold('Current Repository Settings'));
Log.info(`Merge mode: ${bold(data.mergeMode)}`);
Log.info();
}
}
9 changes: 6 additions & 3 deletions ng-dev/caretaker/handoff/verify-merge-mode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,15 @@
* found in the LICENSE file at https://angular.io/license
*/

import {RepositoryMergeModes} from '../../utils/config';
import {bold, green, Log, red} from '../../utils/logging';
import {Prompt} from '../../utils/prompt';
import {getCurrentMergeMode, setRepoMergeMode} from '../../utils/git/repository-merge-mode';
import {
getCurrentMergeMode,
MergeMode,
setRepoMergeMode,
} from '../../utils/git/repository-merge-mode';

export async function verifyMergeMode(expectedMode: RepositoryMergeModes): Promise<boolean> {
export async function verifyMergeMode(expectedMode: MergeMode): Promise<boolean> {
const mode = await getCurrentMergeMode();
if (mode === expectedMode) {
return true;
Expand Down
4 changes: 2 additions & 2 deletions ng-dev/caretaker/merge-mode/release.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@

import {assertValidGithubConfig, getConfig} from '../../utils/config';
import {AuthenticatedGitClient} from '../../utils/git/authenticated-git-client';
import {setRepoMergeMode} from '../../utils/git/repository-merge-mode';
import {MergeMode, setRepoMergeMode} from '../../utils/git/repository-merge-mode';
import {green, Log, bold} from '../../utils/logging';

export async function setMergeModeRelease(): Promise<boolean> {
try {
await setRepoReleaserTeamToOnlyCurrentUser();
await setRepoMergeMode('release');
await setRepoMergeMode(MergeMode.RELEASE);
Log.info(green(' ✔ Repository is set for release'));
return true;
} catch (err) {
Expand Down
3 changes: 2 additions & 1 deletion ng-dev/pr/merge/integration.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import {
} from '../../release/versioning/index.js';
import {parsePrNumber} from './merge-pull-request.js';
import {Prompt} from '../../utils/prompt.js';
import {MergeMode} from '../../utils/git/repository-merge-mode.js';
const API_ENDPOINT = `https://api.github.com`;

describe('default target labels', () => {
Expand All @@ -36,7 +37,7 @@ describe('default target labels', () => {
beforeEach(() => {
api = new GithubClient();
githubConfig = {
mergeMode: 'caretaker-only',
mergeMode: MergeMode.CARETAKER_ONLY,
owner: 'angular',
name: 'dev-infra-test',
mainBranchName: 'master',
Expand Down
3 changes: 2 additions & 1 deletion ng-dev/release/notes/changelog.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import semver from 'semver';
import {cleanTestTmpDir, dedent} from '../../utils/testing/index.js';
import {Changelog, splitMarker} from './changelog.js';
import {getMockGitClient} from '../../utils/testing/index.js';
import {MergeMode} from '../../utils/git/repository-merge-mode.js';

describe('Changelog', () => {
let changelog: Changelog;
Expand All @@ -13,7 +14,7 @@ describe('Changelog', () => {
cleanTestTmpDir();
gitClient = getMockGitClient(
{
mergeMode: 'team-only',
mergeMode: MergeMode.TEAM_ONLY,
owner: 'angular',
name: 'dev-infra-test',
mainBranchName: 'main',
Expand Down
3 changes: 2 additions & 1 deletion ng-dev/release/publish/test/release-notes/context.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import {CommitFromGitLog, parseCommitFromGitLog} from '../../../../commit-message/parse.js';
import {commitMessageBuilder} from '../../../../commit-message/test-util.js';
import {MergeMode} from '../../../../utils/git/repository-merge-mode.js';
import {CategorizedCommit, RenderContext, RenderContextData} from '../../../notes/context.js';

const defaultContextData: RenderContextData = {
Expand All @@ -16,7 +17,7 @@ const defaultContextData: RenderContextData = {
hiddenScopes: undefined,
groupOrder: undefined,
github: {
mergeMode: 'caretaker-only',
mergeMode: MergeMode.CARETAKER_ONLY,
name: 'repoName',
owner: 'repoOwner',
mainBranchName: 'master',
Expand Down
3 changes: 2 additions & 1 deletion ng-dev/release/publish/test/release-notes/generation.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
*/

import {GithubConfig, setConfig} from '../../../../utils/config.js';
import {MergeMode} from '../../../../utils/git/repository-merge-mode.js';
import {
getMockGitClient,
installSandboxGitClient,
Expand Down Expand Up @@ -34,7 +35,7 @@ describe('release notes generation', () => {
buildPackages: async () => [],
};
githubConfig = {
mergeMode: 'caretaker-only',
mergeMode: MergeMode.CARETAKER_ONLY,
owner: 'angular',
name: 'dev-infra-test',
mainBranchName: 'main',
Expand Down
3 changes: 2 additions & 1 deletion ng-dev/release/publish/test/test-utils/action-mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import {ReleaseAction} from '../../actions.js';
import {DirectoryHash} from '../../directory-hash.js';
import {ExternalCommands} from '../../external-commands.js';
import {Prompt} from '../../../../utils/prompt.js';
import {MergeMode} from '../../../../utils/git/repository-merge-mode.js';

/** Default representative NPM package used in tests. */
export const testRepresentativePackage = '@angular/pkg1';
Expand All @@ -45,7 +46,7 @@ export const testReleasePackages: NpmPackage[] = [
/** Gets test configurations for running testing a publish action. */
export function getTestConfigurationsForAction() {
const githubConfig: GithubConfig = {
mergeMode: 'caretaker-only',
mergeMode: MergeMode.CARETAKER_ONLY,
owner: 'angular',
name: 'dev-infra-test',
mainBranchName: 'master',
Expand Down
3 changes: 2 additions & 1 deletion ng-dev/release/versioning/test/active-release-trains.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import nock from 'nock';
import {fakeGithubPaginationResponse, matchesVersion} from '../../../utils/testing/index.js';
import {GithubConfig} from '../../../utils/config.js';
import {ReleaseTrain} from '../release-trains.js';
import {MergeMode} from '../../../utils/git/repository-merge-mode.js';

interface FakeBranch {
name: string;
Expand Down Expand Up @@ -289,7 +290,7 @@ describe('active release train determination', () => {

beforeEach(() => {
setup({
mergeMode: 'team-only',
mergeMode: MergeMode.TEAM_ONLY,
owner: 'angular',
name: 'dev-infra-test',
mainBranchName: 'main',
Expand Down
5 changes: 3 additions & 2 deletions ng-dev/utils/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {Log} from './logging.js';
import {getCachedConfig, setCachedConfig} from './config-cache.js';
import {determineRepoBaseDirFromCwd} from './repo-directory.js';
import {pathToFileURL} from 'url';
import {MergeMode} from './git/repository-merge-mode.js';

/**
* Type describing a ng-dev configuration.
Expand All @@ -24,7 +25,7 @@ export type NgDevConfig<T = {}> = T & {
};

/** The merge modes repositories can defined as their normal merge mode. */
export type RepositoryMergeModes = 'team-only' | 'caretaker-only';
export type RepositoryMergeMode = Extract<MergeMode, 'team-only' | 'caretaker-only'>;

/**
* Describes the Github configuration for dev-infra. This configuration is
Expand All @@ -47,7 +48,7 @@ export interface GithubConfig {
* The merge mode to use for the repository, either allowing only the caretaker to perform
* merges, or allowing all team members to do so.
*/
mergeMode: RepositoryMergeModes;
mergeMode: RepositoryMergeMode;
/**
* Whether the repository requires being set to release for its merge-mode before release.
*
Expand Down
23 changes: 15 additions & 8 deletions ng-dev/utils/git/repository-merge-mode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,15 @@ import {AuthenticatedGitClient} from './authenticated-git-client';

const mergeModePropertyName = 'merge-mode';

export async function getCurrentMergeMode() {
export enum MergeMode {
TEAM_ONLY = 'team-only',
CARETAKER_ONLY = 'caretaker-only',
RELEASE = 'release',
}

const mergeModes = Object.values(MergeMode);

export async function getCurrentMergeMode(): Promise<MergeMode> {
const git = await AuthenticatedGitClient.get();

const {data: properties} = await git.github.repos.customPropertiesForReposGetRepositoryValues({
Expand All @@ -24,11 +32,12 @@ export async function getCurrentMergeMode() {
throw Error(`No repository configuration value with the key: ${mergeModePropertyName}`);
}

// We safely case this as a string since we know that `merge-mode` is a single-select and therefore a string.
return property.value as string;
// We safely cast this as a MergeMode since we know that `merge-mode` is a single-select and
// therefore one of the valid strings.
return property.value as MergeMode;
}

export async function setRepoMergeMode(value: string) {
export async function setRepoMergeMode(value: MergeMode) {
const currentValue = await getCurrentMergeMode();
if (currentValue === value) {
Log.debug(
Expand All @@ -37,12 +46,10 @@ export async function setRepoMergeMode(value: string) {
return false;
}
const git = await AuthenticatedGitClient.get();
const allowed_values = ['team-only', 'caretaker-only', 'release'];

if (!allowed_values!.includes(value)) {
if (!mergeModes.includes(value)) {
throw Error(
`Unable to update ${mergeModePropertyName}. The value provided must use one of: ` +
`${allowed_values!.join(', ')}\nBut "${value}" was provided as the value`,
`${mergeModes.join(', ')}\nBut "${value}" was provided as the value`,
);
}

Expand Down
3 changes: 2 additions & 1 deletion ng-dev/utils/testing/virtual-git-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,12 @@ import {testTmpDir} from './index.js';
import {GithubConfig} from '../config.js';
import {AuthenticatedGitClient} from '../git/authenticated-git-client.js';
import {GitClient} from '../git/git-client.js';
import {MergeMode} from '../git/repository-merge-mode.js';

/** A mock instance of a configuration for the ng-dev toolset for default testing. */
export const mockNgDevConfig: {github: GithubConfig} = {
github: {
mergeMode: 'caretaker-only',
mergeMode: MergeMode.CARETAKER_ONLY,
name: 'name',
owner: 'owner',
mainBranchName: 'master',
Expand Down
Loading