Skip to content
Snippets Groups Projects
Commit dfe12251 authored by Gábor Hojtsy's avatar Gábor Hojtsy
Browse files

#194310 by chx, catch, KarenS: run updates for disabled but previously...

#194310 by chx, catch, KarenS: run updates for disabled but previously installed modules, if they are compatible with the current system
parent a0bea004
No related branches found
No related tags found
2 merge requests!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!789Issue #3210310: Adjust Database API to remove deprecated Drupal 9 code in Drupal 10
...@@ -22,8 +22,10 @@ ...@@ -22,8 +22,10 @@
* Initialize the update system by loading all installed module's .install files. * Initialize the update system by loading all installed module's .install files.
*/ */
function drupal_load_updates() { function drupal_load_updates() {
foreach (module_list() as $module) { foreach (drupal_get_installed_schema_version(NULL, FALSE, TRUE) as $module => $schema_version) {
module_load_install($module); if ($schema_version > -1) {
module_load_install($module);
}
} }
} }
...@@ -58,10 +60,15 @@ function drupal_get_schema_versions($module) { ...@@ -58,10 +60,15 @@ function drupal_get_schema_versions($module) {
* *
* @param $module * @param $module
* A module name. * 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 * @return
* The currently installed schema version. * 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(); static $versions = array();
if ($reset) { if ($reset) {
...@@ -76,7 +83,7 @@ function drupal_get_installed_schema_version($module, $reset = FALSE) { ...@@ -76,7 +83,7 @@ function drupal_get_installed_schema_version($module, $reset = FALSE) {
} }
} }
return $versions[$module]; return $array ? $versions : $versions[$module];
} }
/** /**
......
<?php <?php
// $Id$ // $Id$
drupal_load('module', 'comment');
/** /**
* Implementation of hook_enable(). * Implementation of hook_enable().
*/ */
......
...@@ -1043,6 +1043,10 @@ function system_schema() { ...@@ -1043,6 +1043,10 @@ function system_schema() {
* @defgroup updates-4.7.x-extra Extra system updates for 4.7.x * @defgroup updates-4.7.x-extra Extra system updates for 4.7.x
* @{ * @{
*/ */
function system_update_last_removed() {
return 179;
}
function system_update_180() { function system_update_180() {
$ret = array(); $ret = array();
......
...@@ -187,19 +187,32 @@ function update_script_selection_form() { ...@@ -187,19 +187,32 @@ function update_script_selection_form() {
// Ensure system.module's updates appear first // Ensure system.module's updates appear first
$form['start']['system'] = array(); $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); $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 <a href="@upgrade">need to upgrade</a> 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' => '<div class="warning">',
'#suffix' => '</div>',
);
$form['start']['#collapsed'] = FALSE;
continue;
}
$updates = drupal_map_assoc($updates); $updates = drupal_map_assoc($updates);
$updates[] = 'No updates available'; $updates[] = 'No updates available';
$default = drupal_get_installed_schema_version($module); $default = $schema_version;
foreach (array_keys($updates) as $update) { foreach (array_keys($updates) as $update) {
if ($update > $default) { if ($update > $schema_version) {
$default = $update; $default = $update;
break; break;
} }
} }
$form['start'][$module] = array( $form['start'][$module] = array(
'#type' => 'select', '#type' => 'select',
'#title' => $module .' module', '#title' => $module .' module',
...@@ -537,22 +550,9 @@ function update_create_batch_table() { ...@@ -537,22 +550,9 @@ function update_create_batch_table() {
function update_fix_compatibility() { function update_fix_compatibility() {
$ret = array(); $ret = array();
$incompatible = 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')"); $query = db_query("SELECT name, type, status FROM {system} WHERE status = 1 AND type IN ('module','theme')");
while ($result = db_fetch_object($query)) { while ($result = db_fetch_object($query)) {
$name = $result->name; if (update_check_incompatibility($result->name, $result->type)) {
$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) {
$incompatible[] = $name; $incompatible[] = $name;
} }
} }
...@@ -562,6 +562,33 @@ function update_fix_compatibility() { ...@@ -562,6 +562,33 @@ function update_fix_compatibility() {
return $ret; return $ret;
} }
/**
* 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 * Perform Drupal 5.x to 6.x updates that are required for update.php
* to function properly. * to function properly.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment