Fetches an array of installed and enabled projects.
This is only responsible for generating an array of projects (taking into account projects that include more than one module or theme). Other information like the specific version and install type (official release, dev snapshot, etc) is handled later in update_process_project_info() since that logic is only required when preparing the status report, not for fetching the available release data.
This array is fairly expensive to construct, since it involves a lot of disk I/O, so we store the results. However, since this is not the data about available updates fetched from the network, it is acceptable to invalidate it somewhat quickly. If we keep this data for very long, site administrators are more likely to see incorrect results if they upgrade to a newer version of a module or theme but do not visit certain pages that automatically clear this data.
An associative array of currently enabled projects keyed by the machine-readable project short name. Each project contains:
update_calculate_project_data()
function update_get_projects() {
$projects =& drupal_static(__FUNCTION__, array());
if (empty($projects)) {
// Retrieve the projects from storage, if present.
$projects = update_project_storage('update_project_projects');
if (empty($projects)) {
// Still empty, so we have to rebuild.
$module_data = system_rebuild_module_data();
$theme_data = system_rebuild_theme_data();
update_process_info_list($projects, $module_data, 'module', TRUE);
update_process_info_list($projects, $theme_data, 'theme', TRUE);
if (config('update.settings')
->get('check.disabled_extensions')) {
update_process_info_list($projects, $module_data, 'module', FALSE);
update_process_info_list($projects, $theme_data, 'theme', FALSE);
}
// Allow other modules to alter projects before fetching and comparing.
drupal_alter('update_projects', $projects);
// Store the site's project data for at most 1 hour.
Drupal::keyValueExpirable('update')
->setWithExpire('update_project_projects', $projects, 3600);
}
}
return $projects;
}