6.x update.compare.inc _update_process_info_list(&$projects, $list, $project_type)
7.x update.compare.inc _update_process_info_list(&$projects, $list, $project_type, $status)

Populate an array of project data.

1 call to _update_process_info_list()
update_get_projects in modules/update/update.compare.inc
Fetch an array of installed and enabled projects.


modules/update/update.compare.inc, line 52
Code required only when comparing available updates to existing data.


function _update_process_info_list(&$projects, $list, $project_type) {
  foreach ($list as $file) {
    // A disabled base theme of an enabled sub-theme still has all of its code
    // run by the sub-theme, so we include it in our "enabled" projects list.
    if (!$file->status && !empty($file->sub_themes)) {
      foreach ($file->sub_themes as $key => $name) {
        // Build a list of enabled sub-themes.
        if ($list[$key]->status) {
          $file->enabled_sub_themes[$key] = $name;
      // If there are no enabled subthemes, we should ingore this theme and go
      // on to the next one.
      if (empty($file->enabled_sub_themes)) {
    elseif (empty($file->status)) {
      // Skip disabled modules or themes.

    // Skip if the .info file is broken.
    if (empty($file->info)) {

    // If the .info doesn't define the 'project', try to figure it out.
    if (!isset($file->info['project'])) {
      $file->info['project'] = update_get_project_name($file);

    // If we still don't know the 'project', give up.
    if (empty($file->info['project'])) {

    // If we don't already know it, grab the change time on the .info file
    // itself. Note: we need to use the ctime, not the mtime (modification
    // time) since many (all?) tar implementations will go out of their way to
    // set the mtime on the files it creates to the timestamps recorded in the
    // tarball. We want to see the last time the file was changed on disk,
    // which is left alone by tar and correctly set to the time the .info file
    // was unpacked.
    if (!isset($file->info['_info_file_ctime'])) {
      $info_filename = dirname($file->filename) . '/' . $file->name . '.info';
      $file->info['_info_file_ctime'] = filectime($info_filename);

    if (!isset($file->info['datestamp'])) {
      $file->info['datestamp'] = 0;

    $project_name = $file->info['project'];

    // Add a list of sub-themes that "depend on" the project and a list of base
    // themes that are "required by" the project.
    if ($project_name == 'drupal') {
      // Drupal core is always required, so this extra info would be noise.
      $sub_themes = array();
      $base_themes = array();
    else {
      // Add list of enabled sub-themes.
      $sub_themes = !empty($file->enabled_sub_themes) ? $file->enabled_sub_themes : array();
      // Add list of base themes.
      $base_themes = !empty($file->base_themes) ? $file->base_themes : array();

    if (!isset($projects[$project_name])) {
      // Only process this if we haven't done this project, since a single
      // project can have multiple modules or themes.
      $projects[$project_name] = array(
        'name' => $project_name,
        // Only save attributes from the .info file we care about so we do not
        // bloat our RAM usage needlessly.
        'info' => update_filter_project_info($file->info),
        'datestamp' => $file->info['datestamp'],
        'includes' => array($file->name => $file->info['name']),
        'project_type' => $project_name == 'drupal' ? 'core' : $project_type,
        'sub_themes' => $sub_themes,
        'base_themes' => $base_themes,
    else {
      $projects[$project_name]['includes'][$file->name] = $file->info['name'];
      $projects[$project_name]['info']['_info_file_ctime'] = max($projects[$project_name]['info']['_info_file_ctime'], $file->info['_info_file_ctime']);
      $projects[$project_name]['datestamp'] = max($projects[$project_name]['datestamp'], $file->info['datestamp']);
      $projects[$project_name]['sub_themes'] = array_merge($projects[$project_name]['sub_themes'], $sub_themes);
      $projects[$project_name]['base_themes'] = array_merge($projects[$project_name]['base_themes'], $base_themes);