Upgrader - Pick initial dispatch policy based on how far we've progressed in upgrade
authorTim Otten <totten@civicrm.org>
Wed, 20 Jul 2022 07:32:37 +0000 (00:32 -0700)
committerTim Otten <totten@civicrm.org>
Wed, 20 Jul 2022 08:45:18 +0000 (01:45 -0700)
CRM/Upgrade/DispatchPolicy.php
CRM/Upgrade/Form.php
Civi/Core/Container.php

index ebab0683a3a1fa27f88a105e189f9ee863e6579e..087b70d88d60b388559354f1dc877f153a6400f9 100644 (file)
@@ -38,6 +38,29 @@ class CRM_Upgrade_DispatchPolicy {
   /**
    * Determine the dispatch policy
    *
+   * @return array
+   * @see \Civi\Core\CiviEventDispatcher::setDispatchPolicy()
+   */
+  public static function pick(): ?array {
+    if (!\CRM_Core_Config::isUpgradeMode()) {
+      return NULL;
+    }
+
+    // Have we run CRM_Upgrade_Form::doCoreFinish() for this version?
+    $codeVer = CRM_Utils_System::version();
+    $isCoreCurrent = CRM_Core_DAO::singleValueQuery('
+        SELECT count(*) as count
+        FROM civicrm_log
+        WHERE entity_table = "civicrm_domain"
+        AND data LIKE %1
+        ', [1 => ['upgrade:%->' . $codeVer, 'String']]);
+
+    return CRM_Upgrade_DispatchPolicy::get($isCoreCurrent < 1 ? 'upgrade.main' : 'upgrade.finish');
+  }
+
+  /**
+   * Read the dispatch policy.
+   *
    * @param string $phase
    *   Ex: 'upgrade.main' or 'upgrade.finish'.
    * @return array
index 97024a0d67d6adb66a0df4b36918bbe0caa8938c..051a259164618299f34c44c17f62e30d1000d62b 100644 (file)
@@ -809,6 +809,8 @@ SET    version = '$version'
     list($ignore, $latestVer) = $upgrade->getUpgradeVersions();
     // Seems extraneous in context, but we'll preserve old behavior
     $upgrade->setVersion($latestVer);
+    // Going forward, any new tasks will run in `upgrade.finish` mode.
+    // @see \CRM_Upgrade_DispatchPolicy::pick()
 
     $config = CRM_Core_Config::singleton();
     $config->userSystem->flush();
index dc48b4926357e5160c0f8c42e8e17ac1f9830492..f705463b7c86e8151acd55ead4b91e66454912ae 100644 (file)
@@ -604,7 +604,6 @@ class Container {
       '/^hook_/' => 'not-ready',
       '/^civi\./' => 'run',
     ];
-    $mainDispatchPolicy = \CRM_Core_Config::isUpgradeMode() ? \CRM_Upgrade_DispatchPolicy::get('upgrade.main') : NULL;
     $bootServices['dispatcher.boot']->setDispatchPolicy($bootDispatchPolicy);
 
     $class = $runtime->userFrameworkClass;
@@ -630,7 +629,7 @@ class Container {
       \CRM_Extension_System::singleton()->getClassLoader()->register();
       \CRM_Extension_System::singleton()->getMixinLoader()->run();
       \CRM_Utils_Hook::singleton()->commonBuildModuleList('civicrm_boot');
-      $bootServices['dispatcher.boot']->setDispatchPolicy($mainDispatchPolicy);
+      $bootServices['dispatcher.boot']->setDispatchPolicy(\CRM_Core_Config::isUpgradeMode() ? \CRM_Upgrade_DispatchPolicy::pick() : NULL);
 
       $runtime->includeCustomPath();
 
@@ -646,7 +645,7 @@ class Container {
 
     }
     else {
-      $bootServices['dispatcher.boot']->setDispatchPolicy($mainDispatchPolicy);
+      $bootServices['dispatcher.boot']->setDispatchPolicy(\CRM_Core_Config::isUpgradeMode() ? \CRM_Upgrade_DispatchPolicy::pick() : NULL);
     }
   }