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