Unlock merge group lock for revertbot (#4152)
Partial fix for: https://github.com/flutter/flutter/issues/161319
diff --git a/app_dart/lib/src/service/scheduler.dart b/app_dart/lib/src/service/scheduler.dart
index 17cf78f..387f5ee 100644
--- a/app_dart/lib/src/service/scheduler.dart
+++ b/app_dart/lib/src/service/scheduler.dart
@@ -425,6 +425,10 @@
// the PR and to the merge group, and so it must be completed in both cases.
final lock = await lockMergeGroupChecks(slug, pullRequest.head!.sha!);
+ // Track if we should unlock the merge group lock in case of non-fusion or
+ // revert bots.
+ bool unlockMergeGroup = false;
+
final ciValidationCheckRun = await createCiYamlCheckRun(pullRequest, slug);
log.info('Creating presubmit targets for ${pullRequest.number}');
@@ -433,12 +437,16 @@
try {
final sha = pullRequest.head!.sha!;
isFusion = await fusionTester.isFusionBasedRef(slug, sha);
+ if (!isFusion) {
+ unlockMergeGroup = true;
+ }
// Both the author and label should be checked to make sure that no one is
// attempting to get a pull request without check through.
if (pullRequest.user!.login == config.autosubmitBot &&
pullRequest.labels!.any((element) => element.name == Config.revertOfLabel)) {
log.info('Skipping generating the full set of checks for revert request.');
+ unlockMergeGroup = true;
} else {
final presubmitTargets = isFusion
? await getTestsForStage(pullRequest, CiStage.fusionEngineBuild)
@@ -476,7 +484,7 @@
await closeCiYamlCheckRun('PR ${pullRequest.number}', exception, slug, ciValidationCheckRun);
// The 'lock' will be unlocked later in processCheckRunCompletion after all engine builds are processed.
- if (!isFusion) {
+ if (unlockMergeGroup) {
await unlockMergeGroupChecks(slug, pullRequest.head!.sha!, lock, exception);
}
log.info(
diff --git a/app_dart/test/service/scheduler_test.dart b/app_dart/test/service/scheduler_test.dart
index 52804b2..7ea5997 100644
--- a/app_dart/test/service/scheduler_test.dart
+++ b/app_dart/test/service/scheduler_test.dart
@@ -1653,6 +1653,38 @@
);
});
+ test('Unlocks merge group on revert request.', () async {
+ fakeFusion.isFusion = (_, __) => true;
+
+ final PullRequest releasePullRequest = generatePullRequest(
+ labels: [IssueLabel(name: 'revert of')],
+ );
+
+ releasePullRequest.user = User(login: 'auto-submit[bot]');
+
+ await scheduler.triggerPresubmitTargets(pullRequest: releasePullRequest);
+ expect(
+ verify(
+ mockGithubChecksUtil.updateCheckRun(
+ any,
+ any,
+ any,
+ status: captureAnyNamed('status'),
+ conclusion: captureAnyNamed('conclusion'),
+ output: captureAnyNamed('output'),
+ ),
+ ).captured,
+ <Object?>[
+ CheckRunStatus.completed,
+ CheckRunConclusion.success,
+ null,
+ CheckRunStatus.completed,
+ CheckRunConclusion.success,
+ null,
+ ],
+ );
+ });
+
test('filters out presubmit targets that do not exist in main and do not filter targets not in main', () async {
const String singleCiYaml = r'''
enabled_branches: