Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
project
drupal
Commits
1f9077ee
Commit
1f9077ee
authored
Jun 06, 2009
by
Dries
Browse files
- Patch
#147000
by Berdir: unify and rewrite module_rebuild_cache() and system_theme_data().
parent
36e3d552
Changes
14
Hide whitespace changes
Inline
Side-by-side
includes/common.inc
View file @
1f9077ee
...
...
@@ -4555,10 +4555,10 @@ function drupal_flush_all_caches() {
// 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_theme_data
();
_system_
get_
theme_data
();
}
else
{
system_theme_data
();
system_
get_
theme_data
();
}
drupal_theme_rebuild
();
...
...
includes/install.inc
View file @
1f9077ee
...
...
@@ -495,7 +495,7 @@ function drupal_verify_profile($profile, $locale) {
* Normally just testing wants to set this to TRUE.
*/
function
drupal_install_modules
(
$module_list
=
array
(),
$disable_modules_installed_hook
=
FALSE
)
{
$files
=
module_rebuild_cache
();
$files
=
system_get_module_data
();
$module_list
=
array_flip
(
array_values
(
$module_list
));
do
{
$moved
=
FALSE
;
...
...
@@ -592,7 +592,7 @@ function drupal_install_system() {
->
execute
();
// Now that we've installed things properly, bootstrap the full Drupal environment
drupal_bootstrap
(
DRUPAL_BOOTSTRAP_FULL
);
module_rebuild_cache
();
system_get_module_data
();
}
/**
...
...
includes/module.inc
View file @
1f9077ee
...
...
@@ -75,75 +75,6 @@ function module_list($refresh = FALSE, $sort = FALSE, $fixed_list = NULL) {
return
$list
;
}
/**
* Rebuild the database cache of module files.
*
* @return
* The array of filesystem objects used to rebuild the cache.
*/
function
module_rebuild_cache
()
{
// Get current list of modules, including uninstalled modules.
$files
=
drupal_system_listing
(
'/\.module$/'
,
'modules'
,
'name'
,
0
);
// Extract current files from database.
system_get_files_database
(
$files
,
'module'
);
ksort
(
$files
);
// Set defaults for module info
$defaults
=
array
(
'dependencies'
=>
array
(),
'dependents'
=>
array
(),
'description'
=>
''
,
'package'
=>
'Other'
,
'version'
=>
NULL
,
'php'
=>
DRUPAL_MINIMUM_PHP
,
'files'
=>
array
(),
);
foreach
(
$files
as
$filepath
=>
$file
)
{
// Look for the info file.
$file
->
info
=
drupal_parse_info_file
(
dirname
(
$file
->
filepath
)
.
'/'
.
$file
->
name
.
'.info'
);
// Skip modules that don't provide info.
if
(
empty
(
$file
->
info
))
{
unset
(
$files
[
$filepath
]);
continue
;
}
// Merge in defaults and save.
$files
[
$filepath
]
->
info
=
$file
->
info
+
$defaults
;
// Invoke hook_system_info_alter() to give installed modules a chance to
// modify the data in the .info files if necessary.
drupal_alter
(
'system_info'
,
$files
[
$filepath
]
->
info
,
$files
[
$filepath
]);
// Update the contents of the system table:
if
(
isset
(
$file
->
status
)
||
(
isset
(
$file
->
old_filepath
)
&&
$file
->
old_filepath
!=
$file
->
filepath
))
{
db_update
(
'system'
)
->
fields
(
array
(
'info'
=>
serialize
(
$files
[
$filepath
]
->
info
),
'name'
=>
$file
->
name
,
'filename'
=>
$file
->
filepath
))
->
condition
(
'filename'
,
$file
->
old_filepath
)
->
execute
();
}
else
{
// This is a new module.
$files
[
$filepath
]
->
status
=
0
;
db_insert
(
'system'
)
->
fields
(
array
(
'name'
=>
$file
->
name
,
'info'
=>
serialize
(
$files
[
$filepath
]
->
info
),
'type'
=>
'module'
,
'filename'
=>
$file
->
filepath
,
'status'
=>
0
))
->
execute
();
}
}
$files
=
_module_build_dependencies
(
$files
);
return
$files
;
}
/**
* Find dependencies any level deep and fill in required by information too.
*
...
...
includes/theme.inc
View file @
1f9077ee
...
...
@@ -528,7 +528,7 @@ function list_themes($refresh = FALSE) {
}
else
{
// Scan the installation when the database should not be read.
$themes
=
_system_theme_data
();
$themes
=
_system_
get_
theme_data
();
}
foreach
(
$themes
as
$theme
)
{
...
...
includes/theme.maintenance.inc
View file @
1f9077ee
...
...
@@ -223,7 +223,7 @@ function template_preprocess_maintenance_page(&$variables) {
global
$theme
;
// Retrieve the theme data to list all available regions.
$theme_data
=
_system_theme_data
();
$theme_data
=
_system_
get_
theme_data
();
$regions
=
$theme_data
[
$theme
]
->
info
[
'regions'
];
// Get all region content set with drupal_add_region_content().
...
...
install.php
View file @
1f9077ee
...
...
@@ -642,7 +642,7 @@ function install_tasks($profile, $task) {
// Install profile modules.
if
(
$task
==
'profile-install'
)
{
$modules
=
variable_get
(
'install_profile_modules'
,
array
());
$files
=
module_rebuild_cache
();
$files
=
system_get_module_data
();
variable_del
(
'install_profile_modules'
);
$operations
=
array
();
foreach
(
$modules
as
$module
)
{
...
...
modules/help/help.admin.inc
View file @
1f9077ee
...
...
@@ -47,7 +47,7 @@ function help_page($name) {
function
help_links_as_list
()
{
$empty_arg
=
drupal_help_arg
();
$module_info
=
module_rebuild_cache
();
$module_info
=
system_get_module_data
();
$modules
=
array
();
foreach
(
module_implements
(
'help'
,
TRUE
)
as
$module
)
{
...
...
modules/simpletest/simpletest.module
View file @
1f9077ee
...
...
@@ -211,7 +211,7 @@ function simpletest_get_all_tests() {
if
(
!
isset
(
$classes
))
{
require_once
DRUPAL_ROOT
.
'/'
.
drupal_get_path
(
'module'
,
'simpletest'
)
.
'/drupal_web_test_case.php'
;
$files
=
array
();
foreach
(
array_keys
(
module_rebuild_cache
())
as
$module
)
{
foreach
(
array_keys
(
system_get_module_data
())
as
$module
)
{
$module_path
=
drupal_get_path
(
'module'
,
$module
);
$test
=
$module_path
.
"/
$module
.test"
;
if
(
file_exists
(
$test
))
{
...
...
modules/system/system.admin.inc
View file @
1f9077ee
...
...
@@ -86,7 +86,7 @@ function system_admin_menu_block_page() {
*/
function
system_admin_by_module
()
{
$modules
=
module_rebuild_cache
();
$modules
=
system_get_module_data
();
$menu_items
=
array
();
$help_arg
=
module_exists
(
'help'
)
?
drupal_help_arg
()
:
FALSE
;
...
...
@@ -141,7 +141,7 @@ function system_settings_overview() {
function
system_themes_form
()
{
drupal_clear_css_cache
();
$themes
=
system_theme_data
();
$themes
=
system_
get_
theme_data
();
uasort
(
$themes
,
'system_sort_modules_by_info_name'
);
$status
=
array
();
...
...
@@ -325,7 +325,7 @@ function system_theme_settings(&$form_state, $key = '') {
if
(
$key
)
{
$settings
=
theme_get_settings
(
$key
);
$var
=
str_replace
(
'/'
,
'_'
,
'theme_'
.
$key
.
'_settings'
);
$themes
=
system_theme_data
();
$themes
=
system_
get_
theme_data
();
$features
=
$themes
[
$key
]
->
info
[
'features'
];
}
else
{
...
...
@@ -580,7 +580,7 @@ function system_modules($form_state = array()) {
node_types_rebuild
();
cache_clear_all
(
'schema'
,
'cache'
);
// Get current list of modules.
$files
=
module_rebuild_cache
();
$files
=
system_get_module_data
();
// Remove hidden modules from display list.
foreach
(
$files
as
$filename
=>
$file
)
{
...
...
@@ -761,7 +761,7 @@ function _system_modules_build_row($info, $extra) {
* Display confirmation form for required modules.
*
* @param $modules
* Array of module file objects as returned from
module_rebuild_cache
().
* Array of module file objects as returned from
system_get_module_data
().
* @param $storage
* The contents of $form_state['storage']; an array with two
* elements: the list of required modules and the list of status
...
...
@@ -819,7 +819,7 @@ function system_modules_submit($form, &$form_state) {
// Get a list of all modules, it will be used to find which module requires
// which.
$files
=
module_rebuild_cache
();
$files
=
system_get_module_data
();
// The modules to be enabled.
$modules_to_be_enabled
=
array
();
...
...
modules/system/system.api.php
View file @
1f9077ee
...
...
@@ -530,7 +530,7 @@ function hook_mail_alter(&$message) {
/**
* Alter the information parsed from module and theme .info files
*
* This hook is invoked in
module_rebuild_cache
() and in system_theme_data().
* This hook is invoked in
_system_get_module_data
() and in
_
system_
get_
theme_data().
* A module may implement this hook in order to add to or alter the data
* generated by reading the .info file with drupal_parse_info_file().
*
...
...
modules/system/system.install
View file @
1f9077ee
...
...
@@ -353,7 +353,7 @@ function system_install() {
}
// Load system theme data appropriately.
system_theme_data
();
system_
get_
theme_data
();
// Inserting uid 0 here confuses MySQL -- the next user might be created as
// uid 2 which is not what we want. So we insert the first user here, the
...
...
@@ -1542,8 +1542,8 @@ function system_update_6008() {
db_drop_field
(
$ret
,
'system'
,
'description'
);
// Rebuild system table contents.
module_rebuild_cache
();
system_theme_data
();
system_get_module_data
();
system_
get_
theme_data
();
return
$ret
;
}
...
...
@@ -1614,8 +1614,8 @@ function system_update_6012() {
*/
function
system_update_6013
()
{
// Rebuild system table contents.
module_rebuild_cache
();
system_theme_data
();
system_get_module_data
();
system_
get_
theme_data
();
return
array
(
array
(
'success'
=>
TRUE
,
'query'
=>
'Cache rebuilt.'
));
}
...
...
modules/system/system.module
View file @
1f9077ee
...
...
@@ -1159,9 +1159,8 @@ function system_get_files_database(&$files, $type) {
foreach
(
$result
as
$file
)
{
if
(
isset
(
$files
[
$file
->
name
])
&&
is_object
(
$files
[
$file
->
name
]))
{
$file
->
filepath
=
$file
->
filename
;
$file
->
old_filepath
=
$file
->
filepath
;
foreach
(
$file
as
$key
=>
$value
)
{
if
(
!
isset
(
$files
[
$file
->
name
]
)
||
!
isset
(
$files
[
$file
->
name
]
->
$
key
))
{
if
(
!
isset
(
$files
[
$file
->
name
]
->
key
))
{
$files
[
$file
->
name
]
->
$key
=
$value
;
}
}
...
...
@@ -1170,75 +1169,139 @@ function system_get_files_database(&$files, $type) {
}
/**
* Prepare defaults for themes.
*
* @return
* An array of default themes settings.
* Updates the records in the system table based on the files array.
*
* @param $files
* An array of files.
* @param $type
* The type of the files.
*/
function
system_theme_default
()
{
return
array
(
'regions'
=>
array
(
'left'
=>
'Left sidebar'
,
'right'
=>
'Right sidebar'
,
'content'
=>
'Content'
,
'header'
=>
'Header'
,
'footer'
=>
'Footer'
,
'highlight'
=>
'Highlighted content'
,
'help'
=>
'Help'
,
),
'description'
=>
''
,
'features'
=>
array
(
'comment_user_picture'
,
'comment_user_verification'
,
'favicon'
,
'logo'
,
'name'
,
'node_user_picture'
,
'search'
,
'slogan'
,
'main_menu'
,
'secondary_menu'
,
),
'screenshot'
=>
'screenshot.png'
,
'php'
=>
DRUPAL_MINIMUM_PHP
,
);
function
system_update_files_database
(
&
$files
,
$type
)
{
$result
=
db_query
(
"SELECT * FROM
{
system
}
WHERE type = :type"
,
array
(
':type'
=>
$type
));
// Add all files that need to be deleted to a DatabaseCondition.
$delete
=
db_or
();
foreach
(
$result
as
$file
)
{
if
(
isset
(
$files
[
$file
->
name
])
&&
is_object
(
$files
[
$file
->
name
]))
{
// Keep the old filename from the database in case the file has moved.
$old_filename
=
$file
->
filename
;
$updated_fields
=
array
();
// Handle info specially, compare the serialized value.
$serialized_info
=
serialize
(
$files
[
$file
->
name
]
->
info
);
if
(
$serialized_info
!=
$file
->
info
)
{
$updated_fields
[
'info'
]
=
$serialized_info
;
}
unset
(
$file
->
info
);
// Scan remaining fields to find only the updated values.
foreach
(
$file
as
$key
=>
$value
)
{
if
(
isset
(
$files
[
$file
->
name
]
->
$key
)
&&
$files
[
$file
->
name
]
->
$key
!=
$value
)
{
$updated_fields
[
$key
]
=
$files
[
$file
->
name
]
->
$key
;
}
}
// Update the record.
if
(
count
(
$updated_fields
))
{
db_update
(
'system'
)
->
fields
(
$updated_fields
)
->
condition
(
'filename'
,
$old_filename
)
->
execute
();
}
// Indiciate that the file exists already.
$files
[
$file
->
name
]
->
exists
=
TRUE
;
}
else
{
// File is not found in file system, so delete record from the system table.
$delete
->
condition
(
'filename'
,
$file
->
filename
);
}
}
if
(
count
(
$delete
)
>
0
)
{
// Delete all missing files from the system table
db_delete
(
'system'
)
->
condition
(
$delete
)
->
execute
();
}
// All remaining files are not in the system table, so we need to add them.
$query
=
db_insert
(
'system'
)
->
fields
(
array
(
'filename'
,
'name'
,
'type'
,
'owner'
,
'info'
));
foreach
(
$files
as
&
$file
)
{
if
(
isset
(
$file
->
exists
))
{
unset
(
$file
->
exists
);
}
else
{
$query
->
values
(
array
(
'filename'
=>
$file
->
filepath
,
'name'
=>
$file
->
name
,
'type'
=>
$type
,
'owner'
=>
isset
(
$file
->
owner
)
?
$file
->
owner
:
''
,
'info'
=>
serialize
(
$file
->
info
),
));
$file
->
type
=
$type
;
$file
->
status
=
0
;
$file
->
schema_version
=
-
1
;
}
}
$query
->
execute
();
}
/**
*
Collect data about all currently available themes
.
*
Helper function to scan and collect module .info data
.
*
* @return
* A
rray of all available themes and their data
.
* A
n associative array of module information
.
*/
function
system_
them
e_data
()
{
//
Scan the installation theme .info files and their engines.
$
themes
=
_system_theme_data
(
);
function
_
system_
get_modul
e_data
()
{
//
Find modules
$
modules
=
drupal_system_listing
(
'/\.module$/'
,
'modules'
,
'name'
,
0
);
// Extract current files from database.
system_get_files_database
(
$themes
,
'theme'
);
// Set defaults for module info.
$defaults
=
array
(
'dependencies'
=>
array
(),
'dependents'
=>
array
(),
'description'
=>
''
,
'version'
=>
NULL
,
'php'
=>
DRUPAL_MINIMUM_PHP
,
);
db_delete
(
'system'
)
->
condition
(
'type'
,
'theme'
)
->
execute
();
// Read info files for each module.
foreach
(
$modules
as
$key
=>
$module
)
{
// Look for the info file.
$module
->
info
=
drupal_parse_info_file
(
dirname
(
$module
->
filepath
)
.
'/'
.
$module
->
name
.
'.info'
);
$query
=
db_insert
(
'system'
)
->
fields
(
array
(
'name'
,
'owner'
,
'info'
,
'type'
,
'filename'
,
'status'
));
foreach
(
$themes
as
$theme
)
{
if
(
!
isset
(
$theme
->
owner
))
{
$theme
->
owner
=
''
;
// Skip modules that don't provide info.
if
(
empty
(
$module
->
info
)
)
{
unset
(
$modules
[
$key
]);
continue
;
}
$query
->
values
(
array
(
'name'
=>
$theme
->
name
,
'owner'
=>
$theme
->
owner
,
'info'
=>
serialize
(
$theme
->
info
),
'type'
=>
'theme'
,
'filename'
=>
$theme
->
filename
,
'status'
=>
isset
(
$theme
->
status
)
?
$theme
->
status
:
0
,
));
// Merge in defaults and save.
$modules
[
$key
]
->
info
=
$module
->
info
+
$defaults
;
// Invoke hook_system_info_alter() to give installed modules a chance to
// modify the data in the .info files if necessary.
drupal_alter
(
'system_info'
,
$modules
[
$key
]
->
info
,
$modules
[
$key
]);
}
$query
->
execute
();
return
$themes
;
return
$modules
;
}
/**
* Collect data about all currently available modules.
*
* @return
* Array of all available modules and their data.
*/
function
system_get_module_data
()
{
$modules
=
_system_get_module_data
();
ksort
(
$modules
);
system_get_files_database
(
$modules
,
'module'
);
system_update_files_database
(
$modules
,
'module'
);
$modules
=
_module_build_dependencies
(
$modules
);
return
$modules
;
}
/**
...
...
@@ -1247,7 +1310,7 @@ function system_theme_data() {
* @return
* An associative array of themes information.
*/
function
_system_theme_data
()
{
function
_system_
get_
theme_data
()
{
static
$themes_info
=
array
();
if
(
empty
(
$themes_info
))
{
...
...
@@ -1256,7 +1319,37 @@ function _system_theme_data() {
// Find theme engines
$engines
=
drupal_system_listing
(
'/\.engine$/'
,
'themes/engines'
);
$defaults
=
system_theme_default
();
// Set defaults for theme info.
$defaults
=
array
(
'regions'
=>
array
(
'left'
=>
'Left sidebar'
,
'right'
=>
'Right sidebar'
,
'content'
=>
'Content'
,
'header'
=>
'Header'
,
'footer'
=>
'Footer'
,
'highlight'
=>
'Highlighted content'
,
'help'
=>
'Help'
,
),
'description'
=>
''
,
'features'
=>
array
(
'comment_user_picture'
,
'favicon'
,
'mission'
,
'logo'
,
'name'
,
'node_user_picture'
,
'search'
,
'slogan'
,
'main_menu'
,
'secondary_menu'
,
),
'stylesheets'
=>
array
(
'all'
=>
array
(
'style.css'
)
),
'scripts'
=>
array
(
'script.js'
),
'screenshot'
=>
'screenshot.png'
,
'php'
=>
DRUPAL_MINIMUM_PHP
,
);
$sub_themes
=
array
();
// Read info files for each theme
...
...
@@ -1339,6 +1432,20 @@ function _system_theme_data() {
return
$themes_info
;
}
/**
* Collect data about all currently available themes.
*
* @return
* Array of all available themes and their data.
*/
function
system_get_theme_data
()
{
$themes
=
_system_get_theme_data
();
ksort
(
$themes
);
system_get_files_database
(
$themes
,
'theme'
);
system_update_files_database
(
$themes
,
'theme'
);
return
$themes
;
}
/**
* Recursive function to find the top level base theme. Themes can inherit
* templates and function implementations from earlier themes.
...
...
modules/update/update.compare.inc
View file @
1f9077ee
...
...
@@ -36,8 +36,8 @@ function update_get_projects() {
$projects
=
update_project_cache
(
'update_project_projects'
);
if
(
empty
(
$projects
))
{
// Still empty, so we have to rebuild the cache.
_update_process_info_list
(
$projects
,
module_rebuild_cache
(),
'module'
);
_update_process_info_list
(
$projects
,
system_theme_data
(),
'theme'
);
_update_process_info_list
(
$projects
,
system_get_module_data
(),
'module'
);
_update_process_info_list
(
$projects
,
system_
get_
theme_data
(),
'theme'
);
// Allow other modules to alter projects before fetching and comparing.
drupal_alter
(
'update_projects'
,
$projects
);
// Cache the site's project data for at most 1 hour.
...
...
update.php
View file @
1f9077ee
...
...
@@ -499,8 +499,8 @@ function update_check_incompatibility($name, $type = 'module') {
// Store values of expensive functions for future use.
if
(
empty
(
$themes
)
||
empty
(
$modules
))
{
$themes
=
_system_theme_data
();
$modules
=
module_rebuild_cache
();
$themes
=
_system_
get_
theme_data
();
$modules
=
system_get_module_data
();
}
if
(
$type
==
'module'
&&
isset
(
$modules
[
$name
]))
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment