? files
? sites/all/modules
? sites/default/settings.php
Index: update.php
===================================================================
RCS file: /cvs/drupal/drupal/update.php,v
retrieving revision 1.239
diff -u -r1.239 update.php
--- update.php 8 Dec 2007 14:06:20 -0000 1.239
+++ update.php 12 Dec 2007 23:50:47 -0000
@@ -334,19 +334,32 @@
// Ensure system.module's updates appear first
$form['start']['system'] = array();
- foreach (module_list() as $module) {
+ $modules = drupal_get_installed_schema_version(NULL, FALSE, TRUE);
+ foreach ($modules as $module => $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',
@@ -713,22 +726,9 @@
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;
}
}
@@ -739,6 +739,33 @@
}
/**
+ * 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.
*
Index: includes/install.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/install.inc,v
retrieving revision 1.51
diff -u -r1.51 install.inc
--- includes/install.inc 8 Dec 2007 15:15:25 -0000 1.51
+++ includes/install.inc 12 Dec 2007 14:45:40 -0000
@@ -22,8 +22,10 @@
* 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 @@
*
* @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 @@
}
}
- return $versions[$module];
+ return $array ? $versions : $versions[$module];
}
/**
Index: modules/comment/comment.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/comment/comment.install,v
retrieving revision 1.12
diff -u -r1.12 comment.install
--- modules/comment/comment.install 8 Dec 2007 14:06:21 -0000 1.12
+++ modules/comment/comment.install 12 Dec 2007 14:45:40 -0000
@@ -1,6 +1,8 @@