diff --git a/includes/common.inc b/includes/common.inc index f95597f..bd6577f 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -4953,6 +4953,10 @@ function _drupal_bootstrap_full() { drupal_theme_initialize(); module_invoke_all('init'); } + if (variable_get('registry_rebuild')) { + registry_rebuild(); + variable_del('registry_rebuild'); + } } /** diff --git a/update.php b/update.php index 2b5d221..641da1f 100644 --- a/update.php +++ b/update.php @@ -345,6 +345,54 @@ function update_check_requirements($skip_warnings = FALSE) { } } +function update_rebuild_registry() { + // Do enough rebuilding so Drupal can boot. Hooks are not invoked here. + require_once DRUPAL_ROOT . '/includes/common.inc'; + require_once DRUPAL_ROOT . '/includes/registry.inc'; + + $connection_info = Database::getConnectionInfo(); + $driver = $connection_info['default']['driver']; + require_once DRUPAL_ROOT . '/includes/database/query.inc'; + require_once DRUPAL_ROOT . '/includes/database/select.inc'; + require_once DRUPAL_ROOT . '/includes/database/' . $driver . '/query.inc'; + + // Get current list of modules and their files. + $modules = db_query("SELECT * FROM {system} WHERE type = 'module' AND status = 1")->fetchAll(); + // Get the list of files we are going to parse. + $files = array(); + foreach ($modules as &$module) { + $dir = dirname($module->filename); + + // Store the module directory for use in hook_registry_files_alter(). + $module->dir = $dir; + $module->info = drupal_parse_info_file($module->dir . '/' . $module->name . '.info'); + if (isset($module->info['files'])) { + // Add files for enabled modules to the registry. + foreach ($module->info['files'] as $file) { + $files["$dir/$file"] = array('module' => $module->name, 'weight' => $module->weight); + } + } + } + foreach (new RecursiveDirectoryIterator(DRUPAL_ROOT . '/includes') as $file) { + $filename = $file->getPathname(); + if (substr($filename, -4) == '.inc') { + $files[$filename] = array('module' => '', 'weight' => 0); + } + } + + $transaction = db_transaction(); + try { + db_truncate('registry')->execute(); + db_truncate('registry_file')->execute(); + _registry_parse_files($files); + } + catch (Exception $e) { + $transaction->rollback(); + throw $e; + } + variable_set('registry_rebuild', TRUE); +} + // Some unavoidable errors happen because the database is not yet up-to-date. // Our custom error handler is not yet installed, so we just suppress them. ini_set('display_errors', FALSE); @@ -399,6 +447,8 @@ if (empty($op) && update_access_allowed()) { // stage, since the real requirements check happens further down. update_check_requirements(TRUE); + update_rebuild_registry(); + // Redirect to the update information page if all requirements were met. install_goto('update.php?op=info'); }