summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/common.inc11
-rw-r--r--includes/install.core.inc5
-rw-r--r--includes/theme.inc2
-rw-r--r--includes/update.inc5
-rw-r--r--modules/system/system.module184
-rw-r--r--modules/system/system.test14
-rw-r--r--modules/system/system.updater.inc3
7 files changed, 111 insertions, 113 deletions
diff --git a/includes/common.inc b/includes/common.inc
index 3460d1ad1..ecb89071e 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -6071,16 +6071,7 @@ function drupal_flush_all_caches() {
registry_rebuild();
drupal_clear_css_cache();
drupal_clear_js_cache();
-
- // If invoked from update.php, we must not update the theme information in the
- // database, or this will result in all themes being disabled.
- if (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'update') {
- _system_rebuild_theme_data();
- }
- else {
- system_rebuild_theme_data();
- }
-
+ system_rebuild_theme_data();
drupal_theme_rebuild();
menu_rebuild();
node_types_rebuild();
diff --git a/includes/install.core.inc b/includes/install.core.inc
index 1dbe9e2f8..8f626f677 100644
--- a/includes/install.core.inc
+++ b/includes/install.core.inc
@@ -1472,10 +1472,7 @@ function install_finished(&$install_state) {
$output .= '<p>' . (isset($messages['error']) ? st('Review the messages above before visiting <a href="@url">your new site</a>.', array('@url' => url(''))) : st('<a href="@url">Visit your new site</a>.', array('@url' => url('')))) . '</p>';
// Rebuild the module and theme data, in case any newly-installed modules
- // need to modify it via hook_system_info_alter(). We need to clear the
- // theme static cache first, to make sure that the theme data is actually
- // rebuilt.
- drupal_static_reset('_system_rebuild_theme_data');
+ // need to modify it via hook_system_info_alter().
system_rebuild_module_data();
system_rebuild_theme_data();
diff --git a/includes/theme.inc b/includes/theme.inc
index a93dd0dd7..b54f0bc13 100644
--- a/includes/theme.inc
+++ b/includes/theme.inc
@@ -2468,7 +2468,7 @@ function template_preprocess_maintenance_page(&$variables) {
global $theme;
// Retrieve the theme data to list all available regions.
- $theme_data = _system_rebuild_theme_data();
+ $theme_data = list_themes();
$regions = $theme_data[$theme]->info['regions'];
// Get all region content set with drupal_add_region_content().
diff --git a/includes/update.inc b/includes/update.inc
index 3574f2d94..794710513 100644
--- a/includes/update.inc
+++ b/includes/update.inc
@@ -36,7 +36,10 @@ function update_check_incompatibility($name, $type = 'module') {
// Store values of expensive functions for future use.
if (empty($themes) || empty($modules)) {
- $themes = _system_rebuild_theme_data();
+ // We need to do a full rebuild here to make sure the database reflects any
+ // code changes that were made in the filesystem before the update script
+ // was initiated.
+ $themes = system_rebuild_theme_data();
$modules = system_rebuild_module_data();
}
diff --git a/modules/system/system.module b/modules/system/system.module
index 20b0e8805..7ea1d6599 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -2304,118 +2304,112 @@ function _system_update_bootstrap_status() {
* An associative array of themes information.
*/
function _system_rebuild_theme_data() {
- $themes_info = &drupal_static(__FUNCTION__, array());
-
- if (empty($themes_info)) {
- // Find themes
- $themes = drupal_system_listing('/\.info$/', 'themes');
- // Find theme engines
- $engines = drupal_system_listing('/\.engine$/', 'themes/engines');
-
- // Set defaults for theme info.
- $defaults = array(
- 'regions' => array(
- 'sidebar_first' => 'Left sidebar',
- 'sidebar_second' => 'Right sidebar',
- 'content' => 'Content',
- 'header' => 'Header',
- 'footer' => 'Footer',
- 'highlight' => 'Highlighted content',
- 'help' => 'Help',
- 'page_top' => 'Page top',
- 'page_bottom' => 'Page bottom',
- ),
- 'description' => '',
- 'features' => _system_default_theme_features(),
- 'screenshot' => 'screenshot.png',
- 'php' => DRUPAL_MINIMUM_PHP,
- );
+ // Find themes
+ $themes = drupal_system_listing('/\.info$/', 'themes');
+ // Find theme engines
+ $engines = drupal_system_listing('/\.engine$/', 'themes/engines');
- $sub_themes = array();
- // Read info files for each theme
- foreach ($themes as $key => $theme) {
- $themes[$key]->filename = $theme->uri;
- $themes[$key]->info = drupal_parse_info_file($theme->uri) + $defaults;
+ // Set defaults for theme info.
+ $defaults = array(
+ 'regions' => array(
+ 'sidebar_first' => 'Left sidebar',
+ 'sidebar_second' => 'Right sidebar',
+ 'content' => 'Content',
+ 'header' => 'Header',
+ 'footer' => 'Footer',
+ 'highlight' => 'Highlighted content',
+ 'help' => 'Help',
+ 'page_top' => 'Page top',
+ 'page_bottom' => 'Page bottom',
+ ),
+ 'description' => '',
+ 'features' => _system_default_theme_features(),
+ 'screenshot' => 'screenshot.png',
+ 'php' => DRUPAL_MINIMUM_PHP,
+ );
- // Invoke hook_system_info_alter() to give installed modules a chance to
- // modify the data in the .info files if necessary.
- $type = 'theme';
- drupal_alter('system_info', $themes[$key]->info, $themes[$key], $type);
+ $sub_themes = array();
+ // Read info files for each theme
+ foreach ($themes as $key => $theme) {
+ $themes[$key]->filename = $theme->uri;
+ $themes[$key]->info = drupal_parse_info_file($theme->uri) + $defaults;
- if (!empty($themes[$key]->info['base theme'])) {
- $sub_themes[] = $key;
- }
- if (empty($themes[$key]->info['engine'])) {
- $filename = dirname($themes[$key]->uri) . '/' . $themes[$key]->name . '.theme';
- if (file_exists($filename)) {
- $themes[$key]->owner = $filename;
- $themes[$key]->prefix = $key;
- }
+ // Invoke hook_system_info_alter() to give installed modules a chance to
+ // modify the data in the .info files if necessary.
+ $type = 'theme';
+ drupal_alter('system_info', $themes[$key]->info, $themes[$key], $type);
+
+ if (!empty($themes[$key]->info['base theme'])) {
+ $sub_themes[] = $key;
+ }
+ if (empty($themes[$key]->info['engine'])) {
+ $filename = dirname($themes[$key]->uri) . '/' . $themes[$key]->name . '.theme';
+ if (file_exists($filename)) {
+ $themes[$key]->owner = $filename;
+ $themes[$key]->prefix = $key;
}
- else {
- $engine = $themes[$key]->info['engine'];
- if (isset($engines[$engine])) {
- $themes[$key]->owner = $engines[$engine]->uri;
- $themes[$key]->prefix = $engines[$engine]->name;
- $themes[$key]->template = TRUE;
- }
+ }
+ else {
+ $engine = $themes[$key]->info['engine'];
+ if (isset($engines[$engine])) {
+ $themes[$key]->owner = $engines[$engine]->uri;
+ $themes[$key]->prefix = $engines[$engine]->name;
+ $themes[$key]->template = TRUE;
}
+ }
- // Give the stylesheets proper path information.
- $pathed_stylesheets = array();
- if (isset($themes[$key]->info['stylesheets'])) {
- foreach ($themes[$key]->info['stylesheets'] as $media => $stylesheets) {
- foreach ($stylesheets as $stylesheet) {
- $pathed_stylesheets[$media][$stylesheet] = dirname($themes[$key]->uri) . '/' . $stylesheet;
- }
+ // Give the stylesheets proper path information.
+ $pathed_stylesheets = array();
+ if (isset($themes[$key]->info['stylesheets'])) {
+ foreach ($themes[$key]->info['stylesheets'] as $media => $stylesheets) {
+ foreach ($stylesheets as $stylesheet) {
+ $pathed_stylesheets[$media][$stylesheet] = dirname($themes[$key]->uri) . '/' . $stylesheet;
}
}
- $themes[$key]->info['stylesheets'] = $pathed_stylesheets;
+ }
+ $themes[$key]->info['stylesheets'] = $pathed_stylesheets;
- // Give the scripts proper path information.
- $scripts = array();
- if (isset($themes[$key]->info['scripts'])) {
- foreach ($themes[$key]->info['scripts'] as $script) {
- $scripts[$script] = dirname($themes[$key]->uri) . '/' . $script;
- }
- }
- $themes[$key]->info['scripts'] = $scripts;
- // Give the screenshot proper path information.
- if (!empty($themes[$key]->info['screenshot'])) {
- $themes[$key]->info['screenshot'] = dirname($themes[$key]->uri) . '/' . $themes[$key]->info['screenshot'];
+ // Give the scripts proper path information.
+ $scripts = array();
+ if (isset($themes[$key]->info['scripts'])) {
+ foreach ($themes[$key]->info['scripts'] as $script) {
+ $scripts[$script] = dirname($themes[$key]->uri) . '/' . $script;
}
}
+ $themes[$key]->info['scripts'] = $scripts;
+ // Give the screenshot proper path information.
+ if (!empty($themes[$key]->info['screenshot'])) {
+ $themes[$key]->info['screenshot'] = dirname($themes[$key]->uri) . '/' . $themes[$key]->info['screenshot'];
+ }
+ }
- // Now that we've established all our master themes, go back and fill in
- // data for subthemes.
- foreach ($sub_themes as $key) {
- $themes[$key]->base_themes = system_find_base_themes($themes, $key);
- // Don't proceed if there was a problem with the root base theme.
- if (!current($themes[$key]->base_themes)) {
- continue;
- }
- $base_key = key($themes[$key]->base_themes);
- foreach (array_keys($themes[$key]->base_themes) as $base_theme) {
- $themes[$base_theme]->sub_themes[$key] = $themes[$key]->info['name'];
+ // Now that we've established all our master themes, go back and fill in data
+ // for subthemes.
+ foreach ($sub_themes as $key) {
+ $themes[$key]->base_themes = system_find_base_themes($themes, $key);
+ // Don't proceed if there was a problem with the root base theme.
+ if (!current($themes[$key]->base_themes)) {
+ continue;
+ }
+ $base_key = key($themes[$key]->base_themes);
+ foreach (array_keys($themes[$key]->base_themes) as $base_theme) {
+ $themes[$base_theme]->sub_themes[$key] = $themes[$key]->info['name'];
+ }
+ // Copy the 'owner' and 'engine' over if the top level theme uses a theme
+ // engine.
+ if (isset($themes[$base_key]->owner)) {
+ if (isset($themes[$base_key]->info['engine'])) {
+ $themes[$key]->info['engine'] = $themes[$base_key]->info['engine'];
+ $themes[$key]->owner = $themes[$base_key]->owner;
+ $themes[$key]->prefix = $themes[$base_key]->prefix;
}
- // Copy the 'owner' and 'engine' over if the top level theme uses a
- // theme engine.
- if (isset($themes[$base_key]->owner)) {
- if (isset($themes[$base_key]->info['engine'])) {
- $themes[$key]->info['engine'] = $themes[$base_key]->info['engine'];
- $themes[$key]->owner = $themes[$base_key]->owner;
- $themes[$key]->prefix = $themes[$base_key]->prefix;
- }
- else {
- $themes[$key]->prefix = $key;
- }
+ else {
+ $themes[$key]->prefix = $key;
}
}
-
- $themes_info = $themes;
}
- return $themes_info;
+ return $themes;
}
/**
diff --git a/modules/system/system.test b/modules/system/system.test
index 049502194..55c4083a5 100644
--- a/modules/system/system.test
+++ b/modules/system/system.test
@@ -1604,6 +1604,20 @@ class UpdateScriptFunctionalTest extends DrupalWebTestCase {
$this->drupalGet($this->update_url, array('external' => TRUE));
$this->assertResponse(200);
}
+
+ /**
+ * Tests the effect of using the update script on the theme system.
+ */
+ function testThemeSystem() {
+ // Since visiting update.php triggers a rebuild of the theme system from an
+ // unusual maintenance mode environment, we check that this rebuild did not
+ // put any incorrect information about the themes into the database.
+ $original_theme_data = db_query("SELECT * FROM {system} WHERE type = 'theme' ORDER BY name")->fetchAll();
+ $this->drupalLogin($this->update_user);
+ $this->drupalGet($this->update_url, array('external' => TRUE));
+ $final_theme_data = db_query("SELECT * FROM {system} WHERE type = 'theme' ORDER BY name")->fetchAll();
+ $this->assertEqual($original_theme_data, $final_theme_data, t('Visiting update.php does not alter the information about themes stored in the database.'));
+ }
}
/**
diff --git a/modules/system/system.updater.inc b/modules/system/system.updater.inc
index 4e8d4b27c..fa265d551 100644
--- a/modules/system/system.updater.inc
+++ b/modules/system/system.updater.inc
@@ -135,8 +135,7 @@ class ThemeUpdater extends Updater implements DrupalUpdaterInterface {
public function postInstall() {
// Update the system table.
clearstatcache();
- drupal_static_reset('_system_rebuild_theme_data');
- _system_rebuild_theme_data();
+ system_rebuild_theme_data();
// Active the theme
db_update('system')