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: