Skip to content

Commit

Permalink
feat: enable bypass checks for merge via label
Browse files Browse the repository at this point in the history
  • Loading branch information
christophehurpeau committed Jan 22, 2023
1 parent b5db503 commit 14a09b8
Show file tree
Hide file tree
Showing 16 changed files with 65 additions and 2 deletions.
5 changes: 5 additions & 0 deletions src/accountConfigs/ornikar.ts
Expand Up @@ -26,6 +26,7 @@ const config: Config<'dev' | 'design', 'ops' | 'frontends' | 'backends'> = {
'ci/circleci: tests-e2e',
'SonarCloud Code Analysis',
],
disableBypassMergeFor: /(shared-|orb|-configs)/,
prDefaultOptions: {
autoMergeWithSkipCi: false,
autoMerge: false,
Expand Down Expand Up @@ -331,6 +332,10 @@ const config: Config<'dev' | 'design', 'ops' | 'frontends' | 'backends'> = {
name: ':arrows_counterclockwise: update branch',
color: '#e1e8ed',
},
'merge/bypass-progress': {
name: ':soon: bypass progress',
color: '#e11d21',
},

/* feature-branch */
'feature-branch': {
Expand Down
1 change: 1 addition & 0 deletions src/accountConfigs/types.ts
Expand Up @@ -84,6 +84,7 @@ export interface Config<GroupNames extends string, TeamNames extends string> {
requiresReviewRequest?: boolean;
autoMergeRenovateWithSkipCi?: boolean;
disableAutoMerge?: boolean;
disableBypassMergeFor?: RegExp;
warnOnForcePushAfterReviewStarted?: WarnOnForcePushAfterReviewStarted;
checksAllowedToFail?: string[];
experimentalFeatures?: ExperimentalFeatures;
Expand Down
1 change: 1 addition & 0 deletions src/events/pr-handlers/actions/calcAndUpdateLabels.ts
Expand Up @@ -63,6 +63,7 @@ export async function calcAndUpdateLabels<
stepsState,
pullRequest,
context,
repoContext,
appContext,
reviewflowPrContext,
),
Expand Down
1 change: 1 addition & 0 deletions src/events/pr-handlers/actions/commentBodyEdited.ts
Expand Up @@ -157,6 +157,7 @@ export const commentBodyEdited = async <Name extends EventsWithRepository>(
stepsState,
pullRequest,
context,
repoContext,
appContext,
reviewflowPrContext,
),
Expand Down
25 changes: 23 additions & 2 deletions src/events/pr-handlers/actions/updateStatusCheckFromStepsState.ts
@@ -1,11 +1,12 @@
import type { AppContext } from 'context/AppContext';
import type { EventsWithRepository } from 'context/repoContext';
import type { EventsWithRepository, RepoContext } from 'context/repoContext';
import type { ProbotEvent } from 'events/probot-types';
import type { StatusInfo } from '../../../accountConfigs/types';
import { ExcludesFalsy } from '../../../utils/Excludes';
import type { PullRequestWithDecentData } from '../utils/PullRequestData';
import type { ReviewflowPrContext } from '../utils/createPullRequestContext';
import createStatus, { isSameStatus } from './utils/createStatus';
import hasLabelInPR from './utils/labels/hasLabelInPR';
import type { StepsState } from './utils/steps/calcStepsState';

const addStatusCheck = async function <EventName extends EventsWithRepository>(
Expand Down Expand Up @@ -102,6 +103,7 @@ export const updateStatusCheckFromStepsState = <
stepsState: StepsState<GroupNames>,
pullRequest: PullRequestWithDecentData,
context: ProbotEvent<EventName>,
repoContext: RepoContext<GroupNames>,
appContext: AppContext,
reviewflowPrContext: ReviewflowPrContext,
previousSha?: string,
Expand Down Expand Up @@ -145,6 +147,25 @@ export const updateStatusCheckFromStepsState = <
return createFailedStatusCheck('Write step failed, unknown reason');
}

// bypass
const bypassProgressLabel = repoContext.labels['merge/bypass-progress'];
if (
bypassProgressLabel &&
hasLabelInPR(pullRequest.labels, bypassProgressLabel)
) {
return addStatusCheck(
pullRequest,
context,
appContext,
reviewflowPrContext,
{
state: 'success',
description: '鈿狅笍 PR merge bypass',
},
previousSha,
);
}

// STEP 2: CHECKS
if (stepsState.checks.state !== 'passed') {
if (stepsState.checks.isFailed) {
Expand Down Expand Up @@ -179,7 +200,7 @@ export const updateStatusCheckFromStepsState = <
}
}

// STEP 3 & 4: Code Review
// STEP 3: Code Review
if (stepsState.codeReview.state !== 'passed') {
if (
stepsState.codeReview.hasRequestedReviewers ||
Expand Down
1 change: 1 addition & 0 deletions src/events/pr-handlers/closed.ts
Expand Up @@ -71,6 +71,7 @@ export default function closed(app: Probot, appContext: AppContext): void {
stepsState,
pullRequest,
context,
repoContext,
appContext,
reviewflowPrContext,
),
Expand Down
1 change: 1 addition & 0 deletions src/events/pr-handlers/convertedToDraft.ts
Expand Up @@ -46,6 +46,7 @@ export default function convertedToDraft(
stepsState,
pullRequest,
context,
repoContext,
appContext,
reviewflowPrContext,
),
Expand Down
1 change: 1 addition & 0 deletions src/events/pr-handlers/edited.ts
Expand Up @@ -60,6 +60,7 @@ export default function edited(app: Probot, appContext: AppContext): void {
stepsState,
updatedPullRequest,
context,
repoContext,
appContext,
reviewflowPrContext,
),
Expand Down
24 changes: 24 additions & 0 deletions src/events/pr-handlers/labelsChanged.ts
Expand Up @@ -54,6 +54,7 @@ export default function labelsChanged(
const updateBranchLabel = repoContext.labels['merge/update-branch'];
const autoMergeLabel = repoContext.labels['merge/automerge'];
const autoMergeSkipCiLabel = repoContext.labels['merge/skip-ci'];
const bypassProgressLabel = repoContext.labels['merge/bypass-progress'];

const label = context.payload.label;
let successful = true;
Expand Down Expand Up @@ -108,6 +109,7 @@ export default function labelsChanged(
stepsState,
updatedPr,
context,
repoContext,
appContext,
reviewflowPrContext,
),
Expand Down Expand Up @@ -193,15 +195,37 @@ export default function labelsChanged(
return;
}

let labels = pullRequest.labels;

if (bypassProgressLabel && label.id === bypassProgressLabel.id) {
if (
context.payload.action === 'labeled' &&
repoContext.config.disableBypassMergeFor &&
repoContext.config.disableBypassMergeFor.test(
repoContext.repoEmbed.name,
)
) {
await context.octokit.issues.removeLabel(
context.repo({
issue_number: pullRequest.number,
name: label.name,
}),
);
labels = labels.filter((l) => l.id !== bypassProgressLabel.id);
}
}

const stepsState = calcStepsState({
repoContext,
pullRequest: updatedPr,
labels,
});

await updateStatusCheckFromStepsState(
stepsState,
updatedPr,
context,
repoContext,
appContext,
reviewflowPrContext,
);
Expand Down
1 change: 1 addition & 0 deletions src/events/pr-handlers/opened.ts
Expand Up @@ -67,6 +67,7 @@ export default function opened(app: Probot, appContext: AppContext): void {
stepsState,
pullRequest,
context,
repoContext,
appContext,
reviewflowPrContext,
),
Expand Down
1 change: 1 addition & 0 deletions src/events/pr-handlers/readyForReview.ts
Expand Up @@ -89,6 +89,7 @@ export default function readyForReview(
stepsState,
pullRequest,
context,
repoContext,
appContext,
reviewflowPrContext,
),
Expand Down
1 change: 1 addition & 0 deletions src/events/pr-handlers/reopened.ts
Expand Up @@ -50,6 +50,7 @@ export default function reopened(app: Probot, appContext: AppContext): void {
stepsState,
pullRequest,
context,
repoContext,
appContext,
reviewflowPrContext,
),
Expand Down
1 change: 1 addition & 0 deletions src/events/pr-handlers/reviewDismissed.ts
Expand Up @@ -103,6 +103,7 @@ export default function reviewDismissed(
stepsState,
pullRequest,
context,
repoContext,
appContext,
reviewflowPrContext,
),
Expand Down
1 change: 1 addition & 0 deletions src/events/pr-handlers/reviewRequestRemoved.ts
Expand Up @@ -106,6 +106,7 @@ export default function reviewRequestRemoved(
stepsState,
pullRequest,
context,
repoContext,
appContext,
reviewflowPrContext,
),
Expand Down
1 change: 1 addition & 0 deletions src/events/pr-handlers/reviewRequested.ts
Expand Up @@ -70,6 +70,7 @@ export default function reviewRequested(
stepsState,
pullRequest,
context,
repoContext,
appContext,
reviewflowPrContext,
),
Expand Down
1 change: 1 addition & 0 deletions src/events/pr-handlers/reviewSubmitted.ts
Expand Up @@ -149,6 +149,7 @@ export default function reviewSubmitted(
stepsState,
pullRequest,
context,
repoContext,
appContext,
reviewflowPrContext,
),
Expand Down

0 comments on commit 14a09b8

Please sign in to comment.