function update_get_available

Tries to get update information and refreshes it when necessary.

In addition to checking the lifetime, this function also ensures that there are no .info.yml files for enabled modules or themes that have a newer modification timestamp than the last time we checked for available update data. If any .info.yml file was modified, it almost certainly means a new version of something was installed. Without fresh available update data, the logic in update_calculate_project_data() will be wrong and produce confusing, bogus results.

Parameters

$refresh: (optional) Boolean to indicate if this method should refresh automatically if there's no data. Defaults to FALSE.

Return value

Array of data about available releases, keyed by project shortname.

See also

update_refresh()

update_get_projects()

5 calls to update_get_available()
locale_translation_build_projects in drupal/core/modules/locale/locale.compare.inc
Builds list of projects and stores the result in the database.
UpdateController::updateStatus in drupal/core/modules/update/lib/Drupal/update/Controller/UpdateController.php
Returns a page about the update status of projects.
update_cron in drupal/core/modules/update/update.module
Implements hook_cron().
update_manager_update_form in drupal/core/modules/update/update.manager.inc
Form constructor for the update form of the Update Manager module.
update_requirements in drupal/core/modules/update/update.install
Implements hook_requirements().

File

drupal/core/modules/update/update.module, line 386
Handles updates of Drupal core and contributed projects.

Code

function update_get_available($refresh = FALSE) {
  module_load_include('inc', 'update', 'update.compare');
  $needs_refresh = FALSE;

  // Grab whatever data we currently have.
  $available = Drupal::keyValueExpirable('update_available_releases')
    ->getAll();
  $projects = update_get_projects();
  foreach ($projects as $key => $project) {

    // If there's no data at all, we clearly need to fetch some.
    if (empty($available[$key])) {
      update_create_fetch_task($project);
      $needs_refresh = TRUE;
      continue;
    }

    // See if the .info.yml file is newer than the last time we checked for
    // data, and if so, mark this project's data as needing to be re-fetched.
    // Any time an admin upgrades their local installation, the .info.yml file
    // will be changed, so this is the only way we can be sure we're not showing
    // bogus information right after they upgrade.
    if ($project['info']['_info_file_ctime'] > $available[$key]['last_fetch']) {
      $available[$key]['fetch_status'] = UPDATE_FETCH_PENDING;
    }

    // If we have project data but no release data, we need to fetch. This
    // can be triggered when we fail to contact a release history server.
    if (empty($available[$key]['releases'])) {
      $available[$key]['fetch_status'] = UPDATE_FETCH_PENDING;
    }

    // If we think this project needs to fetch, actually create the task now
    // and remember that we think we're missing some data.
    if (!empty($available[$key]['fetch_status']) && $available[$key]['fetch_status'] == UPDATE_FETCH_PENDING) {
      update_create_fetch_task($project);
      $needs_refresh = TRUE;
    }
  }
  if ($needs_refresh && $refresh) {

    // Attempt to drain the queue of fetch tasks.
    update_fetch_data();

    // After processing the queue, we've (hopefully) got better data, so pull
    // the latest data again and use that directly.
    $available = Drupal::keyValueExpirable('update_available_releases')
      ->getAll();
  }
  return $available;
}