From d151ea91004abd0c771dfeea380ff4fef0fbf248 Mon Sep 17 00:00:00 2001
From: Angie Byron <webchick@24967.no-reply.drupal.org>
Date: Fri, 21 Aug 2009 06:40:05 +0000
Subject: [PATCH] #554754 by gordon and dww: Added a new function
 update_get_update_list() to return list of pending updates.

---
 includes/update.inc | 60 +++++++++++++++++++++++++++++++++++++++++
 update.php          | 66 +++++++++++++++------------------------------
 2 files changed, 82 insertions(+), 44 deletions(-)

diff --git a/includes/update.inc b/includes/update.inc
index 181bd712edb2..e27dd42d17e7 100644
--- a/includes/update.inc
+++ b/includes/update.inc
@@ -417,3 +417,63 @@ function update_finished($success, $results, $operations) {
   }
 }
 
+/**
+ * Return a list of all the pending database updates.
+ *
+ * @return
+ *   An associative array keyed by module name which contains all information
+ *   about database updates that need to be run, and any updates that are not
+ *   going to proceed due to missing requirements. The system module will
+ *   always be listed first.
+ *
+ *   The subarray for each module can contain the following keys:
+ *   - start: The starting update that is to be processed. If this does not
+ *       exist then do not process any updates for this module as there are
+ *       other requirements that need to be resolved.
+ *   - warning: Any warnings about why this module can not be updated.
+ *   - pending: An array of all the pending updates for the module including
+ *       the update number and the description from source code comment for
+ *       each update function. This array is keyed by the update number.
+ */
+function update_get_update_list() {
+  // Make sure that the system module is first in the list of updates.
+  $ret = array('system' => array());
+  
+  $modules = drupal_get_installed_schema_version(NULL, FALSE, TRUE);
+  foreach ($modules as $module => $schema_version) {
+    $pending = array();
+    $updates = drupal_get_schema_versions($module);
+    // Skip incompatible module updates, otherwise test schema versions.
+    if (!update_check_incompatibility($module) && $updates !== FALSE && $schema_version >= 0) {
+      // module_invoke returns NULL for nonexisting hooks, so if no updates
+      // are removed, it will == 0.
+      $last_removed = module_invoke($module, 'update_last_removed');
+      if ($schema_version < $last_removed) {
+        $ret[$module]['warning'] = '<em>' . $module . '</em> module can not be updated. Its schema version is ' . $schema_version . '. Updates up to and including ' . $last_removed . ' have been removed in this release. In order to update <em>' . $module . '</em> module, you will first <a href="http://drupal.org/upgrade">need to upgrade</a> to the last version in which these updates were available.';
+        continue;
+      }
+      
+      $updates = drupal_map_assoc($updates);
+      foreach (array_keys($updates) as $update) {
+        if ($update > $schema_version) {
+          // The description for an update comes from its Doxygen.
+          $func = new ReflectionFunction($module . '_update_' . $update);
+          $description = str_replace(array("\n", '*', '/'), '', $func->getDocComment());
+          $ret[$module]['pending'][$update] = "$update - $description";
+          if (!isset($ret[$module]['start'])) {
+            $ret[$module]['start'] = $update;
+          }
+        }
+      }
+      if (!isset($ret[$module]['start']) && isset($ret[$module]['pending'])) {
+        $ret[$module]['start'] = $schema_version;
+      }
+    }
+  }
+  
+  if (empty($ret['system'])) {
+    unset($ret['system']);
+  }
+  return $ret;
+}
+
diff --git a/update.php b/update.php
index 0eb1e6118f26..4addccb70881 100644
--- a/update.php
+++ b/update.php
@@ -48,51 +48,29 @@ function update_script_selection_form() {
   // Ensure system.module's updates appear first
   $form['start']['system'] = array();
 
-  $modules = drupal_get_installed_schema_version(NULL, FALSE, TRUE);
-  foreach ($modules as $module => $schema_version) {
-    $pending = array();
-    $updates = drupal_get_schema_versions($module);
-    // Skip incompatible module updates completely, otherwise test schema versions.
-    if (!update_check_incompatibility($module) && $updates !== FALSE && $schema_version >= 0) {
-      // module_invoke returns NULL for nonexisting hooks, so if no updates
-      // are removed, it will == 0.
-      $last_removed = module_invoke($module, 'update_last_removed');
-      if ($schema_version < $last_removed) {
-        $form['start'][$module] = array(
-          '#title' => $module,
-          '#item'  => '<em>' . $module . '</em> module can not be updated. Its schema version is ' . $schema_version . '. Updates up to and including ' . $last_removed . ' have been removed in this release. In order to update <em>' . $module . '</em> module, you will first <a href="http://drupal.org/upgrade">need to upgrade</a> to the last version in which these updates were available.',
-          '#prefix' => '<div class="warning">',
-          '#suffix' => '</div>',
-        );
-        continue;
-      }
-      $updates = drupal_map_assoc($updates);
-      foreach (array_keys($updates) as $update) {
-        if ($update > $schema_version) {
-          // The description for an update comes from its Doxygen.
-          $func = new ReflectionFunction($module . '_update_' . $update);
-          $description = str_replace(array("\n", '*', '/'), '', $func->getDocComment());
-          $pending[] = "$update - $description";
-          if (!isset($default)) {
-            $default = $update;
-          }
-        }
-      }
-      if (!empty($pending)) {
-        if (!isset($default)) {
-          $default = $schema_version;
-        }
-        $form['start'][$module] = array(
-          '#type' => 'hidden',
-          '#value' => $default,
-        );
-        $form['start'][$module . '_updates'] = array(
-          '#markup' => theme('item_list', $pending, $module . ' module'),
-        );
-      }
+  $updates = update_get_update_list();
+  foreach ($updates as $module => $update) {
+    if (!isset($update['start'])) {
+      $form['start'][$module] = array(
+        '#title' => $module,
+        '#item'  => $update['warning'],
+        '#prefix' => '<div class="warning">',
+        '#suffix' => '</div>',
+      );
+      continue;
+    }
+    if (!empty($update['pending'])) {
+      $form['start'][$module] = array(
+        '#type' => 'hidden',
+        '#value' => $update['start'],
+      );
+      $form['start'][$module . '_updates'] = array(
+        '#markup' => theme('item_list', $update['pending'], $module . ' module'),
+      );
+    }
+    if (isset($update['pending'])) {
+      $count = $count + count($update['pending']);
     }
-    unset($default);
-    $count = $count + count($pending);
   }
 
   if (empty($count)) {
-- 
GitLab