=== modified file 'includes/install.inc' --- includes/install.inc 2007-12-13 10:46:43 +0000 +++ includes/install.inc 2007-12-17 07:40:44 +0000 @@ -22,8 +22,10 @@ define('FILE_NOT_EXECUTABLE', 128); * Initialize the update system by loading all installed module's .install files. */ function drupal_load_updates() { - foreach (module_list() as $module) { - module_load_install($module); + foreach (drupal_get_installed_schema_version(NULL, FALSE, TRUE) as $module => $schema_version) { + if ($schema_version > -1) { + module_load_install($module); + } } } @@ -58,10 +60,15 @@ function drupal_get_schema_versions($mod * * @param $module * A module name. + * @param $reset + * Set to TRUE after modifying the system table. + * @param $array + * Set to TRUE if you want to get information about all modules in the + * system. * @return * The currently installed schema version. */ -function drupal_get_installed_schema_version($module, $reset = FALSE) { +function drupal_get_installed_schema_version($module, $reset = FALSE, $array = FALSE) { static $versions = array(); if ($reset) { @@ -76,7 +83,7 @@ function drupal_get_installed_schema_ver } } - return $versions[$module]; + return $array ? $versions : $versions[$module]; } /** === modified file 'modules/comment/comment.install' --- modules/comment/comment.install 2007-12-08 14:06:20 +0000 +++ modules/comment/comment.install 2007-12-17 07:41:07 +0000 @@ -1,6 +1,8 @@ $schema_version) { $updates = drupal_get_schema_versions($module); - if ($updates !== FALSE) { + // 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( + '#value' => t('%module 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 %module module, you will first need to upgrade to the last version in which these updates were available.', array('%module' => $module, '%schema_version' => $schema_version, '%last_removed' => $last_removed, '@upgrade' => url('http://drupal.org/upgrade'))), + '#prefix' => '
', + '#suffix' => '
', + ); + $form['start']['#collapsed'] = FALSE; + continue; + } $updates = drupal_map_assoc($updates); $updates[] = 'No updates available'; - $default = drupal_get_installed_schema_version($module); + $default = $schema_version; foreach (array_keys($updates) as $update) { - if ($update > $default) { + if ($update > $schema_version) { $default = $update; break; } } - $form['start'][$module] = array( '#type' => 'select', '#title' => $module .' module', @@ -537,22 +550,9 @@ function update_create_batch_table() { function update_fix_compatibility() { $ret = array(); $incompatible = array(); - $themes = system_theme_data(); - $modules = module_rebuild_cache(); $query = db_query("SELECT name, type, status FROM {system} WHERE status = 1 AND type IN ('module','theme')"); while ($result = db_fetch_object($query)) { - $name = $result->name; - $file = array(); - if ($result->type == 'module' && isset($modules[$name])) { - $file = $modules[$name]; - } - else if ($result->type == 'theme' && isset($themes[$name])) { - $file = $themes[$name]; - } - if (!isset($file) - || !isset($file->info['core']) - || $file->info['core'] != DRUPAL_CORE_COMPATIBILITY - || version_compare(phpversion(), $file->info['php']) < 0) { + if (update_check_incompatibility($result->name, $result->type)) { $incompatible[] = $name; } } @@ -563,6 +563,33 @@ function update_fix_compatibility() { } /** + * Helper function to test compatibility of a module or theme. + */ +function update_check_incompatibility($name, $type = 'module') { + static $themes, $modules; + + // Store values of expensive functions for future use. + if (empty($themes) || empty($modules)) { + $themes = system_theme_data(); + $modules = module_rebuild_cache(); + } + + if ($type == 'module' && isset($modules[$name])) { + $file = $modules[$name]; + } + else if ($type == 'theme' && isset($themes[$name])) { + $file = $themes[$name]; + } + if (!isset($file) + || !isset($file->info['core']) + || $file->info['core'] != DRUPAL_CORE_COMPATIBILITY + || version_compare(phpversion(), $file->info['php']) < 0) { + return TRUE; + } + return FALSE; +} + +/** * Perform Drupal 5.x to 6.x updates that are required for update.php * to function properly. *