=== added file 'includes/registry.inc' --- includes/registry.inc 1970-01-01 00:00:00 +0000 +++ includes/registry.inc 2008-04-15 14:37:56 +0000 @@ -0,0 +1,295 @@ + $patterns, 'implementations' => $implementations), 'cache_registry'); + module_implements('', FALSE, FALSE, FALSE); +} + +/** + * Parse all loadable files in a directory and save their function and class listings. + * + * @param $path + * The path relative to Drupal root to scan. + * @param $patterns + * The function pattern to identify as a hook. This allows to record what hook + * implementations exist, and in what module or file. + */ +function _registry_parse_directory($path, $patterns) { + static $map = array(T_FUNCTION => 'function', T_CLASS => 'class', T_INTERFACE => 'interface'); + + $active_modules = module_list(); + $active_modules['node_content'] = 'node_content'; + + $files = file_scan_directory($path, '\.(inc|module|install)$'); + foreach ($files as $filename => $file) { + $tokens = token_get_all(file_get_contents($filename)); + while ($token = next($tokens)) { + // Ignore all tokens except for those we are specifically saving. + if (is_array($token) && isset($map[$token[0]])) { + $type = $map[$token[0]]; + if ($resource_name = _registry_get_resource_name($tokens, $type)) { + $module = _registry_get_resource_module($resource_name, $filename, $type); + if ($module != 'includes' && !isset($active_modules[$module])) { + // If this is a disabled module then we skip the entire file. + continue 2; + } + $hook = _registry_get_resource_hook($resource_name, $module, $patterns); + + // Now save the resource record to the database. + $result = _registry_save_resource($resource_name, $type, $module, $hook, $filename); + // We skip the body because classes may contain functions. + _registry_skip_body($tokens); + } + } + } + } +} + +/** + * Derive the name of the next resource in the token stream. + * + * @param $tokens + * The collection of tokens for the current file being parsed. + * @param $type + * The human-readable token name, either: "function", "class", or "interface". + * @return + * The name of the resource, or FALSE if the resource has already been processed. + */ +function _registry_get_resource_name(&$tokens, $type) { + // Keep a running list of all resources we've saved so far, so that we never + // save one more than once. + static $resources; + + // Determine the name of the resource. + next($tokens); // Eat a space. + $token = next($tokens); + if ($token == '&') { + $token = next($tokens); + } + $resource_name = $token[1]; + + // Ensure that we never save it more than once. + if (isset($resources[$type][$resource_name])) { + return FALSE; + } + $resources[$type][$resource_name] = TRUE; + + return $resource_name; +} + +/** + * Determine the module to which a given resource belongs. + * + * In the case of node "hooks", the module is determined by calculating all + * possible node hooks with their corresponding module. Otherwise, the module + * is derived from the file name or directory name of the file. + * + * Detectable files follow one of the following patterns: + * - .module + * - .install + * - ..inc + * - /.inc + * + * Note that the last option will treat any code in Drupal's core "includes" + * directory as belonging to the module "includes". This is by design. + * + * In order for a module to provide a hook on behalf of another module, the + * name of the file containing the implementation must match the module the hook + * applies to, not the providing module. That is, if module foo provides the + * implementation of hook_example() on behalf of module bar, then the function + * must reside in foo/bar.something.inc for it to associate with module bar + * correctly. + * + * @param $resource_name + * The name of the resource; the function or class name. + * @param $filename + * The name of the file in which the resource resides, relative to Drupal root. + * @param $type + * A string, possible values are function, class, interface. + * @return + * The name of the module that "owns" the resource. + */ +function _registry_get_resource_module($resource_name, $filename, $type) { + static $dirs, $node_functions; + + // Node "hooks" aren't "real hooks", but still get called indirectly. Therefore, + // we build up a list of all possible node hooks for the current node types + // to match against later. + if (empty($node_functions)) { + $types = node_get_types(); + foreach ($types as $node_type) { + $module = $node_type->module == 'node' ? 'node_content' : $node_type->module; + foreach (array('load', 'validate', 'delete', 'insert', 'update', 'view', 'access', 'prepare', 'form') as $hook) { + $node_functions[$module .'_'. $hook] = $module; + } + } + } + + // Extract the module from the file name or directory name. + $file_parts = explode('.', $filename); + $module = ''; + $hook = ''; + $count = count($file_parts); + if (isset($node_functions[$resource_name]) && $type == 'function') { + $module = $node_functions[$resource_name]; + } + else { + if ($count == 2 && $file_parts[1] == 'inc') { + if (!isset($dirs[$filename])) { + $dir_parts = explode('/', $file_parts[0]); + array_pop($dir_parts); + $dirs[$filename] = array_pop($dir_parts); + } + $module = $dirs[$filename]; + } + if (($count == 2 && ($file_parts[1] == 'module' || $file_parts[1] == 'install')) || ($count == 3 && $file_parts[2] == 'inc')) { + $module = basename($file_parts[0]); + } + } + + return $module; +} + +/** + * Determine what hook this resource could be an implementation for. + * + * We record the hook for a given function so that we can easily request, + * in a single query, all hook implementations for a given hook. In most + * cases, this is a simple mapping. However, Drupal also supports dynamic + * hook names, such as hook_form_$form_id_alter. For those, we use + * module-provided patterns from hook_hooks() to determine the dynamic hook + * corresponding to this resource. + * + * Note that this mechanism generates false-positives for functions that + * are not actually hook implementations. This is OK, because they will never + * be queried by hook anyway. + * + * @param $resource_name + * The name of the resource; the function or class name. + * @param $module + * The name of the module providing the resource. + * @param $patterns + * A list of dynamic hook patterns to match against. + * @return + * The hook for which this resource is a potential implementation. + */ +function _registry_get_resource_hook($resource_name, $module, $patterns) { + $hook = ''; + if ($module && strpos($resource_name, $module) === 0) { + $hook = substr($resource_name, strlen($module) + 1); + foreach ($patterns as $pattern) { + if (preg_match($pattern, $hook)) { + // If it is a dynamic hook, queue up that information for later caching. + _registry_hook_implementations($hook, $module); + } + } + } + return $hook; +} + +/** + * Save a resource into the database. + * + * @param $resource_name + * The name of the resource; the function or class name. + * @param $type + * The human-readable token name, either "function", "class", or "interface". + * @param $module + * The name of the module providing the resource. + * @param $hook + * The hook this resource is an implementation for. + * @param $filename + * The name of the file where the resource resides, relative to Drupal root. + */ +function _registry_save_resource($resource_name, $type, $module, $hook, $filename) { + db_query("INSERT INTO {registry} (name, type, module, hook, file) VALUES ('%s', '%s', '%s', '%s', '%s')", array($resource_name, $type, $module, $hook, "./$filename")); +} + +/** + * Store the hook/module implementation information that we need to cache. + */ +function _registry_hook_implementations($hook = NULL, $module = NULL) { + static $implementations; + + if (isset($hook)) { + $implementations[$hook][] = $module; + } + else { + return $implementations; + } +} + +/** + * Skip the body of a code block, as defined by { and }. + * + * This function assumes that the body starts at the next instance + * of { from the current position. + * + * @param $tokens + */ +function _registry_skip_body(&$tokens) { + $num_braces = 1; + + $token = ''; + // Get to the first open brace. + while ($token != '{' && ($token = next($tokens))); + + // Scan through the rest of the tokens until we reach the matching + // end brace. + while ($num_braces && ($token = next($tokens))) { + if ($token == '{') { + ++$num_braces; + } + elseif ($token == '}') { + --$num_braces; + } + } +} + +/** + * @} End of "defgroup registry". + */ Index: install.php =================================================================== RCS file: /cvs/drupal/drupal/install.php,v retrieving revision 1.117 diff -u -r1.117 install.php --- install.php 14 Apr 2008 17:48:33 -0000 1.117 +++ install.php 17 Apr 2008 09:12:31 -0000 @@ -785,8 +785,9 @@ // The end of the install process. Remember profile used. if ($task == 'done') { - // Rebuild menu to get content type links registered by the profile, - // and possibly any other menu items created through the tasks. + // Rebuild menu and registry to get content type links registered by the + // profile, and possibly any other menu items created through the tasks. + drupal_rebuild_code_registry(); menu_rebuild(); // Register actions declared by any modules. Index: includes/bootstrap.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/bootstrap.inc,v retrieving revision 1.208 diff -u -r1.208 bootstrap.inc --- includes/bootstrap.inc 14 Apr 2008 17:48:33 -0000 1.208 +++ includes/bootstrap.inc 17 Apr 2008 09:12:34 -0000 @@ -949,6 +949,9 @@ // Initialize the default database. require_once './includes/database.inc'; db_set_active(); + // Register autoload functions so that we can access classes and interfaces. + spl_autoload_register('drupal_autoload_class'); + spl_autoload_register('drupal_autoload_interface'); break; case DRUPAL_BOOTSTRAP_ACCESS: @@ -1134,3 +1137,133 @@ return $ip_address; } + +/** + * @ingroup registry + * @{ + */ + +/** + * Confirm that a function is available. + * + * If the function is already available, this function does nothing. + * If the function is not available, it tries to load the file where the + * function lives. If the file is not available, it returns false, so that it + * can be used as a drop-in replacement for function_exists(). + * + * @param $function + * The name of the function to check or load. + * @return + * TRUE if the function is now available, FALSE otherwise. + */ +function drupal_function_exists($function) { + static $checked = array(); + if (isset($checked[$function])) { + return $checked[$function]; + } + if (!function_exists($function) && !defined('MAINTENANCE_MODE')) { + $file = db_result(db_query("SELECT file FROM {registry} WHERE name = '%s' AND type = '%s'", array($function, 'function'))); + if ($file) { + require_once($file); + } + } + $exists = function_exists($function); + $checked[$function] = $exists; + return $exists; +} + +/** + * Confirm that an interface is available. + * + * This function parallels drupal_function_exists(), but is rarely + * called directly. Instead, it is registered as an spl_autoload() + * handler, and PHP calls it for us when necessary. + * + * @param $interface + * The name of the interface to check or load. + * @return + * TRUE if the interface is currently available, FALSE otherwise. + */ +function drupal_autoload_interface($interface) { + return _registry_check_code('interface', $interface); +} + +/** + * Confirm that a class is available. + * + * This function parallels drupal_function_exists(), but is rarely + * called directly. Instead, it is registered as an spl_autoload() + * handler, and PHP calls it for us when necessary. + * + * @param $class + * The name of the class to check or load. + * @return + * TRUE if the class is currently available, FALSE otherwise. + */ +function drupal_autoload_class($class) { + return _registry_check_code('class', $class); +} + +/** + * Helper for registry_check_{interface, class}. + */ +function _registry_check_code($type, $name) { + $file = db_result(db_query("SELECT file FROM {registry} WHERE name = '%s' AND type = '%s'", $name, $type)); + if ($file) { + require_once($file); + registry_mark_file($file); + return TRUE; + } +} + +/** + * Collect the files included, so that they can be preloaded on the next + * pageload. + * + * The function collects the files as the registry includes them. At the + * end of the page request it stores them per router path. + * + * @param $file + * A file or an array of files included. + * @param $store + * If true, then store the collected array of files into the database as + * necessary. + */ +function registry_mark_file($file = NULL, $store = FALSE) { + static $used_files = array(), $original_files = array(); + + if (isset($file)) { + if (is_array($file)) { + if (empty($original_files)) { + $original_files = $file; + } + $used_files = array_merge($used_files, $file); + } + else { + $used_files[] = $file; + } + } + elseif ($store && $used_files != $original_files && $_SERVER['REQUEST_METHOD'] == 'GET') { + // Files we will likely need next time. + $files = array_unique($used_files); + // Faster and more memory-efficient than serialize. + $files = implode(';', $files); + $menu = menu_get_item(); + cache_set('registry:' . $menu['path'], $files, 'cache_registry'); + } +} + +/** + * Rescan all enabled modules and rebuild the registry. + * + * Rescans all code in modules or includes directory, storing a mapping of + * each function, file, and hook implementation in the database. + */ +function drupal_rebuild_code_registry() { + require_once './includes/registry.inc'; + _drupal_rebuild_code_registry(); +} + +/** + * @} End of "ingroup registry". + */ Index: includes/common.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/common.inc,v retrieving revision 1.764 diff -u -r1.764 common.inc --- includes/common.inc 14 Apr 2008 17:48:33 -0000 1.764 +++ includes/common.inc 17 Apr 2008 09:12:43 -0000 @@ -1463,6 +1463,8 @@ if (variable_get('cache', CACHE_DISABLED) != CACHE_DISABLED) { page_set_cache(); } + // Store the used registry files. + registry_mark_file(NULL, TRUE); module_invoke_all('exit'); } @@ -2700,7 +2702,7 @@ // element is rendered into the final text. if (isset($elements['#pre_render'])) { foreach ($elements['#pre_render'] as $function) { - if (function_exists($function)) { + if (drupal_function_exists($function)) { $elements = $function($elements); } } @@ -2762,7 +2764,7 @@ // which allows the output'ed text to be filtered. if (isset($elements['#post_render'])) { foreach ($elements['#post_render'] as $function) { - if (function_exists($function)) { + if (drupal_function_exists($function)) { $content = $function($content, $elements); } } @@ -3142,7 +3144,7 @@ */ function drupal_get_schema_unprocessed($module, $table = NULL) { // Load the .install file to get hook_schema. - module_load_include('install', $module); + module_load_install($module); $schema = module_invoke($module, 'schema'); if (!is_null($table) && isset($schema[$table])) { @@ -3528,6 +3530,10 @@ // Change query-strings on css/js files to enforce reload for all users. _drupal_flush_css_js(); + // Because the registry is rebuilt before the registry cache is cleared, + // there should be nearly no risk of someone visiting the site and finding an + // empty registry. + drupal_rebuild_code_registry(); drupal_clear_css_cache(); drupal_clear_js_cache(); system_theme_data(); @@ -3536,7 +3542,7 @@ node_types_rebuild(); // Don't clear cache_form - in-progress form submissions may break. // Ordered so clearing the page cache will always be the last action. - $core = array('cache', 'cache_block', 'cache_filter', 'cache_page'); + $core = array('cache', 'cache_block', 'cache_filter', 'cache_registry', 'cache_page'); $cache_tables = array_merge(module_invoke_all('flush_caches'), $core); foreach ($cache_tables as $table) { cache_clear_all('*', $table, TRUE); Index: includes/form.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/form.inc,v retrieving revision 1.270 diff -u -r1.270 form.inc --- includes/form.inc 14 Apr 2008 17:51:38 -0000 1.270 +++ includes/form.inc 17 Apr 2008 09:12:49 -0000 @@ -326,7 +326,7 @@ // We first check to see if there's a function named after the $form_id. // If there is, we simply pass the arguments on to it to get the form. - if (!function_exists($form_id)) { + if (!drupal_function_exists($form_id)) { // In cases where many form_ids need to share a central constructor function, // such as the node editing form, modules can implement hook_forms(). It // maps one or more form_ids to the correct constructor functions. @@ -347,6 +347,7 @@ } if (isset($form_definition['callback'])) { $callback = $form_definition['callback']; + drupal_function_exists($callback); } } @@ -503,13 +504,13 @@ $form += _element_info('form'); if (!isset($form['#validate'])) { - if (function_exists($form_id . '_validate')) { + if (drupal_function_exists($form_id . '_validate')) { $form['#validate'] = array($form_id . '_validate'); } } if (!isset($form['#submit'])) { - if (function_exists($form_id . '_submit')) { + if (drupal_function_exists($form_id . '_submit')) { // We set submit here so that it can be altered. $form['#submit'] = array($form_id . '_submit'); } @@ -711,7 +712,7 @@ // #value data. elseif (isset($elements['#element_validate'])) { foreach ($elements['#element_validate'] as $function) { - if (function_exists($function)) { + if (drupal_function_exists($function)) { $function($elements, $form_state, $complete_form); } } @@ -748,7 +749,7 @@ } foreach ($handlers as $function) { - if (function_exists($function)) { + if (drupal_function_exists($function)) { if ($type == 'submit' && ($batch =& batch_get())) { // Some previous _submit handler has set a batch. We store the call // in a special 'control' batch set, for execution at the correct @@ -1031,7 +1032,7 @@ // checkboxes and files. if (isset($form['#process']) && !$form['#processed']) { foreach ($form['#process'] as $process) { - if (function_exists($process)) { + if (drupal_function_exists($process)) { $form = $process($form, isset($edit) ? $edit : NULL, $form_state, $complete_form); } } Index: includes/install.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/install.inc,v retrieving revision 1.60 diff -u -r1.60 install.inc --- includes/install.inc 16 Apr 2008 11:35:51 -0000 1.60 +++ includes/install.inc 17 Apr 2008 09:12:50 -0000 @@ -326,7 +326,11 @@ } while ($moved); asort($module_list); $module_list = array_keys($module_list); + // During install, we do not want to use the registry-based module_implements + // code. + module_implements('', FALSE, FALSE, TRUE); array_filter($module_list, '_drupal_install_module'); + module_implements('', FALSE, FALSE, FALSE); module_enable($module_list); } @@ -687,8 +691,9 @@ $requirements = array(); foreach ($installs as $install) { require_once $install->filename; - if (module_hook($install->name, 'requirements')) { - $requirements = array_merge($requirements, module_invoke($install->name, 'requirements', 'install')); + $function = $install->name. '_requirements'; + if (function_exists($function)) { + $requirements = array_merge($requirements, $function('install')); } } return $requirements; Index: includes/mail.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/mail.inc,v retrieving revision 1.12 diff -u -r1.12 mail.inc --- includes/mail.inc 14 Apr 2008 17:48:33 -0000 1.12 +++ includes/mail.inc 17 Apr 2008 09:12:51 -0000 @@ -115,7 +115,7 @@ // Build the e-mail (get subject and body, allow additional headers) by // invoking hook_mail() on this module. We cannot use module_invoke() as // we need to have $message by reference in hook_mail(). - if (function_exists($function = $module . '_mail')) { + if (drupal_function_exists($function = $module . '_mail')) { $function($key, $message, $params); } Index: includes/menu.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/menu.inc,v retrieving revision 1.268 diff -u -r1.268 menu.inc --- includes/menu.inc 14 Apr 2008 17:48:33 -0000 1.268 +++ includes/menu.inc 17 Apr 2008 09:12:57 -0000 @@ -339,11 +339,18 @@ menu_rebuild(); } if ($router_item = menu_get_item($path)) { + $cache = cache_get('registry:' . $router_item['path'], 'cache_registry'); + if (!empty($cache->data)) { + $files = explode(';', $cache->data); + foreach($files as $file) { + require_once($file); + } + registry_mark_file($files); + } if ($router_item['access']) { - if ($router_item['file']) { - require_once($router_item['file']); + if (drupal_function_exists($router_item['page_callback'])) { + return call_user_func_array($router_item['page_callback'], $router_item['page_arguments']); } - return call_user_func_array($router_item['page_callback'], $router_item['page_arguments']); } else { return MENU_ACCESS_DENIED; @@ -2198,12 +2205,12 @@ $load_functions[$k] = NULL; } else { - if (function_exists($matches[1] . '_to_arg')) { + if (drupal_function_exists($matches[1] . '_to_arg')) { $to_arg_functions[$k] = $matches[1] . '_to_arg'; $load_functions[$k] = NULL; $match = TRUE; } - if (function_exists($matches[1] . '_load')) { + if (drupal_function_exists($matches[1] . '_load')) { $function = $matches[1] . '_load'; // Create an array of arguments that will be passed to the _load // function when this menu path is checked, if 'load arguments' @@ -2289,12 +2296,6 @@ if (!isset($item['page arguments']) && isset($parent['page arguments'])) { $item['page arguments'] = $parent['page arguments']; } - if (!isset($item['file']) && isset($parent['file'])) { - $item['file'] = $parent['file']; - } - if (!isset($item['file path']) && isset($parent['file path'])) { - $item['file path'] = $parent['file path']; - } } } } @@ -2322,34 +2323,25 @@ 'tab_parent' => '', 'tab_root' => $path, 'path' => $path, - 'file' => '', - 'file path' => '', - 'include file' => '', ); - // Calculate out the file to be included for each callback, if any. - if ($item['file']) { - $file_path = $item['file path'] ? $item['file path'] : drupal_get_path('module', $item['module']); - $item['include file'] = $file_path . '/' . $item['file']; - } - $title_arguments = $item['title arguments'] ? serialize($item['title arguments']) : ''; db_query("INSERT INTO {menu_router} (path, load_functions, to_arg_functions, access_callback, access_arguments, page_callback, page_arguments, fit, number_parts, tab_parent, tab_root, title, title_callback, title_arguments, - type, block_callback, description, position, weight, file) + type, block_callback, description, position, weight) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', - %d, '%s', '%s', '%s', %d, '%s')", + %d, '%s', '%s', '%s', %d)", $path, $item['load_functions'], $item['to_arg_functions'], $item['access callback'], serialize($item['access arguments']), $item['page callback'], serialize($item['page arguments']), $item['_fit'], $item['_number_parts'], $item['tab_parent'], $item['tab_root'], $item['title'], $item['title callback'], $title_arguments, - $item['type'], $item['block callback'], $item['description'], $item['position'], $item['weight'], $item['include file']); + $item['type'], $item['block callback'], $item['description'], $item['position'], $item['weight']); } // Sort the masks so they are in order of descending fit, and store them. $masks = array_keys($masks); Index: includes/module.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/module.inc,v retrieving revision 1.117 diff -u -r1.117 module.inc --- includes/module.inc 16 Apr 2008 11:35:51 -0000 1.117 +++ includes/module.inc 17 Apr 2008 09:12:58 -0000 @@ -221,7 +221,7 @@ */ function module_exists($module) { $list = module_list(); - return array_key_exists($module, $list); + return isset($list[$module]); } /** @@ -231,7 +231,14 @@ // Make sure the installation API is available include_once './includes/install.inc'; - module_load_include('install', $module); + $file = module_load_include('install', $module); + // Ensure that you can module_invoke something inside the newly-loaded + // file during install. + $module_list = module_list(); + if (!isset($module_list[$module])) { + $module_list[$module]['filename'] = $file; + module_list(TRUE, FALSE, FALSE, $module_list); + } } /** @@ -253,6 +260,7 @@ if (is_file($file)) { require_once $file; + return $file; } else { return FALSE; @@ -301,7 +309,7 @@ // We check for the existence of node_access_needs_rebuild() since // at install time, module_enable() could be called while node.module // is not enabled yet. - if (function_exists('node_access_needs_rebuild') && !node_access_needs_rebuild() && module_hook($module, 'node_grants')) { + if (drupal_function_exists('node_access_needs_rebuild') && !node_access_needs_rebuild() && module_hook($module, 'node_grants')) { node_access_needs_rebuild(TRUE); } } @@ -376,7 +384,8 @@ * implemented in that module. */ function module_hook($module, $hook) { - return function_exists($module . '_' . $hook); + $list = module_implements($hook); + return in_array($module, $list); } /** @@ -391,34 +400,73 @@ * For internal use only: Whether to force the stored list of hook * implementations to be regenerated (such as after enabling a new module, * before processing hook_enable). + * @param $set_dumb + * For internal use only: use a dumb, non-registry-based version. This only finds + * implementations in modules, not in includes. * @return * An array with the names of the modules which are implementing this hook. */ -function module_implements($hook, $sort = FALSE, $refresh = FALSE) { - static $implementations; +function module_implements($hook, $sort = FALSE, $refresh = FALSE, $set_dumb = NULL) { + static $implementations, $patterns, $loaded, $dumb; + if (isset($set_dumb)) { + $dumb = $set_dumb; + } + if (defined('MAINTENANCE_MODE') || !db_is_active() || $dumb) { + $list = module_list(); + $return = array(); + foreach ($list as $module) { + $function = $module . '_' . $hook; + if (function_exists($function)) { + $return[] = $module; + } + } + return $return; + } if ($refresh) { $implementations = array(); + cache_clear_all('hooks', 'cache_registry'); return; } - - if (!isset($implementations[$hook])) { - $implementations[$hook] = array(); - $list = module_list(FALSE, TRUE, $sort); - foreach ($list as $module) { - if (module_hook($module, $hook)) { - $implementations[$hook][] = $module; + if (empty($implementations)) { + $cache = cache_get('hooks', 'cache_registry'); + if (!$cache) { + drupal_rebuild_code_registry(); + $cache = cache_get('hooks', 'cache_registry'); + } + $implementations = $cache->data['implementations']; + $patterns = $cache->data['patterns']; + } + if (isset($implementations[$hook])) { + if (!isset($loaded[$hook])) { + $loaded[$hook] = TRUE; + foreach ($implementations[$hook] as $module) { + drupal_function_exists($module . '_' . $hook); } } + return (array)$implementations[$hook]; } - - // The explicit cast forces a copy to be made. This is needed because - // $implementations[$hook] is only a reference to an element of - // $implementations and if there are nested foreaches (due to nested node - // API calls, for example), they would both manipulate the same array's - // references, which causes some modules' hooks not to be called. - // See also http://www.zend.com/zend/art/ref-count.php. - return (array)$implementations[$hook]; + // We do not store empty arrays for every instance of dynamic hooks like + // hook_{$form_id}_form_alter. The actual implementations of dynamic + // hooks are cached by drupal_rebuild_code_registry so those are already + // returned. If the hook matches a pattern here, then we know that there is + // no implementation. + foreach ($patterns as $pattern) { + if (preg_match($pattern, $hook)) { + return array(); + } + } + // Other hooks are fetched from the registry and cached. + $implementations[$hook] = array(); + $result = db_query("SELECT module, name, file FROM {registry} WHERE hook = '%s' AND type = 'function'", $hook); + while ($entry = db_fetch_array($result)) { + if (!function_exists($entry['name'])) { + require_once($entry['file']); + } + $implementations[$hook][] = $entry['module']; + } + cache_set('hooks', array('patterns' => $patterns, 'implementations' => $implementations), 'cache_registry'); + return $implementations[$hook]; } /** Index: includes/theme.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/theme.inc,v retrieving revision 1.420 diff -u -r1.420 theme.inc --- includes/theme.inc 14 Apr 2008 17:48:33 -0000 1.420 +++ includes/theme.inc 17 Apr 2008 09:13:03 -0000 @@ -628,7 +628,7 @@ // call_user_func_array. $args = array(&$variables, $hook); foreach ($info['preprocess functions'] as $preprocess_function) { - if (function_exists($preprocess_function)) { + if (drupal_function_exists($preprocess_function)) { call_user_func_array($preprocess_function, $args); } } Index: includes/xmlrpcs.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/xmlrpcs.inc,v retrieving revision 1.25 diff -u -r1.25 xmlrpcs.inc --- includes/xmlrpcs.inc 14 Apr 2008 17:48:33 -0000 1.25 +++ includes/xmlrpcs.inc 17 Apr 2008 09:13:03 -0000 @@ -202,7 +202,7 @@ } } - if (!function_exists($method)) { + if (!drupal_function_exists($method)) { return xmlrpc_error(-32601, t('Server error. Requested function %method does not exist.', array("%method" => $method))); } // Call the mapped function Index: modules/aggregator/aggregator.module =================================================================== RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.module,v retrieving revision 1.377 diff -u -r1.377 aggregator.module --- modules/aggregator/aggregator.module 14 Apr 2008 17:48:34 -0000 1.377 +++ modules/aggregator/aggregator.module 17 Apr 2008 09:13:06 -0000 @@ -84,7 +84,6 @@ 'description' => "Configure which content your site aggregates from other sites, how often it polls them, and how they're categorized.", 'page callback' => 'aggregator_admin_overview', 'access arguments' => array('administer news feeds'), - 'file' => 'aggregator.admin.inc', ); $items['admin/content/aggregator/add/feed'] = array( 'title' => 'Add feed', @@ -93,7 +92,6 @@ 'access arguments' => array('administer news feeds'), 'type' => MENU_LOCAL_TASK, 'parent' => 'admin/content/aggregator', - 'file' => 'aggregator.admin.inc', ); $items['admin/content/aggregator/add/category'] = array( 'title' => 'Add category', @@ -102,7 +100,6 @@ 'access arguments' => array('administer news feeds'), 'type' => MENU_LOCAL_TASK, 'parent' => 'admin/content/aggregator', - 'file' => 'aggregator.admin.inc', ); $items['admin/content/aggregator/remove/%aggregator_feed'] = array( 'title' => 'Remove items', @@ -110,7 +107,6 @@ 'page arguments' => array('aggregator_admin_remove_feed', 4), 'access arguments' => array('administer news feeds'), 'type' => MENU_CALLBACK, - 'file' => 'aggregator.admin.inc', ); $items['admin/content/aggregator/update/%aggregator_feed'] = array( 'title' => 'Update items', @@ -118,7 +114,6 @@ 'page arguments' => array(4), 'access arguments' => array('administer news feeds'), 'type' => MENU_CALLBACK, - 'file' => 'aggregator.admin.inc', ); $items['admin/content/aggregator/list'] = array( 'title' => 'List', @@ -132,40 +127,34 @@ 'type' => MENU_LOCAL_TASK, 'weight' => 10, 'access arguments' => array('administer news feeds'), - 'file' => 'aggregator.admin.inc', ); $items['aggregator'] = array( 'title' => 'Feed aggregator', 'page callback' => 'aggregator_page_last', 'access arguments' => array('access news feeds'), 'weight' => 5, - 'file' => 'aggregator.pages.inc', ); $items['aggregator/sources'] = array( 'title' => 'Sources', 'page callback' => 'aggregator_page_sources', 'access arguments' => array('access news feeds'), - 'file' => 'aggregator.pages.inc', ); $items['aggregator/categories'] = array( 'title' => 'Categories', 'page callback' => 'aggregator_page_categories', 'access callback' => '_aggregator_has_categories', - 'file' => 'aggregator.pages.inc', ); $items['aggregator/rss'] = array( 'title' => 'RSS feed', 'page callback' => 'aggregator_page_rss', 'access arguments' => array('access news feeds'), 'type' => MENU_CALLBACK, - 'file' => 'aggregator.pages.inc', ); $items['aggregator/opml'] = array( 'title' => 'OPML feed', 'page callback' => 'aggregator_page_opml', 'access arguments' => array('access news feeds'), 'type' => MENU_CALLBACK, - 'file' => 'aggregator.pages.inc', ); $items['aggregator/categories/%aggregator_category'] = array( 'title callback' => '_aggregator_category_title', @@ -174,7 +163,6 @@ 'page arguments' => array(2), 'access callback' => 'user_access', 'access arguments' => array('access news feeds'), - 'file' => 'aggregator.pages.inc', ); $items['aggregator/categories/%aggregator_category/view'] = array( 'title' => 'View', @@ -187,7 +175,6 @@ 'page arguments' => array('aggregator_page_category', 2), 'access arguments' => array('administer news feeds'), 'type' => MENU_LOCAL_TASK, - 'file' => 'aggregator.pages.inc', ); $items['aggregator/categories/%aggregator_category/configure'] = array( 'title' => 'Configure', @@ -196,13 +183,11 @@ 'access arguments' => array('administer news feeds'), 'type' => MENU_LOCAL_TASK, 'weight' => 1, - 'file' => 'aggregator.admin.inc', ); $items['aggregator/sources/%aggregator_feed'] = array( 'page callback' => 'aggregator_page_source', 'page arguments' => array(2), 'type' => MENU_CALLBACK, - 'file' => 'aggregator.pages.inc', ); $items['aggregator/sources/%aggregator_feed/view'] = array( 'title' => 'View', @@ -215,7 +200,6 @@ 'page arguments' => array('aggregator_page_source', 2), 'access arguments' => array('administer news feeds'), 'type' => MENU_LOCAL_TASK, - 'file' => 'aggregator.pages.inc', ); $items['aggregator/sources/%aggregator_feed/configure'] = array( 'title' => 'Configure', @@ -224,7 +208,6 @@ 'access arguments' => array('administer news feeds'), 'type' => MENU_LOCAL_TASK, 'weight' => 1, - 'file' => 'aggregator.admin.inc', ); $items['admin/content/aggregator/edit/feed/%aggregator_feed'] = array( 'title' => 'Edit feed', @@ -232,7 +215,6 @@ 'page arguments' => array('aggregator_form_feed', 5), 'access arguments' => array('administer news feeds'), 'type' => MENU_CALLBACK, - 'file' => 'aggregator.admin.inc', ); $items['admin/content/aggregator/edit/category/%aggregator_category'] = array( 'title' => 'Edit category', @@ -240,7 +222,6 @@ 'page arguments' => array('aggregator_form_category', 5), 'access arguments' => array('administer news feeds'), 'type' => MENU_CALLBACK, - 'file' => 'aggregator.admin.inc', ); return $items; Index: modules/block/block.module =================================================================== RCS file: /cvs/drupal/drupal/modules/block/block.module,v retrieving revision 1.303 diff -u -r1.303 block.module --- modules/block/block.module 16 Apr 2008 11:35:51 -0000 1.303 +++ modules/block/block.module 17 Apr 2008 09:13:07 -0000 @@ -120,7 +120,6 @@ 'description' => 'Configure what block content appears in your site\'s sidebars and other regions.', 'page callback' => 'block_admin_display', 'access arguments' => array('administer blocks'), - 'file' => 'block.admin.inc', ); $items['admin/build/block/list'] = array( 'title' => 'List', @@ -131,28 +130,24 @@ 'title' => 'JavaScript List Form', 'page callback' => 'block_admin_display_js', 'type' => MENU_CALLBACK, - 'file' => 'block.admin.inc', ); $items['admin/build/block/configure'] = array( 'title' => 'Configure block', 'page callback' => 'drupal_get_form', 'page arguments' => array('block_admin_configure'), 'type' => MENU_CALLBACK, - 'file' => 'block.admin.inc', ); $items['admin/build/block/delete'] = array( 'title' => 'Delete block', 'page callback' => 'drupal_get_form', 'page arguments' => array('block_box_delete'), 'type' => MENU_CALLBACK, - 'file' => 'block.admin.inc', ); $items['admin/build/block/add'] = array( 'title' => 'Add block', 'page callback' => 'drupal_get_form', 'page arguments' => array('block_add_block_form'), 'type' => MENU_LOCAL_TASK, - 'file' => 'block.admin.inc', ); $default = variable_get('theme_default', 'garland'); foreach (list_themes() as $key => $theme) { @@ -161,7 +156,6 @@ 'page arguments' => array($key), 'type' => $key == $default ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK, 'weight' => $key == $default ? -10 : 0, - 'file' => 'block.admin.inc', 'access callback' => '_block_themes_access', 'access arguments' => array($theme), ); Index: modules/blog/blog.module =================================================================== RCS file: /cvs/drupal/drupal/modules/blog/blog.module,v retrieving revision 1.301 diff -u -r1.301 blog.module --- modules/blog/blog.module 14 Apr 2008 17:48:34 -0000 1.301 +++ modules/blog/blog.module 17 Apr 2008 09:13:08 -0000 @@ -138,7 +138,6 @@ 'page callback' => 'blog_page_last', 'access arguments' => array('access content'), 'type' => MENU_SUGGESTED_ITEM, - 'file' => 'blog.pages.inc', ); $items['blog/%user_current'] = array( 'title' => 'My blog', @@ -146,7 +145,6 @@ 'page arguments' => array(1), 'access callback' => 'user_access', 'access arguments' => array('create blog content', 1), - 'file' => 'blog.pages.inc', ); $items['blog/%user/feed'] = array( 'title' => 'Blogs', @@ -154,14 +152,12 @@ 'page arguments' => array(1), 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, - 'file' => 'blog.pages.inc', ); $items['blog/feed'] = array( 'title' => 'Blogs', 'page callback' => 'blog_feed_last', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, - 'file' => 'blog.pages.inc', ); return $items; Index: modules/book/book.module =================================================================== RCS file: /cvs/drupal/drupal/modules/book/book.module,v retrieving revision 1.460 diff -u -r1.460 book.module --- modules/book/book.module 14 Apr 2008 17:48:35 -0000 1.460 +++ modules/book/book.module 17 Apr 2008 09:13:11 -0000 @@ -85,7 +85,6 @@ 'description' => "Manage your site's book outlines.", 'page callback' => 'book_admin_overview', 'access arguments' => array('administer book outlines'), - 'file' => 'book.admin.inc', ); $items['admin/content/book/list'] = array( 'title' => 'List', @@ -98,7 +97,6 @@ 'access arguments' => array('administer site configuration'), 'type' => MENU_LOCAL_TASK, 'weight' => 8, - 'file' => 'book.admin.inc', ); $items['admin/content/book/%node'] = array( 'title' => 'Re-order book pages and change titles', @@ -107,21 +105,18 @@ 'access callback' => '_book_outline_access', 'access arguments' => array(3), 'type' => MENU_CALLBACK, - 'file' => 'book.admin.inc', ); $items['book'] = array( 'title' => 'Books', 'page callback' => 'book_render', 'access arguments' => array('access content'), 'type' => MENU_SUGGESTED_ITEM, - 'file' => 'book.pages.inc', ); $items['book/export/%/%'] = array( 'page callback' => 'book_export', 'page arguments' => array(2, 3), 'access arguments' => array('access printer-friendly version'), 'type' => MENU_CALLBACK, - 'file' => 'book.pages.inc', ); $items['node/%node/outline'] = array( 'title' => 'Outline', @@ -131,7 +126,6 @@ 'access arguments' => array(1), 'type' => MENU_LOCAL_TASK, 'weight' => 2, - 'file' => 'book.pages.inc', ); $items['node/%node/outline/remove'] = array( 'title' => 'Remove from outline', @@ -140,13 +134,11 @@ 'access callback' => '_book_outline_remove_access', 'access arguments' => array(1), 'type' => MENU_CALLBACK, - 'file' => 'book.pages.inc', ); $items['book/js/form'] = array( 'page callback' => 'book_form_update', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, - 'file' => 'book.pages.inc', ); return $items; } Index: modules/comment/comment.module =================================================================== RCS file: /cvs/drupal/drupal/modules/comment/comment.module,v retrieving revision 1.627 diff -u -r1.627 comment.module --- modules/comment/comment.module 16 Apr 2008 11:26:28 -0000 1.627 +++ modules/comment/comment.module 17 Apr 2008 09:13:16 -0000 @@ -176,7 +176,6 @@ 'description' => 'List and edit site comments and the comment moderation queue.', 'page callback' => 'comment_admin', 'access arguments' => array('administer comments'), - 'file' => 'comment.admin.inc', ); // Tabs: @@ -189,7 +188,6 @@ 'title' => 'Approval queue', 'page arguments' => array('approval'), 'type' => MENU_LOCAL_TASK, - 'file' => 'comment.admin.inc', ); $items['comment/delete'] = array( @@ -197,7 +195,6 @@ 'page callback' => 'comment_delete', 'access arguments' => array('administer comments'), 'type' => MENU_CALLBACK, - 'file' => 'comment.admin.inc', ); $items['comment/edit'] = array( @@ -205,7 +202,6 @@ 'page callback' => 'comment_edit', 'access arguments' => array('post comments'), 'type' => MENU_CALLBACK, - 'file' => 'comment.pages.inc', ); $items['comment/reply/%node'] = array( 'title' => 'Reply to comment', @@ -214,7 +210,6 @@ 'access callback' => 'node_access', 'access arguments' => array('view', 2), 'type' => MENU_CALLBACK, - 'file' => 'comment.pages.inc', ); return $items; Index: modules/contact/contact.module =================================================================== RCS file: /cvs/drupal/drupal/modules/contact/contact.module,v retrieving revision 1.105 diff -u -r1.105 contact.module --- modules/contact/contact.module 14 Apr 2008 17:48:36 -0000 1.105 +++ modules/contact/contact.module 17 Apr 2008 09:13:16 -0000 @@ -51,13 +51,11 @@ 'description' => 'Create a system contact form and set up categories for the form to use.', 'page callback' => 'contact_admin_categories', 'access arguments' => array('administer site-wide contact form'), - 'file' => 'contact.admin.inc', ); $items['admin/build/contact/list'] = array( 'title' => 'List', 'page callback' => 'contact_admin_categories', 'type' => MENU_DEFAULT_LOCAL_TASK, - 'file' => 'contact.admin.inc', ); $items['admin/build/contact/add'] = array( 'title' => 'Add category', @@ -65,21 +63,18 @@ 'page arguments' => array('contact_admin_edit', 3), 'type' => MENU_LOCAL_TASK, 'weight' => 1, - 'file' => 'contact.admin.inc', ); $items['admin/build/contact/edit/%contact'] = array( 'title' => 'Edit contact category', 'page callback' => 'drupal_get_form', 'page arguments' => array('contact_admin_edit', 3, 4), 'type' => MENU_CALLBACK, - 'file' => 'contact.admin.inc', ); $items['admin/build/contact/delete/%contact'] = array( 'title' => 'Delete contact', 'page callback' => 'drupal_get_form', 'page arguments' => array('contact_admin_delete', 4), 'type' => MENU_CALLBACK, - 'file' => 'contact.admin.inc', ); $items['admin/build/contact/settings'] = array( 'title' => 'Settings', @@ -87,14 +82,12 @@ 'page arguments' => array('contact_admin_settings'), 'type' => MENU_LOCAL_TASK, 'weight' => 2, - 'file' => 'contact.admin.inc', ); $items['contact'] = array( 'title' => 'Contact', 'page callback' => 'contact_site_page', 'access arguments' => array('access site-wide contact form'), 'type' => MENU_SUGGESTED_ITEM, - 'file' => 'contact.pages.inc', ); $items['user/%user/contact'] = array( 'title' => 'Contact', @@ -104,7 +97,6 @@ 'access callback' => '_contact_user_tab_access', 'access arguments' => array(1), 'weight' => 2, - 'file' => 'contact.pages.inc', ); return $items; } Index: modules/dblog/dblog.module =================================================================== RCS file: /cvs/drupal/drupal/modules/dblog/dblog.module,v retrieving revision 1.23 diff -u -r1.23 dblog.module --- modules/dblog/dblog.module 14 Apr 2008 17:48:36 -0000 1.23 +++ modules/dblog/dblog.module 17 Apr 2008 09:13:17 -0000 @@ -47,7 +47,6 @@ 'description' => 'Settings for logging to the Drupal database logs. This is the most common method for small to medium sites on shared hosting. The logs are viewable from the admin pages.', 'page callback' => 'drupal_get_form', 'page arguments' => array('dblog_admin_settings'), - 'file' => 'dblog.admin.inc', ); $items['admin/reports/dblog'] = array( @@ -55,28 +54,24 @@ 'description' => 'View events that have recently been logged.', 'page callback' => 'dblog_overview', 'weight' => -1, - 'file' => 'dblog.admin.inc', ); $items['admin/reports/page-not-found'] = array( 'title' => "Top 'page not found' errors", 'description' => "View 'page not found' errors (404s).", 'page callback' => 'dblog_top', 'page arguments' => array('page not found'), - 'file' => 'dblog.admin.inc', ); $items['admin/reports/access-denied'] = array( 'title' => "Top 'access denied' errors", 'description' => "View 'access denied' errors (403s).", 'page callback' => 'dblog_top', 'page arguments' => array('access denied'), - 'file' => 'dblog.admin.inc', ); $items['admin/reports/event/%'] = array( 'title' => 'Details', 'page callback' => 'dblog_event', 'page arguments' => array(3), 'type' => MENU_CALLBACK, - 'file' => 'dblog.admin.inc', ); return $items; } Index: modules/filter/filter.module =================================================================== RCS file: /cvs/drupal/drupal/modules/filter/filter.module,v retrieving revision 1.209 diff -u -r1.209 filter.module --- modules/filter/filter.module 14 Apr 2008 17:48:37 -0000 1.209 +++ modules/filter/filter.module 17 Apr 2008 09:13:20 -0000 @@ -73,7 +73,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('filter_admin_overview'), 'access arguments' => array('administer filters'), - 'file' => 'filter.admin.inc', ); $items['admin/settings/filters/list'] = array( 'title' => 'List', @@ -84,21 +83,18 @@ 'page callback' => 'filter_admin_format_page', 'type' => MENU_LOCAL_TASK, 'weight' => 1, - 'file' => 'filter.admin.inc', ); $items['admin/settings/filters/delete'] = array( 'title' => 'Delete input format', 'page callback' => 'drupal_get_form', 'page arguments' => array('filter_admin_delete'), 'type' => MENU_CALLBACK, - 'file' => 'filter.admin.inc', ); $items['filter/tips'] = array( 'title' => 'Compose tips', 'page callback' => 'filter_tips_long', 'access callback' => TRUE, 'type' => MENU_SUGGESTED_ITEM, - 'file' => 'filter.pages.inc', ); $items['admin/settings/filters/%filter_format'] = array( 'type' => MENU_CALLBACK, @@ -107,14 +103,12 @@ 'page callback' => 'filter_admin_format_page', 'page arguments' => array(3), 'access arguments' => array('administer filters'), - 'file' => 'filter.admin.inc', ); $items['admin/settings/filters/%filter_format/edit'] = array( 'title' => 'Edit', 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => 0, - 'file' => 'filter.admin.inc', ); $items['admin/settings/filters/%filter_format/configure'] = array( 'title' => 'Configure', @@ -122,7 +116,6 @@ 'page arguments' => array(3), 'type' => MENU_LOCAL_TASK, 'weight' => 1, - 'file' => 'filter.admin.inc', ); $items['admin/settings/filters/%filter_format/order'] = array( 'title' => 'Rearrange', @@ -130,7 +123,6 @@ 'page arguments' => array(3), 'type' => MENU_LOCAL_TASK, 'weight' => 2, - 'file' => 'filter.admin.inc', ); return $items; } Index: modules/forum/forum.module =================================================================== RCS file: /cvs/drupal/drupal/modules/forum/forum.module,v retrieving revision 1.454 diff -u -r1.454 forum.module --- modules/forum/forum.module 14 Apr 2008 17:48:37 -0000 1.454 +++ modules/forum/forum.module 17 Apr 2008 09:13:23 -0000 @@ -87,7 +87,6 @@ 'page callback' => 'forum_page', 'access arguments' => array('access content'), 'type' => MENU_SUGGESTED_ITEM, - 'file' => 'forum.pages.inc', ); $items['admin/content/forum'] = array( 'title' => 'Forums', @@ -95,7 +94,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('forum_overview'), 'access arguments' => array('administer forums'), - 'file' => 'forum.admin.inc', ); $items['admin/content/forum/list'] = array( 'title' => 'List', @@ -108,7 +106,6 @@ 'page arguments' => array('container'), 'type' => MENU_LOCAL_TASK, 'parent' => 'admin/content/forum', - 'file' => 'forum.admin.inc', ); $items['admin/content/forum/add/forum'] = array( 'title' => 'Add forum', @@ -116,7 +113,6 @@ 'page arguments' => array('forum'), 'type' => MENU_LOCAL_TASK, 'parent' => 'admin/content/forum', - 'file' => 'forum.admin.inc', ); $items['admin/content/forum/settings'] = array( 'title' => 'Settings', @@ -125,26 +121,22 @@ 'weight' => 5, 'type' => MENU_LOCAL_TASK, 'parent' => 'admin/content/forum', - 'file' => 'forum.admin.inc', ); $items['admin/content/forum/edit/%forum_term'] = array( 'page callback' => 'forum_form_main', 'type' => MENU_CALLBACK, - 'file' => 'forum.admin.inc', ); $items['admin/content/forum/edit/container/%forum_term'] = array( 'title' => 'Edit container', 'page callback' => 'forum_form_main', 'page arguments' => array('container', 5), 'type' => MENU_CALLBACK, - 'file' => 'forum.admin.inc', ); $items['admin/content/forum/edit/forum/%forum_term'] = array( 'title' => 'Edit forum', 'page callback' => 'forum_form_main', 'page arguments' => array('forum', 5), 'type' => MENU_CALLBACK, - 'file' => 'forum.admin.inc', ); return $items; } Index: modules/help/help.module =================================================================== RCS file: /cvs/drupal/drupal/modules/help/help.module,v retrieving revision 1.79 diff -u -r1.79 help.module --- modules/help/help.module 14 Apr 2008 17:48:37 -0000 1.79 +++ modules/help/help.module 17 Apr 2008 09:13:23 -0000 @@ -15,7 +15,6 @@ 'page callback' => 'help_main', 'access arguments' => array('access administration pages'), 'weight' => 9, - 'file' => 'help.admin.inc', ); foreach (module_implements('help', TRUE) as $module) { @@ -24,7 +23,6 @@ 'page callback' => 'help_page', 'page arguments' => array(2), 'type' => MENU_CALLBACK, - 'file' => 'help.admin.inc', ); } Index: modules/menu/menu.module =================================================================== RCS file: /cvs/drupal/drupal/modules/menu/menu.module,v retrieving revision 1.161 diff -u -r1.161 menu.module --- modules/menu/menu.module 14 Apr 2008 17:48:37 -0000 1.161 +++ modules/menu/menu.module 17 Apr 2008 09:13:24 -0000 @@ -52,21 +52,18 @@ 'page callback' => 'menu_overview_page', 'access callback' => 'user_access', 'access arguments' => array('administer menu'), - 'file' => 'menu.admin.inc', ); $items['admin/build/menu/list'] = array( 'title' => 'List menus', 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10, - 'file' => 'menu.admin.inc', ); $items['admin/build/menu/add'] = array( 'title' => 'Add menu', 'page callback' => 'drupal_get_form', 'page arguments' => array('menu_edit_menu', 'add'), 'type' => MENU_LOCAL_TASK, - 'file' => 'menu.admin.inc', ); $items['admin/build/menu/settings'] = array( 'title' => 'Settings', @@ -74,7 +71,6 @@ 'page arguments' => array('menu_configure'), 'type' => MENU_LOCAL_TASK, 'weight' => 5, - 'file' => 'menu.admin.inc', ); $items['admin/build/menu-customize/%menu'] = array( 'title' => 'Customize menu', @@ -84,55 +80,47 @@ 'title arguments' => array(3), 'access arguments' => array('administer menu'), 'type' => MENU_CALLBACK, - 'file' => 'menu.admin.inc', ); $items['admin/build/menu-customize/%menu/list'] = array( 'title' => 'List items', 'weight' => -10, 'type' => MENU_DEFAULT_LOCAL_TASK, - 'file' => 'menu.admin.inc', ); $items['admin/build/menu-customize/%menu/add'] = array( 'title' => 'Add item', 'page callback' => 'drupal_get_form', 'page arguments' => array('menu_edit_item', 'add', NULL, 3), 'type' => MENU_LOCAL_TASK, - 'file' => 'menu.admin.inc', ); $items['admin/build/menu-customize/%menu/edit'] = array( 'title' => 'Edit menu', 'page callback' => 'drupal_get_form', 'page arguments' => array('menu_edit_menu', 'edit', 3), 'type' => MENU_LOCAL_TASK, - 'file' => 'menu.admin.inc', ); $items['admin/build/menu-customize/%menu/delete'] = array( 'title' => 'Delete menu', 'page callback' => 'menu_delete_menu_page', 'page arguments' => array(3), 'type' => MENU_CALLBACK, - 'file' => 'menu.admin.inc', ); $items['admin/build/menu/item/%menu_link/edit'] = array( 'title' => 'Edit menu item', 'page callback' => 'drupal_get_form', 'page arguments' => array('menu_edit_item', 'edit', 4, NULL), 'type' => MENU_CALLBACK, - 'file' => 'menu.admin.inc', ); $items['admin/build/menu/item/%menu_link/reset'] = array( 'title' => 'Reset menu item', 'page callback' => 'drupal_get_form', 'page arguments' => array('menu_reset_item_confirm', 4), 'type' => MENU_CALLBACK, - 'file' => 'menu.admin.inc', ); $items['admin/build/menu/item/%menu_link/delete'] = array( 'title' => 'Delete menu item', 'page callback' => 'menu_item_delete_page', 'page arguments' => array(4), 'type' => MENU_CALLBACK, - 'file' => 'menu.admin.inc', ); return $items; Index: modules/node/node.module =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.module,v retrieving revision 1.956 diff -u -r1.956 node.module --- modules/node/node.module 14 Apr 2008 17:48:38 -0000 1.956 +++ modules/node/node.module 17 Apr 2008 09:13:30 -0000 @@ -626,7 +626,8 @@ function node_hook(&$node, $hook) { $module = node_get_types('module', $node); if ($module == 'node') { - $module = 'node_content'; // Avoid function name collisions. + // Avoid function name collisions. + $module = 'node_content'; } return module_hook($module, $hook); } @@ -926,7 +927,9 @@ db_query('UPDATE {node} SET vid = %d WHERE nid = %d', $node->vid, $node->nid); } - // Call the node specific callback (if any). + // Call the node specific callback (if any). This can be + // node_invoke($node, 'insert') or + // node_invoke($node, 'update'). node_invoke($node, $op); node_invoke_nodeapi($node, $op); @@ -1406,7 +1409,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('node_admin_content'), 'access arguments' => array('administer nodes'), - 'file' => 'node.admin.inc', ); $items['admin/content/node/overview'] = array( @@ -1421,12 +1423,10 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('node_configure'), 'access arguments' => array('administer nodes'), - 'file' => 'node.admin.inc', ); $items['admin/content/node-settings/rebuild'] = array( 'title' => 'Rebuild permissions', 'page arguments' => array('node_configure_rebuild_confirm'), - 'file' => 'node.admin.inc', // Any user than can potentially trigger a node_acess_needs_rebuild(TRUE) // has to be allowed access to the 'node access rebuild' confirm form. 'access arguments' => array('access administration pages'), @@ -1438,7 +1438,6 @@ 'description' => 'Manage posts by content type, including default status, front page promotion, etc.', 'page callback' => 'node_overview_types', 'access arguments' => array('administer content types'), - 'file' => 'content_types.inc', ); $items['admin/build/types/list'] = array( 'title' => 'List', @@ -1449,7 +1448,6 @@ 'title' => 'Add content type', 'page callback' => 'drupal_get_form', 'page arguments' => array('node_type_form'), - 'file' => 'content_types.inc', 'type' => MENU_LOCAL_TASK, ); $items['node'] = array( @@ -1463,7 +1461,6 @@ 'page callback' => 'node_add_page', 'access callback' => '_node_add_access', 'weight' => 1, - 'file' => 'node.pages.inc', ); $items['rss.xml'] = array( 'title' => 'RSS feed', @@ -1481,13 +1478,11 @@ 'access callback' => 'node_access', 'access arguments' => array('create', $type->type), 'description' => $type->description, - 'file' => 'node.pages.inc', ); $items['admin/content/node-type/' . $type_url_str] = array( 'title' => $type->name, 'page callback' => 'drupal_get_form', 'page arguments' => array('node_type_form', $type), - 'file' => 'content_types.inc', 'type' => MENU_CALLBACK, ); $items['admin/content/node-type/' . $type_url_str . '/edit'] = array( @@ -1497,7 +1492,6 @@ $items['admin/content/node-type/' . $type_url_str . '/delete'] = array( 'title' => 'Delete', 'page arguments' => array('node_type_delete_confirm', $type), - 'file' => 'content_types.inc', 'type' => MENU_CALLBACK, ); } @@ -1520,7 +1514,6 @@ 'access callback' => 'node_access', 'access arguments' => array('update', 1), 'weight' => 1, - 'file' => 'node.pages.inc', 'type' => MENU_LOCAL_TASK, ); $items['node/%node/delete'] = array( @@ -1529,7 +1522,6 @@ 'page arguments' => array('node_delete_confirm', 1), 'access callback' => 'node_access', 'access arguments' => array('delete', 1), - 'file' => 'node.pages.inc', 'weight' => 1, 'type' => MENU_CALLBACK); $items['node/%node/revisions'] = array( @@ -1539,7 +1531,6 @@ 'access callback' => '_node_revision_access', 'access arguments' => array(1), 'weight' => 2, - 'file' => 'node.pages.inc', 'type' => MENU_LOCAL_TASK, ); $items['node/%node/revisions/%/view'] = array( @@ -1556,7 +1547,6 @@ 'page arguments' => array('node_revision_revert_confirm', 1), 'access callback' => '_node_revision_access', 'access arguments' => array(1, 'update'), - 'file' => 'node.pages.inc', 'type' => MENU_CALLBACK, ); $items['node/%node/revisions/%/delete'] = array( @@ -1566,7 +1556,6 @@ 'page arguments' => array('node_revision_delete_confirm', 1), 'access callback' => '_node_revision_access', 'access arguments' => array(1, 'delete'), - 'file' => 'node.pages.inc', 'type' => MENU_CALLBACK, ); return $items; @@ -1991,8 +1980,8 @@ return FALSE; } - // Can't use node_invoke(), because the access hook takes the $op parameter - // before the $node parameter. + // Can't use node_invoke('access', $node), because the access hook takes the + // $op parameter before the $node parameter. $module = node_get_types('module', $node); if ($module == 'node') { $module = 'node_content'; // Avoid function name collisions. Index: modules/openid/openid.module =================================================================== RCS file: /cvs/drupal/drupal/modules/openid/openid.module,v retrieving revision 1.23 diff -u -r1.23 openid.module --- modules/openid/openid.module 14 Apr 2008 20:23:27 -0000 1.23 +++ modules/openid/openid.module 17 Apr 2008 09:13:32 -0000 @@ -15,7 +15,6 @@ 'page callback' => 'openid_authentication_page', 'access callback' => 'user_is_anonymous', 'type' => MENU_CALLBACK, - 'file' => 'openid.pages.inc', ); $items['user/%user/openid'] = array( 'title' => 'OpenID identities', @@ -24,14 +23,12 @@ 'access callback' => 'user_edit_access', 'access arguments' => array(1), 'type' => MENU_LOCAL_TASK, - 'file' => 'openid.pages.inc', ); $items['user/%user/openid/delete'] = array( 'title' => 'Delete OpenID', 'page callback' => 'openid_user_delete', 'page arguments' => array(1), 'type' => MENU_CALLBACK, - 'file' => 'openid.pages.inc', ); return $items; } Index: modules/path/path.module =================================================================== RCS file: /cvs/drupal/drupal/modules/path/path.module,v retrieving revision 1.141 diff -u -r1.141 path.module --- modules/path/path.module 14 Apr 2008 17:48:38 -0000 1.141 +++ modules/path/path.module 17 Apr 2008 09:13:32 -0000 @@ -38,20 +38,17 @@ 'description' => "Change your site's URL paths by aliasing them.", 'page callback' => 'path_admin_overview', 'access arguments' => array('administer url aliases'), - 'file' => 'path.admin.inc', ); $items['admin/build/path/edit'] = array( 'title' => 'Edit alias', 'page callback' => 'path_admin_edit', 'type' => MENU_CALLBACK, - 'file' => 'path.admin.inc', ); $items['admin/build/path/delete'] = array( 'title' => 'Delete alias', 'page callback' => 'drupal_get_form', 'page arguments' => array('path_admin_delete_confirm'), 'type' => MENU_CALLBACK, - 'file' => 'path.admin.inc', ); $items['admin/build/path/list'] = array( 'title' => 'List', @@ -63,7 +60,6 @@ 'page callback' => 'path_admin_edit', 'access arguments' => array('administer url aliases'), 'type' => MENU_LOCAL_TASK, - 'file' => 'path.admin.inc', ); return $items; Index: modules/poll/poll.module =================================================================== RCS file: /cvs/drupal/drupal/modules/poll/poll.module,v retrieving revision 1.266 diff -u -r1.266 poll.module --- modules/poll/poll.module 14 Apr 2008 17:48:41 -0000 1.266 +++ modules/poll/poll.module 17 Apr 2008 09:13:34 -0000 @@ -87,7 +87,6 @@ 'page callback' => 'poll_page', 'access arguments' => array('access content'), 'type' => MENU_SUGGESTED_ITEM, - 'file' => 'poll.pages.inc', ); $items['node/%node/votes'] = array( @@ -98,7 +97,6 @@ 'access arguments' => array(1, 'inspect all votes', FALSE), 'weight' => 3, 'type' => MENU_LOCAL_TASK, - 'file' => 'poll.pages.inc', ); $items['node/%node/results'] = array( @@ -109,7 +107,6 @@ 'access arguments' => array(1, 'access content', TRUE), 'weight' => 3, 'type' => MENU_LOCAL_TASK, - 'file' => 'poll.pages.inc', ); $items['poll/js'] = array( Index: modules/profile/profile.module =================================================================== RCS file: /cvs/drupal/drupal/modules/profile/profile.module,v retrieving revision 1.238 diff -u -r1.238 profile.module --- modules/profile/profile.module 14 Apr 2008 17:48:41 -0000 1.238 +++ modules/profile/profile.module 17 Apr 2008 09:13:35 -0000 @@ -81,7 +81,6 @@ 'page callback' => 'profile_browse', 'access arguments' => array('access user profiles'), 'type' => MENU_SUGGESTED_ITEM, - 'file' => 'profile.pages.inc', ); $items['admin/user/profile'] = array( 'title' => 'Profiles', @@ -89,41 +88,35 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('profile_admin_overview'), 'access arguments' => array('administer users'), - 'file' => 'profile.admin.inc', ); $items['admin/user/profile/add'] = array( 'title' => 'Add field', 'page callback' => 'drupal_get_form', 'page arguments' => array('profile_field_form'), 'type' => MENU_CALLBACK, - 'file' => 'profile.admin.inc', ); $items['admin/user/profile/autocomplete'] = array( 'title' => 'Profile category autocomplete', 'page callback' => 'profile_admin_settings_autocomplete', 'type' => MENU_CALLBACK, - 'file' => 'profile.admin.inc', ); $items['admin/user/profile/edit'] = array( 'title' => 'Edit field', 'page callback' => 'drupal_get_form', 'page arguments' => array('profile_field_form'), 'type' => MENU_CALLBACK, - 'file' => 'profile.admin.inc', ); $items['admin/user/profile/delete'] = array( 'title' => 'Delete field', 'page callback' => 'drupal_get_form', 'page arguments' => array('profile_field_delete'), 'type' => MENU_CALLBACK, - 'file' => 'profile.admin.inc', ); $items['profile/autocomplete'] = array( 'title' => 'Profile autocomplete', 'page callback' => 'profile_autocomplete', 'access arguments' => array('access user profiles'), 'type' => MENU_CALLBACK, - 'file' => 'profile.pages.inc', ); return $items; } Index: modules/search/search.module =================================================================== RCS file: /cvs/drupal/drupal/modules/search/search.module,v retrieving revision 1.254 diff -u -r1.254 search.module --- modules/search/search.module 14 Apr 2008 17:48:41 -0000 1.254 +++ modules/search/search.module 17 Apr 2008 09:13:39 -0000 @@ -174,7 +174,6 @@ 'page callback' => 'search_view', 'access arguments' => array('search content'), 'type' => MENU_SUGGESTED_ITEM, - 'file' => 'search.pages.inc', ); $items['admin/settings/search'] = array( 'title' => 'Search settings', @@ -183,7 +182,6 @@ 'page arguments' => array('search_admin_settings'), 'access arguments' => array('administer search'), 'type' => MENU_NORMAL_ITEM, - 'file' => 'search.admin.inc', ); $items['admin/settings/search/wipe'] = array( 'title' => 'Clear index', @@ -191,14 +189,12 @@ 'page arguments' => array('search_wipe_confirm'), 'access arguments' => array('administer search'), 'type' => MENU_CALLBACK, - 'file' => 'search.admin.inc', ); $items['admin/reports/search'] = array( 'title' => 'Top search phrases', 'description' => 'View most popular search phrases.', 'page callback' => 'dblog_top', 'page arguments' => array('search'), - 'file' => 'dblog.admin.inc', 'file path' => drupal_get_path('module', 'dblog'), ); @@ -212,7 +208,6 @@ 'access arguments' => array($name), 'type' => MENU_LOCAL_TASK, 'parent' => 'search', - 'file' => 'search.pages.inc', ); } return $items; Index: modules/statistics/statistics.module =================================================================== RCS file: /cvs/drupal/drupal/modules/statistics/statistics.module,v retrieving revision 1.276 diff -u -r1.276 statistics.module --- modules/statistics/statistics.module 16 Apr 2008 11:35:51 -0000 1.276 +++ modules/statistics/statistics.module 17 Apr 2008 09:13:40 -0000 @@ -101,7 +101,6 @@ 'description' => 'View pages that have recently been visited.', 'page callback' => 'statistics_recent_hits', 'access arguments' => array('access statistics'), - 'file' => 'statistics.admin.inc', ); $items['admin/reports/pages'] = array( 'title' => 'Top pages', @@ -109,7 +108,6 @@ 'page callback' => 'statistics_top_pages', 'access arguments' => array('access statistics'), 'weight' => 1, - 'file' => 'statistics.admin.inc', ); $items['admin/reports/visitors'] = array( 'title' => 'Top visitors', @@ -117,14 +115,12 @@ 'page callback' => 'statistics_top_visitors', 'access arguments' => array('access statistics'), 'weight' => 2, - 'file' => 'statistics.admin.inc', ); $items['admin/reports/referrers'] = array( 'title' => 'Top referrers', 'description' => 'View top referrers.', 'page callback' => 'statistics_top_referrers', 'access arguments' => array('access statistics'), - 'file' => 'statistics.admin.inc', ); $items['admin/reports/access/%'] = array( 'title' => 'Details', @@ -133,7 +129,6 @@ 'page arguments' => array(3), 'access arguments' => array('access statistics'), 'type' => MENU_CALLBACK, - 'file' => 'statistics.admin.inc', ); $items['admin/reports/settings'] = array( 'title' => 'Access log settings', @@ -143,7 +138,6 @@ 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM, 'weight' => 3, - 'file' => 'statistics.admin.inc', ); $items['user/%user/track/navigation'] = array( 'title' => 'Track page visits', @@ -152,7 +146,6 @@ 'access arguments' => array('access statistics'), 'type' => MENU_LOCAL_TASK, 'weight' => 2, - 'file' => 'statistics.pages.inc', ); $items['node/%node/track'] = array( 'title' => 'Track', @@ -161,7 +154,6 @@ 'access arguments' => array('access statistics'), 'type' => MENU_LOCAL_TASK, 'weight' => 2, - 'file' => 'statistics.pages.inc', ); return $items; Index: modules/system/system.install =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.install,v retrieving revision 1.250 diff -u -r1.250 system.install --- modules/system/system.install 16 Apr 2008 11:35:52 -0000 1.250 +++ modules/system/system.install 17 Apr 2008 09:13:48 -0000 @@ -603,6 +603,8 @@ $schema['cache_page']['description'] = t('Cache table used to store compressed pages for anonymous users, if page caching is enabled.'); $schema['cache_menu'] = $schema['cache']; $schema['cache_menu']['description'] = t('Cache table for the menu system to store router information as well as generated link trees for various menu/page/user combinations.'); + $schema['cache_registry'] = $schema['cache']; + $schema['cache_registry']['description'] = t('Cache table for the code registry system to remember what code files need to be loaded on any given page.'); $schema['files'] = array( 'description' => t('Stores information for uploaded files.'), @@ -859,11 +861,6 @@ 'not null' => TRUE, 'default' => 0, ), - 'file' => array( - 'description' => t('The file to include for this element, usually the page callback function lives in this file.'), - 'type' => 'text', - 'size' => 'medium', - ), ), 'indexes' => array( 'fit' => array('fit'), @@ -1056,6 +1053,49 @@ 'primary key' => array('mlid'), ); + $schema['registry'] = array( + 'description' => t("Each record is a function, class, or interface name and the file it is in."), + 'fields' => array( + 'name' => array( + 'description' => t('The name of the function, class, or interface.'), + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + ), + 'type' => array( + 'description' => t('Either function or class or interface.'), + 'type' => 'varchar', + 'length' => 9, + 'not null' => TRUE, + 'default' => '', + ), + 'module' => array( + 'description' => t('Name of the module this file belongs to.'), + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + ), + 'hook' => array( + 'description' => t('Name of the function minus the name of the module.'), + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + ), + 'file' => array( + 'description' => t('Path to the file.'), + 'type' => 'text', + 'size' => 'medium', + ), + ), + 'primary key' => array('name', 'type'), + 'indexes' => array( + 'module_implements' => array('type', 'hook'), + ), + ); + $schema['sessions'] = array( 'description' => t("Drupal's session handlers read and write into the sessions table. Each record represents a user session, either anonymous or authenticated."), 'fields' => array( @@ -2682,7 +2722,7 @@ } /** - * Generate a cron key and save it in the variables table + * Generate a cron key and save it in the variables table. */ function system_update_7001() { $ret = array(); @@ -2861,8 +2901,45 @@ } /** + * Registry tables and drop the file key of the menu router, since it is no + * longer needed. + */ +function system_update_7006() { + $ret = array(); + db_drop_field($ret, 'menu_router', 'file'); + $schema['registry'] = array( + 'fields' => array( + 'name' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''), + 'type' => array('type' => 'varchar', 'length' => 9, 'not null' => TRUE, 'default' => ''), + 'module' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''), + 'hook' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''), + 'file' => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => ''), + ), + 'primary key' => array('name', 'type'), + 'indexes' => array( + 'module_implements' => array('type', 'hook'), + ), + ); + $schema['cache_registry'] = array( + 'fields' => array( + 'cid' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''), + 'data' => array('type' => 'blob', 'not null' => FALSE, 'size' => 'big'), + 'expire' => array('type' => 'int', 'not null' => TRUE, 'default' => 0), + 'created' => array('type' => 'int', 'not null' => TRUE, 'default' => 0), + 'headers' => array('type' => 'text', 'not null' => FALSE), + 'serialized' => array('type' => 'int', 'size' => 'small', 'not null' => TRUE, 'default' => 0) + ), + 'indexes' => array('expire' => array('expire')), + 'primary key' => array('cid'), + ); + db_create_table($ret, 'cache_registry', $schema['cache_registry']); + db_create_table($ret, 'registry', $schema['registry']); + drupal_rebuild_code_registry(); + return $ret; +} + +/** * @} End of "defgroup updates-6.x-to-7.x" * The next series of updates should start at 8000. */ - Index: modules/system/system.module =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.module,v retrieving revision 1.598 diff -u -r1.598 system.module --- modules/system/system.module 16 Apr 2008 11:35:52 -0000 1.598 +++ modules/system/system.module 17 Apr 2008 09:13:54 -0000 @@ -331,24 +331,20 @@ 'access arguments' => array('access administration pages'), 'page callback' => 'system_main_admin_page', 'weight' => 9, - 'file' => 'system.admin.inc', ); $items['admin/compact'] = array( 'title' => 'Compact mode', 'page callback' => 'system_admin_compact_page', 'type' => MENU_CALLBACK, - 'file' => 'system.admin.inc', ); $items['admin/by-task'] = array( 'title' => 'By task', 'page callback' => 'system_main_admin_page', - 'file' => 'system.admin.inc', 'type' => MENU_DEFAULT_LOCAL_TASK, ); $items['admin/by-module'] = array( 'title' => 'By module', 'page callback' => 'system_admin_by_module', - 'file' => 'system.admin.inc', 'type' => MENU_LOCAL_TASK, 'weight' => 2, ); @@ -358,7 +354,6 @@ 'position' => 'left', 'weight' => -10, 'page callback' => 'system_admin_menu_block_page', - 'file' => 'system.admin.inc', ); // menu items that are basically just menu blocks @@ -368,7 +363,6 @@ 'position' => 'right', 'weight' => -5, 'page callback' => 'system_settings_overview', - 'file' => 'system.admin.inc', ); $items['admin/build'] = array( 'title' => 'Site building', @@ -376,7 +370,6 @@ 'position' => 'right', 'weight' => -10, 'page callback' => 'system_admin_menu_block_page', - 'file' => 'system.admin.inc', ); $items['admin/settings/admin'] = array( 'title' => 'Administration theme', @@ -386,7 +379,6 @@ 'page arguments' => array('system_admin_theme_settings'), 'access arguments' => array('administer site configuration'), 'block callback' => 'system_admin_theme_settings', - 'file' => 'system.admin.inc', ); // Themes: $items['admin/build/themes'] = array( @@ -395,7 +387,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('system_themes_form', NULL), 'access arguments' => array('administer site configuration'), - 'file' => 'system.admin.inc', ); $items['admin/build/themes/select'] = array( 'title' => 'List', @@ -432,7 +423,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('system_modules'), 'access arguments' => array('administer site configuration'), - 'file' => 'system.admin.inc', ); $items['admin/build/modules/list'] = array( 'title' => 'List', @@ -509,7 +499,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('system_site_information_settings'), 'access arguments' => array('administer site configuration'), - 'file' => 'system.admin.inc', ); $items['admin/settings/error-reporting'] = array( 'title' => 'Error reporting', @@ -517,14 +506,12 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('system_error_reporting_settings'), 'access arguments' => array('administer site configuration'), - 'file' => 'system.admin.inc', ); $items['admin/settings/logging'] = array( 'title' => 'Logging and alerts', 'description' => "Settings for logging and alerts modules. Various modules can route Drupal's system events to different destination, such as syslog, database, email, ...etc.", 'page callback' => 'system_logging_overview', 'access arguments' => array('administer site configuration'), - 'file' => 'system.admin.inc', ); $items['admin/settings/performance'] = array( 'title' => 'Performance', @@ -532,7 +519,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('system_performance_settings'), 'access arguments' => array('administer site configuration'), - 'file' => 'system.admin.inc', ); $items['admin/settings/file-system'] = array( 'title' => 'File system', @@ -540,7 +526,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('system_file_system_settings'), 'access arguments' => array('administer site configuration'), - 'file' => 'system.admin.inc', ); $items['admin/settings/image-toolkit'] = array( 'title' => 'Image toolkit', @@ -548,7 +533,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('system_image_toolkit_settings'), 'access arguments' => array('administer site configuration'), - 'file' => 'system.admin.inc', ); $items['admin/content/rss-publishing'] = array( 'title' => 'RSS publishing', @@ -556,7 +540,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('system_rss_feeds_settings'), 'access arguments' => array('administer site configuration'), - 'file' => 'system.admin.inc', ); $items['admin/settings/date-time'] = array( 'title' => 'Date and time', @@ -564,13 +547,11 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('system_date_time_settings'), 'access arguments' => array('administer site configuration'), - 'file' => 'system.admin.inc', ); $items['admin/settings/date-time/lookup'] = array( 'title' => 'Date and time lookup', 'type' => MENU_CALLBACK, 'page callback' => 'system_date_time_lookup', - 'file' => 'system.admin.inc', ); $items['admin/settings/site-maintenance'] = array( 'title' => 'Site maintenance', @@ -578,7 +559,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('system_site_maintenance_settings'), 'access arguments' => array('administer site configuration'), - 'file' => 'system.admin.inc', ); $items['admin/settings/clean-urls'] = array( 'title' => 'Clean URLs', @@ -586,7 +566,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('system_clean_url_settings'), 'access arguments' => array('administer site configuration'), - 'file' => 'system.admin.inc', ); $items['admin/settings/clean-urls/check'] = array( 'title' => 'Clean URL check', @@ -613,7 +592,6 @@ 'access arguments' => array('access site reports'), 'weight' => 5, 'position' => 'left', - 'file' => 'system.admin.inc', ); $items['admin/reports/status'] = array( 'title' => 'Status report', @@ -621,32 +599,27 @@ 'page callback' => 'system_status', 'weight' => 10, 'access arguments' => array('administer site configuration'), - 'file' => 'system.admin.inc', ); $items['admin/reports/status/run-cron'] = array( 'title' => 'Run cron', 'page callback' => 'system_run_cron', 'type' => MENU_CALLBACK, - 'file' => 'system.admin.inc', ); $items['admin/reports/status/php'] = array( 'title' => 'PHP', 'page callback' => 'system_php', 'type' => MENU_CALLBACK, - 'file' => 'system.admin.inc', ); $items['admin/reports/status/sql'] = array( 'title' => 'SQL', 'page callback' => 'system_sql', 'type' => MENU_CALLBACK, - 'file' => 'system.admin.inc', ); // Default page for batch operations $items['batch'] = array( 'page callback' => 'system_batch_page', 'access callback' => TRUE, 'type' => MENU_CALLBACK, - 'file' => 'system.admin.inc', ); return $items; } @@ -1458,6 +1431,13 @@ } /** + * Implementation of hook_hooks(). + */ +function system_hooks() { + return array('form__alter'); +} + +/** * Menu callback. Display an overview of available and configured actions. */ function system_actions_manage() { Index: modules/taxonomy/taxonomy.module =================================================================== RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.module,v retrieving revision 1.418 diff -u -r1.418 taxonomy.module --- modules/taxonomy/taxonomy.module 14 Apr 2008 17:48:42 -0000 1.418 +++ modules/taxonomy/taxonomy.module 17 Apr 2008 09:13:57 -0000 @@ -117,7 +117,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('taxonomy_overview_vocabularies'), 'access arguments' => array('administer taxonomy'), - 'file' => 'taxonomy.admin.inc', ); $items['admin/content/taxonomy/list'] = array( @@ -132,7 +131,6 @@ 'page arguments' => array('taxonomy_form_vocabulary'), 'type' => MENU_LOCAL_TASK, 'parent' => 'admin/content/taxonomy', - 'file' => 'taxonomy.admin.inc', ); $items['admin/content/taxonomy/edit/vocabulary/%taxonomy_vocabulary'] = array( @@ -140,14 +138,12 @@ 'page callback' => 'taxonomy_admin_vocabulary_edit', 'page arguments' => array(5), 'type' => MENU_CALLBACK, - 'file' => 'taxonomy.admin.inc', ); $items['admin/content/taxonomy/edit/term'] = array( 'title' => 'Edit term', 'page callback' => 'taxonomy_admin_term_edit', 'type' => MENU_CALLBACK, - 'file' => 'taxonomy.admin.inc', ); $items['taxonomy/term/%'] = array( @@ -156,7 +152,6 @@ 'page arguments' => array(2), 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, - 'file' => 'taxonomy.pages.inc', ); $items['taxonomy/autocomplete'] = array( @@ -164,7 +159,6 @@ 'page callback' => 'taxonomy_autocomplete', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, - 'file' => 'taxonomy.pages.inc', ); $items['admin/content/taxonomy/%taxonomy_vocabulary'] = array( 'title' => 'List terms', @@ -172,7 +166,6 @@ 'page arguments' => array('taxonomy_overview_terms', 3), 'access arguments' => array('administer taxonomy'), 'type' => MENU_CALLBACK, - 'file' => 'taxonomy.admin.inc', ); $items['admin/content/taxonomy/%taxonomy_vocabulary/list'] = array( @@ -187,7 +180,6 @@ 'page arguments' => array(3), 'type' => MENU_LOCAL_TASK, 'parent' => 'admin/content/taxonomy/%taxonomy_vocabulary', - 'file' => 'taxonomy.admin.inc', ); return $items; Index: modules/tracker/tracker.module =================================================================== RCS file: /cvs/drupal/drupal/modules/tracker/tracker.module,v retrieving revision 1.155 diff -u -r1.155 tracker.module --- modules/tracker/tracker.module 14 Apr 2008 17:48:42 -0000 1.155 +++ modules/tracker/tracker.module 17 Apr 2008 09:13:57 -0000 @@ -28,7 +28,6 @@ 'page callback' => 'tracker_page', 'access arguments' => array('access content'), 'weight' => 1, - 'file' => 'tracker.pages.inc', ); $items['tracker/all'] = array( 'title' => 'All recent posts', @@ -47,7 +46,6 @@ 'page callback' => 'tracker_page', 'page arguments' => array(1, TRUE), 'type' => MENU_LOCAL_TASK, - 'file' => 'tracker.pages.inc', ); $items['user/%user/track/posts'] = array( 'title' => 'Track posts', Index: modules/translation/translation.module =================================================================== RCS file: /cvs/drupal/drupal/modules/translation/translation.module,v retrieving revision 1.26 diff -u -r1.26 translation.module --- modules/translation/translation.module 14 Apr 2008 17:48:42 -0000 1.26 +++ modules/translation/translation.module 17 Apr 2008 09:13:58 -0000 @@ -63,7 +63,6 @@ 'access arguments' => array(1), 'type' => MENU_LOCAL_TASK, 'weight' => 2, - 'file' => 'translation.pages.inc', ); return $items; } Index: modules/trigger/trigger.module =================================================================== RCS file: /cvs/drupal/drupal/modules/trigger/trigger.module,v retrieving revision 1.15 diff -u -r1.15 trigger.module --- modules/trigger/trigger.module 14 Apr 2008 17:48:43 -0000 1.15 +++ modules/trigger/trigger.module 17 Apr 2008 09:13:59 -0000 @@ -41,7 +41,6 @@ 'page callback' => 'trigger_assign', 'access callback' => 'trigger_access_check', 'access arguments' => array('node'), - 'file' => 'trigger.admin.inc', ); // We don't use a menu wildcard here because these are tabs, // not invisible items. @@ -51,7 +50,6 @@ 'page arguments' => array('node'), 'access arguments' => array('node'), 'type' => MENU_LOCAL_TASK, - 'file' => 'trigger.admin.inc', ); $items['admin/build/trigger/user'] = array( 'title' => 'Users', @@ -59,7 +57,6 @@ 'page arguments' => array('user'), 'access arguments' => array('user'), 'type' => MENU_LOCAL_TASK, - 'file' => 'trigger.admin.inc', ); $items['admin/build/trigger/comment'] = array( 'title' => 'Comments', @@ -68,7 +65,6 @@ 'access callback' => 'trigger_access_check', 'access arguments' => array('comment'), 'type' => MENU_LOCAL_TASK, - 'file' => 'trigger.admin.inc', ); $items['admin/build/trigger/taxonomy'] = array( 'title' => 'Taxonomy', @@ -77,14 +73,12 @@ 'access callback' => 'trigger_access_check', 'access arguments' => array('taxonomy'), 'type' => MENU_LOCAL_TASK, - 'file' => 'trigger.admin.inc', ); $items['admin/build/trigger/cron'] = array( 'title' => 'Cron', 'page callback' => 'trigger_assign', 'page arguments' => array('cron'), 'type' => MENU_LOCAL_TASK, - 'file' => 'trigger.admin.inc', ); // We want contributed modules to be able to describe @@ -104,7 +98,6 @@ 'page arguments' => array($module), 'access arguments' => array($module), 'type' => MENU_LOCAL_TASK, - 'file' => 'trigger.admin.inc', ); } $items['admin/build/trigger/unassign'] = array( @@ -113,7 +106,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('trigger_unassign'), 'type' => MENU_CALLBACK, - 'file' => 'trigger.admin.inc', ); return $items; Index: modules/update/update.module =================================================================== RCS file: /cvs/drupal/drupal/modules/update/update.module,v retrieving revision 1.18 diff -u -r1.18 update.module --- modules/update/update.module 14 Apr 2008 17:48:43 -0000 1.18 +++ modules/update/update.module 17 Apr 2008 09:14:01 -0000 @@ -121,14 +121,12 @@ 'description' => 'Get a status report about available updates for your installed modules and themes.', 'page callback' => 'update_status', 'access arguments' => array('administer site configuration'), - 'file' => 'update.report.inc', 'weight' => 10, ); $items['admin/reports/updates/list'] = array( 'title' => 'List', 'page callback' => 'update_status', 'access arguments' => array('administer site configuration'), - 'file' => 'update.report.inc', 'type' => MENU_DEFAULT_LOCAL_TASK, ); $items['admin/reports/updates/settings'] = array( @@ -136,14 +134,12 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('update_settings'), 'access arguments' => array('administer site configuration'), - 'file' => 'update.settings.inc', 'type' => MENU_LOCAL_TASK, ); $items['admin/reports/updates/check'] = array( 'title' => 'Manual update check', 'page callback' => 'update_manual_status', 'access arguments' => array('administer site configuration'), - 'file' => 'update.fetch.inc', 'type' => MENU_CALLBACK, ); Index: modules/upload/upload.module =================================================================== RCS file: /cvs/drupal/drupal/modules/upload/upload.module,v retrieving revision 1.200 diff -u -r1.200 upload.module --- modules/upload/upload.module 14 Apr 2008 17:48:43 -0000 1.200 +++ modules/upload/upload.module 17 Apr 2008 09:14:02 -0000 @@ -92,7 +92,6 @@ 'page arguments' => array('upload_admin_settings'), 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM, - 'file' => 'upload.admin.inc', ); return $items; } Index: modules/user/user.module =================================================================== RCS file: /cvs/drupal/drupal/modules/user/user.module,v retrieving revision 1.902 diff -u -r1.902 user.module --- modules/user/user.module 14 Apr 2008 17:48:43 -0000 1.902 +++ modules/user/user.module 17 Apr 2008 09:14:08 -0000 @@ -847,7 +847,6 @@ 'access callback' => 'user_access', 'access arguments' => array('access user profiles'), 'type' => MENU_CALLBACK, - 'file' => 'user.pages.inc', ); // Registration and login pages. @@ -856,7 +855,6 @@ 'page callback' => 'user_page', 'access callback' => TRUE, 'type' => MENU_CALLBACK, - 'file' => 'user.pages.inc', ); $items['user/login'] = array( @@ -871,7 +869,6 @@ 'page arguments' => array('user_register'), 'access callback' => 'user_register_access', 'type' => MENU_LOCAL_TASK, - 'file' => 'user.pages.inc', ); $items['user/password'] = array( @@ -880,7 +877,6 @@ 'page arguments' => array('user_pass'), 'access callback' => 'user_is_anonymous', 'type' => MENU_LOCAL_TASK, - 'file' => 'user.pages.inc', ); $items['user/reset/%/%/%'] = array( 'title' => 'Reset password', @@ -888,7 +884,6 @@ 'page arguments' => array('user_pass_reset', 2, 3, 4), 'access callback' => TRUE, 'type' => MENU_CALLBACK, - 'file' => 'user.pages.inc', ); // Admin user pages. @@ -898,8 +893,6 @@ 'position' => 'left', 'page callback' => 'system_admin_menu_block_page', 'access arguments' => array('access administration pages'), - 'file' => 'system.admin.inc', - 'file path' => drupal_get_path('module', 'system'), ); $items['admin/user/user'] = array( 'title' => 'Users', @@ -907,7 +900,6 @@ 'page callback' => 'user_admin', 'page arguments' => array('list'), 'access arguments' => array('administer users'), - 'file' => 'user.admin.inc', ); $items['admin/user/user/list'] = array( 'title' => 'List', @@ -918,7 +910,6 @@ 'title' => 'Add user', 'page arguments' => array('create'), 'type' => MENU_LOCAL_TASK, - 'file' => 'user.admin.inc', ); $items['admin/user/settings'] = array( 'title' => 'User settings', @@ -926,7 +917,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('user_admin_settings'), 'access arguments' => array('administer users'), - 'file' => 'user.admin.inc', ); // Admin access pages. @@ -936,7 +926,6 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('user_admin_perm'), 'access arguments' => array('administer permissions'), - 'file' => 'user.admin.inc', ); $items['admin/user/roles'] = array( 'title' => 'Roles', @@ -944,13 +933,11 @@ 'page callback' => 'drupal_get_form', 'page arguments' => array('user_admin_new_role'), 'access arguments' => array('administer permissions'), - 'file' => 'user.admin.inc', ); $items['admin/user/roles/edit'] = array( 'title' => 'Edit role', 'page arguments' => array('user_admin_role'), 'type' => MENU_CALLBACK, - 'file' => 'user.admin.inc', ); $items['logout'] = array( @@ -958,7 +945,6 @@ 'access callback' => 'user_is_logged_in', 'page callback' => 'user_logout', 'weight' => 10, - 'file' => 'user.pages.inc', ); $items['user/%user_current'] = array( @@ -970,7 +956,6 @@ 'access callback' => 'user_view_access', 'access arguments' => array(1), 'parent' => '', - 'file' => 'user.pages.inc', ); $items['user/%user/view'] = array( @@ -986,7 +971,6 @@ 'access callback' => 'user_access', 'access arguments' => array('administer users'), 'type' => MENU_CALLBACK, - 'file' => 'user.pages.inc', ); $items['user/%user_category/edit'] = array( @@ -997,7 +981,6 @@ 'access arguments' => array(1), 'type' => MENU_LOCAL_TASK, 'load arguments' => array('%map', '%index'), - 'file' => 'user.pages.inc', ); $items['user/%user_category/edit/account'] = array( @@ -1022,7 +1005,6 @@ 'weight' => $category['weight'], 'load arguments' => array('%map', '%index'), 'tab_parent' => 'user/%/edit', - 'file' => 'user.pages.inc', ); } }