Commit fa63e6fe authored by Dries's avatar Dries

- Patch #305653 by donquixote, David_Rothstein, cdale, sun, snowball43, Dave...

- Patch #305653 by donquixote, David_Rothstein, cdale, sun, snowball43, Dave Reid, JohnAlbin, aspilicious: themes disabled during update.
parent d054bfaa
......@@ -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();
......
......@@ -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();
......
......@@ -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().
......
......@@ -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();
}
......
......@@ -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;
}
/**
......
......@@ -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.'));
}
}
/**
......
......@@ -135,8 +135,7 @@ public static function canUpdate($project_name) {
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')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment