From d29ab7012b9267e8bf6c24df41c386d872a78b2c Mon Sep 17 00:00:00 2001
From: Gordon Heydon <gordon@heydon.com.au>
Date: Fri, 10 Jul 2020 13:56:10 +1000
Subject: [PATCH] Issue #3128057: Error updating to v1.0

---
 entityqueue.install | 60 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/entityqueue.install b/entityqueue.install
index f6436aa..c5bafe4 100644
--- a/entityqueue.install
+++ b/entityqueue.install
@@ -5,6 +5,7 @@
  * Install, update and uninstall functions for the Entityqueue module.
  */
 
+use Drupal\Core\Entity\EntityDefinitionUpdateManagerInterface;
 use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\StringTranslation\TranslatableMarkup;
 
@@ -144,3 +145,62 @@ function entityqueue_update_8005() {
 
   return t('The revision metadata fields have been added to Entity Subqueues.');
 }
+
+/**
+ * Fix up issues upgrading entityqueue.
+ */
+function entityqueue_update_8100(&$sandbox) {
+  // Retrieve a list of pending updates to entity types and their field storage.
+  $change_list = \Drupal::entityDefinitionUpdateManager()->getChangeList();
+  $change_list = array_intersect_assoc($change_list, ['entity_subqueue' => []]);
+  // We're only interested in field storage updates; discard everything else.
+  $change_list = array_filter(array_map(function ($changed) {
+    // Check whether there are any field storage updates to this entity type.
+    if (array_key_exists('field_storage_definitions', $changed)) {
+      // Filter the list of field storage updates to contain updates to
+      // 'lightning_scheduler' fields only.
+      return array_filter($changed['field_storage_definitions'], function ($key) {
+        // Check if this is field is provided by 'lightning_scheduler'.
+        return in_array($key, [
+          'scheduled_transition_date',
+          'scheduled_transition_state',
+        ], TRUE);
+      }, ARRAY_FILTER_USE_KEY);
+    }
+  }, $change_list));
+
+  // Iterate over each updated entity type for processing.
+  foreach ($change_list as $entity_type_id => $fields) {
+    // Fetch the currently-installed field storage definitions for this type.
+    $current = \Drupal::service('entity.last_installed_schema.repository')
+      ->getLastInstalledFieldStorageDefinitions($entity_type_id);
+    // Fetch the new field storage definitions as defined.
+    $new = \Drupal::service('entity_field.manager')
+      ->getFieldStorageDefinitions($entity_type_id);
+
+    // Iterate over each field that requires an update for this entity type.
+    foreach ($fields as $field_name => $op) {
+      // Fetch the current and new field storage definitions for this field.
+      $current_field = array_key_exists($field_name, $current) ? $current[$field_name] : NULL;
+      $new_field = array_key_exists($field_name, $new) ? $new[$field_name] : NULL;
+
+      // Perform the required update for this field storage definition.
+      switch ($op) {
+        case EntityDefinitionUpdateManagerInterface::DEFINITION_CREATED:
+          \Drupal::service('field_storage_definition.listener')
+            ->onFieldStorageDefinitionCreate($new_field);
+          break;
+
+        case EntityDefinitionUpdateManagerInterface::DEFINITION_UPDATED:
+          \Drupal::service('field_storage_definition.listener')
+            ->onFieldStorageDefinitionUpdate($new_field, $current_field);
+          break;
+
+        case EntityDefinitionUpdateManagerInterface::DEFINITION_DELETED:
+          \Drupal::service('field_storage_definition.listener')
+            ->onFieldStorageDefinitionDelete($current_field);
+          break;
+      }
+    }
+  }
+}
-- 
2.26.2

