Commit c0f384fa authored by jhodgdon's avatar jhodgdon

Issue #1431634 by Tor Arne Thune: API docs cleanup for update module

parent ff639ed5
......@@ -7,12 +7,15 @@
namespace Drupal\update\Tests;
/**
* Tests behavior related to handling updates to contributed modules and themes.
*/
class UpdateContribTest extends UpdateTestBase {
public static function getInfo() {
return array(
'name' => 'Update contrib functionality',
'description' => 'Tests how the update module handles contributed modules and themes in a series of functional tests using mock XML data.',
'description' => 'Tests how the Update Manager module handles contributed modules and themes in a series of functional tests using mock XML data.',
'group' => 'Update',
);
}
......@@ -52,7 +55,7 @@ function testNoReleasesAvailable() {
}
/**
* Test the basic functionality of a contrib module on the status report.
* Tests the basic functionality of a contrib module on the status report.
*/
function testUpdateContribBasic() {
$system_info = array(
......@@ -80,17 +83,17 @@ function testUpdateContribBasic() {
}
/**
* Test that contrib projects are ordered by project name.
* Tests that contrib projects are ordered by project name.
*
* If a project contains multiple modules, we want to make sure that the
* available updates report is sorted by the parent project names, not by
* the names of the modules included in each project. In this test case, we
* have 2 contrib projects, "BBB Update test" and "CCC Update test".
* However, we have a module called "aaa_update_test" that's part of the
* "CCC Update test" project. We need to make sure that we see the "BBB"
* project before the "CCC" project, even though "CCC" includes a module
* that's processed first if you sort alphabetically by module name (which
* is the order we see things inside system_rebuild_module_data() for example).
* available updates report is sorted by the parent project names, not by the
* names of the modules included in each project. In this test case, we have
* two contrib projects, "BBB Update test" and "CCC Update test". However, we
* have a module called "aaa_update_test" that's part of the "CCC Update test"
* project. We need to make sure that we see the "BBB" project before the
* "CCC" project, even though "CCC" includes a module that's processed first
* if you sort alphabetically by module name (which is the order we see things
* inside system_rebuild_module_data() for example).
*/
function testUpdateContribOrder() {
// We want core to be version 7.0.
......@@ -152,7 +155,7 @@ function testUpdateContribOrder() {
}
/**
* Test that subthemes are notified about security updates for base themes.
* Tests that subthemes are notified about security updates for base themes.
*/
function testUpdateBaseThemeSecurityUpdate() {
// Only enable the subtheme, not the base theme.
......@@ -193,7 +196,7 @@ function testUpdateBaseThemeSecurityUpdate() {
}
/**
* Test that disabled themes are only shown when desired.
* Tests that disabled themes are only shown when desired.
*/
function testUpdateShowDisabledThemes() {
// Make sure all the update_test_* themes are disabled.
......@@ -254,7 +257,7 @@ function testUpdateShowDisabledThemes() {
}
/**
* Make sure that if we fetch from a broken URL, sane things happen.
* Makes sure that if we fetch from a broken URL, sane things happen.
*/
function testUpdateBrokenFetchURL() {
$system_info = array(
......@@ -310,13 +313,12 @@ function testUpdateBrokenFetchURL() {
}
/**
* Check that hook_update_status_alter() works to change a status.
* Checks that hook_update_status_alter() works to change a status.
*
* We provide the same external data as if aaa_update_test 8.x-1.0 were
* installed and that was the latest release. Then we use
* hook_update_status_alter() to try to mark this as missing a security
* update, then assert if we see the appropriate warnings on the right
* pages.
* update, then assert if we see the appropriate warnings on the right pages.
*/
function testHookUpdateStatusAlter() {
variable_set('allow_authorize_operations', TRUE);
......
......@@ -7,12 +7,15 @@
namespace Drupal\update\Tests;
/**
* Tests behavior related to discovering and listing updates to Drupal core.
*/
class UpdateCoreTest extends UpdateTestBase {
public static function getInfo() {
return array(
'name' => 'Update core functionality',
'description' => 'Tests the update module through a series of functional tests using mock XML data.',
'description' => 'Tests the Update Manager module through a series of functional tests using mock XML data.',
'group' => 'Update',
);
}
......@@ -24,7 +27,7 @@ function setUp() {
}
/**
* Tests the update module when no updates are available.
* Tests the Update Manager module when no updates are available.
*/
function testNoUpdatesAvailable() {
$this->setSystemInfo7_0();
......@@ -36,7 +39,7 @@ function testNoUpdatesAvailable() {
}
/**
* Tests the update module when one normal update ("7.1") is available.
* Tests the Update Manager module when one normal update is available.
*/
function testNormalUpdateAvailable() {
$this->setSystemInfo7_0();
......@@ -51,7 +54,7 @@ function testNormalUpdateAvailable() {
}
/**
* Tests the update module when a security update ("7.2") is available.
* Tests the Update Manager module when a security update is available.
*/
function testSecurityUpdateAvailable() {
$this->setSystemInfo7_0();
......@@ -66,7 +69,7 @@ function testSecurityUpdateAvailable() {
}
/**
* Ensure proper results where there are date mismatches among modules.
* Ensures proper results where there are date mismatches among modules.
*/
function testDatestampMismatch() {
$system_info = array(
......@@ -89,7 +92,7 @@ function testDatestampMismatch() {
}
/**
* Check that running cron updates the list of available updates.
* Checks that running cron updates the list of available updates.
*/
function testModulePageRunCron() {
$this->setSystemInfo7_0();
......@@ -102,7 +105,7 @@ function testModulePageRunCron() {
}
/**
* Check the messages at admin/modules when the site is up to date.
* Checks the messages at admin/modules when the site is up to date.
*/
function testModulePageUpToDate() {
$this->setSystemInfo7_0();
......@@ -119,7 +122,7 @@ function testModulePageUpToDate() {
}
/**
* Check the messages at admin/modules when missing an update.
* Checks the messages at admin/modules when an update is missing.
*/
function testModulePageRegularUpdate() {
$this->setSystemInfo7_0();
......@@ -136,7 +139,7 @@ function testModulePageRegularUpdate() {
}
/**
* Check the messages at admin/modules when missing a security update.
* Checks the messages at admin/modules when a security update is missing.
*/
function testModulePageSecurityUpdate() {
$this->setSystemInfo7_0();
......@@ -171,7 +174,7 @@ function testModulePageSecurityUpdate() {
}
/**
* Tests the update module when the update server returns 503 (Service unavailable) errors.
* Tests the Update Manager module when the update server returns 503 errors.
*/
function testServiceUnavailable() {
$this->refreshUpdateStatus(array(), '503-error');
......@@ -207,6 +210,9 @@ function testFetchTasks() {
$this->assertEqual($queue->numberOfItems(), 2, 'Queue contains two items');
}
/**
* Sets the version to 7.0 when no project-specific mapping is defined.
*/
protected function setSystemInfo7_0() {
$setting = array(
'#all' => array(
......
......@@ -9,6 +9,9 @@
use Drupal\simpletest\UnitTestBase;
/**
* Tests update functionality unrelated to the database.
*/
class UpdateCoreUnitTest extends UnitTestBase {
public static function getInfo() {
......@@ -25,7 +28,7 @@ function setUp() {
}
/**
* Tests _update_build_fetch_url according to issue 1481156
* Tests that _update_build_fetch_url() builds the URL correctly.
*/
function testUpdateBuildFetchUrl() {
//first test that we didn't break the trivial case
......
......@@ -4,18 +4,18 @@
* @file
* Definition of Drupal\update\Tests\UpdateTestBase.
*
* This file contains tests for the update module. The overarching methodology
* of these tests is we need to compare a given state of installed modules and
* themes (e.g. version, project grouping, timestamps, etc) vs. a current
* state of what the release history XML files we fetch say is available. We
* have dummy XML files (in the 'tests' subdirectory) that describe various
* scenarios of what's available for different test projects, and we have
* dummy .info file data (specified via hook_system_info_alter() in the
* update_test helper module) describing what's currently installed. Each
* test case defines a set of projects to install, their current state (via
* the 'update_test_system_info' variable) and the desired available update
* data (via the 'update_test_xml_map' variable), and then performs a series
* of assertions that the report matches our expectations given the specific
* The overarching methodology of these tests is we need to compare a given
* state of installed modules and themes (e.g., version, project grouping,
* timestamps, etc) against a current state of what the release history XML
* files we fetch say is available. We have dummy XML files (in the
* core/modules/update/tests directory) that describe various scenarios of
* what's available for different test projects, and we have dummy .info file
* data (specified via hook_system_info_alter() in the update_test helper
* module) describing what's currently installed. Each test case defines a set
* of projects to install, their current state (via the
* 'update_test_system_info' variable) and the desired available update data
* (via the 'update_test_xml_map' variable), and then performs a series of
* assertions that the report matches our expectations given the specific
* initial state and availability scenario.
*/
......@@ -24,20 +24,25 @@
use Drupal\simpletest\WebTestBase;
/**
* Base class to define some shared functions used by all update tests.
* Defines some shared functions used by all update tests.
*/
class UpdateTestBase extends WebTestBase {
/**
* Refresh the update status based on the desired available update scenario.
* Refreshes the update status based on the desired available update scenario.
*
* @param $xml_map
* Array that maps project names to availability scenarios to fetch.
* The key '#all' is used if a project-specific mapping is not defined.
* Array that maps project names to availability scenarios to fetch. The key
* '#all' is used if a project-specific mapping is not defined.
* @param $url
* (optional) A string containing the URL to fetch update data from.
* Defaults to 'update-test'.
*
* @see update_test_mock_page()
*/
protected function refreshUpdateStatus($xml_map, $url = 'update-test') {
// Tell update module to fetch from the URL provided by update_test module.
// Tell the Update Manager module to fetch from the URL provided by
// update_test module.
variable_set('update_fetch_url', url($url, array('absolute' => TRUE)));
// Save the map for update_test_mock_page() to use.
variable_set('update_test_xml_map', $xml_map);
......@@ -46,7 +51,7 @@ protected function refreshUpdateStatus($xml_map, $url = 'update-test') {
}
/**
* Run a series of assertions that are applicable for all update statuses.
* Runs a series of assertions that are applicable to all update statuses.
*/
protected function standardTests() {
$this->assertRaw('<h3>' . t('Drupal core') . '</h3>');
......
......@@ -7,11 +7,15 @@
namespace Drupal\update\Tests;
/**
* Tests project upload and extract functionality.
*/
class UpdateUploadTest extends UpdateTestBase {
public static function getInfo() {
return array(
'name' => 'Upload and extract module functionality',
'description' => 'Tests the update module\'s upload and extraction functionality.',
'description' => 'Tests the Update Manager module\'s upload and extraction functionality.',
'group' => 'Update',
);
}
......@@ -52,7 +56,7 @@ public function testUploadModule() {
}
/**
* Ensure that archiver extensions are properly merged in the UI.
* Ensures that archiver extensions are properly merged in the UI.
*/
function testFileNameExtensionMerging() {
$this->drupalGet('admin/modules/install');
......@@ -63,7 +67,7 @@ function testFileNameExtensionMerging() {
}
/**
* Check the messages on Update manager pages when missing a security update.
* Checks the messages on update manager pages when missing a security update.
*/
function testUpdateManagerCoreSecurityUpdateMessages() {
$setting = array(
......
......@@ -3,6 +3,11 @@
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
/**
* @file
* Module for testing Update Manager functionality.
*/
/**
* Implements hook_system_theme_info().
*/
......@@ -37,13 +42,13 @@ function update_test_menu() {
/**
* Implements hook_system_info_alter().
*
* This checks the 'update_test_system_info' variable and sees if we need to
* alter the system info for the given $file based on the setting. The setting
* is expected to be a nested associative array. If the key '#all' is defined,
* its subarray will include .info keys and values for all modules and themes
* on the system. Otherwise, the settings array is keyed by the module or
* theme short name ($file->name) and the subarrays contain settings just for
* that module or theme.
* Checks the 'update_test_system_info' variable and sees if we need to alter
* the system info for the given $file based on the setting. The setting is
* expected to be a nested associative array. If the key '#all' is defined, its
* subarray will include .info keys and values for all modules and themes on the
* system. Otherwise, the settings array is keyed by the module or theme short
* name ($file->name) and the subarrays contain settings just for that module or
* theme.
*/
function update_test_system_info_alter(&$info, $file) {
$setting = variable_get('update_test_system_info', array());
......@@ -59,13 +64,12 @@ function update_test_system_info_alter(&$info, $file) {
/**
* Implements hook_update_status_alter().
*
* This checks the 'update_test_update_status' variable and sees if we need to
* alter the update status for the given project based on the setting. The
* setting is expected to be a nested associative array. If the key '#all' is
* defined, its subarray will include .info keys and values for all modules
* and themes on the system. Otherwise, the settings array is keyed by the
* module or theme short name and the subarrays contain settings just for that
* module or theme.
* Checks the 'update_test_update_status' variable and sees if we need to alter
* the update status for the given project based on the setting. The setting is
* expected to be a nested associative array. If the key '#all' is defined, its
* subarray will include .info keys and values for all modules and themes on the
* system. Otherwise, the settings array is keyed by the module or theme short
* name and the subarrays contain settings just for that module or theme.
*/
function update_test_update_status_alter(&$projects) {
$setting = variable_get('update_test_update_status', array());
......@@ -83,18 +87,25 @@ function update_test_update_status_alter(&$projects) {
}
/**
* Page callback, prints mock XML for the update module.
* Page callback: Prints mock XML for the Update Manager module.
*
* The specific XML file to print depends on two things: the project we're
* trying to fetch data for, and the desired "availability scenario" for that
* project which we're trying to test. Before attempting to fetch this data
* (by checking for updates on the available updates report), callers need to
* define the 'update_test_xml_map' variable as an array, keyed by project
* name, indicating which availability scenario to use for that project.
* project which we're trying to test. Before attempting to fetch this data (by
* checking for updates on the available updates report), callers need to define
* the 'update_test_xml_map' variable as an array, keyed by project name,
* indicating which availability scenario to use for that project.
*
* @param $project_name
* The project short name update.module is trying to fetch data for (the
* The project short name the update manager is trying to fetch data for (the
* fetch URLs are of the form: [base_url]/[project_name]/[core_version]).
*
* @return StreamedResponse|Response
* A StreamedResponse object containing the content of the XML release file
* for the specified project if one is available; a Response object with no
* content otherwise.
*
* @see update_test_menu()
*/
function update_test_mock_page($project_name) {
$xml_map = variable_get('update_test_xml_map', FALSE);
......@@ -124,7 +135,7 @@ function update_test_mock_page($project_name) {
}
/**
* Implement hook_archiver_info().
* Implements hook_archiver_info().
*/
function update_test_archiver_info() {
return array(
......@@ -156,13 +167,23 @@ function update_test_filetransfer_info() {
}
/**
* Mock FileTransfer object to test the settings form functionality.
* Mocks a FileTransfer object to test the settings form functionality.
*/
class UpdateTestFileTransfer {
/**
* Returns an UpdateTestFileTransfer object.
*
* @return
* A new UpdateTestFileTransfer object.
*/
public static function factory() {
return new UpdateTestFileTransfer;
}
/**
* Returns a settings form with a text field to input a username.
*/
public function getSettingsForm() {
$form = array();
$form['udpate_test_username'] = array(
......@@ -174,7 +195,9 @@ public function getSettingsForm() {
}
/**
* Return an Error 503 (Service unavailable) page.
* Page callback: Displays an Error 503 (Service unavailable) page.
*
* @see update_test_menu()
*/
function update_callback_service_unavailable() {
drupal_add_http_header('Status', '503 Service unavailable');
......
/**
* @file
* RTL styles used by the Update Manager module.
*/
.update .project {
padding-right: .25em;
......
......@@ -2,7 +2,7 @@
/**
* @file
* Hooks provided by the Update Status module.
* Hooks provided by the Update Manager module.
*/
/**
......@@ -14,23 +14,22 @@
* Alter the list of projects before fetching data and comparing versions.
*
* Most modules will never need to implement this hook. It is for advanced
* interaction with the update status module: mere mortals need not apply.
* The primary use-case for this hook is to add projects to the list, for
* example, to provide update status data on disabled modules and themes. A
* contributed module might want to hide projects from the list, for example,
* if there is a site-specific module that doesn't have any official releases,
* that module could remove itself from this list to avoid "No available
* releases found" warnings on the available updates report. In rare cases, a
* module might want to alter the data associated with a project already in
* the list.
* interaction with the Update Manager module. The primary use-case for this
* hook is to add projects to the list; for example, to provide update status
* data on disabled modules and themes. A contributed module might want to hide
* projects from the list; for example, if there is a site-specific module that
* doesn't have any official releases, that module could remove itself from this
* list to avoid "No available releases found" warnings on the available updates
* report. In rare cases, a module might want to alter the data associated with
* a project already in the list.
*
* @param $projects
* Reference to an array of the projects installed on the system. This
* includes all the metadata documented in the comments below for each
* project (either module or theme) that is currently enabled. The array is
* initially populated inside update_get_projects() with the help of
* update_process_info_list(), so look there for examples of how to
* populate the array with real values.
* includes all the metadata documented in the comments below for each project
* (either module or theme) that is currently enabled. The array is initially
* populated inside update_get_projects() with the help of
* update_process_info_list(), so look there for examples of how to populate
* the array with real values.
*
* @see update_get_projects()
* @see update_process_info_list()
......@@ -118,6 +117,7 @@ function hook_update_status_alter(&$projects) {
* no problems, return an empty array.
*
* @see update_manager_archive_verify()
* @ingroup update_manager_file
*/
function hook_verify_update_archive($project, $archive_file, $directory) {
$errors = array();
......
......@@ -2,17 +2,21 @@
/**
* @file
* Callbacks and related functions invoked by authorize.php to update projects
* on the Drupal site. We use the Batch API to actually update each individual
* project on the site. All of the code in this file is run at a low bootstrap
* level (modules are not loaded), so these functions cannot assume access to
* the rest of the update module code.
* Callbacks and related functions invoked by authorize.php to update projects.
*
* We use the Batch API to actually update each individual project on the site.
* All of the code in this file is run at a low bootstrap level (modules are not
* loaded), so these functions cannot assume access to the rest of the code of
* the Update Manager module.
*/
use Drupal\Core\Updater\UpdaterException;
/**
* Callback invoked by authorize.php to update existing projects.
* Updates existing projects when invoked by authorize.php.
*
* Callback for system_authorized_init() in
* update_manager_update_ready_form_submit().
*
* @param $filetransfer
* The FileTransfer object created by authorize.php for use during this
......@@ -20,10 +24,10 @@
* @param $projects
* A nested array of projects to install into the live webroot, keyed by
* project name. Each subarray contains the following keys:
* - 'project': The canonical project short name.
* - 'updater_name': The name of the Drupal\Core\Updater\Updater class to use
* - project: The canonical project short name.
* - updater_name: The name of the Drupal\Core\Updater\Updater class to use
* for this project.
* - 'local_url': The locally installed location of new code to update with.
* - local_url: The locally installed location of new code to update with.
*/
function update_authorize_run_update($filetransfer, $projects) {
$operations = array();
......@@ -53,13 +57,16 @@ function update_authorize_run_update($filetransfer, $projects) {
}
/**
* Callback invoked by authorize.php to install a new project.
* Installs a new project when invoked by authorize.php.
*
* Callback for system_authorized_init() in
* update_manager_install_form_submit().
*
* @param FileTransfer $filetransfer
* The FileTransfer object created by authorize.php for use during this
* operation.
* @param string $project
* The canonical project short name (e.g. {system}.name).
* The canonical project short name (e.g., {system}.name).
* @param string $updater_name
* The name of the Drupal\Core\Updater\Updater class to use for installing
* this project.
......@@ -94,7 +101,7 @@ function update_authorize_run_install($filetransfer, $project, $updater_name, $l
}
/**
* Copy a project to its proper place when authorized with elevated privileges.
* Batch callback: Copies project to its proper place when authorized to do so.
*
* @param string $project
* The canonical short name of the project being installed.
......@@ -107,7 +114,7 @@ function update_authorize_run_install($filetransfer, $project, $updater_name, $l
* @param FileTransfer $filetransfer
* The FileTransfer object to use for performing this operation.
* @param array $context
* Reference to an array used for BatchAPI storage.
* Reference to an array used for Batch API storage.
*/
function update_authorize_batch_copy_project($project, $updater_name, $local_url, $filetransfer, &$context) {
......@@ -123,15 +130,13 @@ function update_authorize_batch_copy_project($project, $updater_name, $local_url
$context['results']['tasks'] = array();
}
/**
* The batch API uses a session, and since all the arguments are serialized
* and unserialized between requests, although the FileTransfer object
* itself will be reconstructed, the connection pointer itself will be lost.
* However, the FileTransfer object will still have the connection variable,
* even though the connection itself is now gone. So, although it's ugly, we
* have to unset the connection variable at this point so that the
* FileTransfer object will re-initiate the actual connection.
*/
// The batch API uses a session, and since all the arguments are serialized
// and unserialized between requests, although the FileTransfer object itself
// will be reconstructed, the connection pointer itself will be lost. However,
// the FileTransfer object will still have the connection variable, even
// though the connection itself is now gone. So, although it's ugly, we have
// to unset the connection variable at this point so that the FileTransfer
// object will re-initiate the actual connection.
unset($filetransfer->connection);
if (!empty($context['results']['log'][$project]['#abort'])) {
......@@ -168,11 +173,16 @@ function update_authorize_batch_copy_project($project, $updater_name, $local_url
}
/**
* Batch callback for when the authorized update batch is finished.
* Batch callback: Performs actions when the authorized update batch is done.
*
* This processes the results and stashes them into SESSION such that
* authorize.php will render a report. Also responsible for putting the site
* back online and clearing the update status cache after a successful update.
*
* @param $success
* TRUE if the batch operation was successful; FALSE if there were errors.
* @param $results
* An associative array of results from the batch operation.
*/
function update_authorize_update_batch_finished($success, $results) {
foreach ($results['log'] as $project => $messages) {
......@@ -230,11 +240,16 @@ function update_authorize_update_batch_finished($success, $results) {
}
/**
* Batch callback for when the authorized install batch is finished.
* Batch callback: Performs actions when the authorized install batch is done.
*
* This processes the results and stashes them into SESSION such that
* authorize.php will render a report. Also responsible for putting the site
* back online after a successful install if necessary.
*
* @param $success
* TRUE if the batch operation was a success; FALSE if there were errors.
* @param $results
* An associative array of results from the batch operation.
*/
function update_authorize_install_batch_finished($success, $results) {
foreach ($results['log'] as $project => $messages) {
......@@ -284,26 +299,30 @@ function update_authorize_install_batch_finished($success, $results) {
}
/**
* Helper function to create a structure of log messages.
* Creates a structure of log messages.
*
* @param array $project_results
* An associative array of results from the batch operation.
* @param string $message
* A string containing a log message.
* @param bool $success
* (optional) TRUE if the operation the message is about was a success, FALSE
* if there were errors. Defaults to TRUE.
*/
function _update_batch_create_message(&$project_results, $message, $success = TRUE) {
$project_results[] = array('message' => $message, 'success' => $success);
}
/**
* Private helper function to clear cached available update status data.
* Clears cached available update status data.
*
* Since this function is run at such a low bootstrap level, update.module is
* not loaded. So, we can't just call _update_cache_clear(). However, the
* database is bootstrapped, so we can do a query ourselves to clear out what
* we want to clear.
* Since this function is run at such a low bootstrap level, the Update Manager
* module is not loaded. So, we can't just call _update_cache_clear(). However,
* the database is bootstrapped, so we can do a query ourselves to clear out
* what we want to clear.
*
* Note that we do not want to just truncate the table, since that would
* remove items related to currently pending fetch attempts.
* Note that we do not want to just truncate the table, since that would remove
* items related to currently pending fetch attempts.
*
* @see update_authorize_update_batch_finished()
* @see _update_cache_clear()
......
This diff is collapsed.
/**
* @file
* Styles used by the Update Manager module.
*/
.update .project {
font-weight: bold;
......
......@@ -6,7 +6,11 @@
*/
/**
* Callback to manually check the update status without cron.
* Page callback: Checks for updates and displays the update status report.
*
* Manually checks the update status without the use of cron.
*
* @see update_menu()
*/
function update_manual_status() {
_update_refresh();
......@@ -25,7 +29,10 @@ function update_manual_status() {
}
/**
* Process a step in the batch for fetching available update data.
* Batch callback: Processes a step in batch for fetching available update data.
*
* @param $context
* Reference to an array used for Batch API storage.
*/
function update_fetch_data_batch(&$context) {
$queue = queue('update_fetch_tasks');
......@@ -70,12 +77,12 @@ function update_fetch_data_batch(&$context) {
}
/**
* Batch API callback when all fetch tasks have been completed.
* Batch callback: Performs actions when all fetch tasks have been completed.
*
* @param $success
* Boolean indicating the success of the batch.
* TRUE if the batch operation was successful; FALSE if there were errors.
* @param $results
* Associative array holding the results of the batch, including the key
* An associative array of results from the batch operation, including the key
* 'updated' which holds the total number of projects we fetched available
* update data for.
*/
......@@ -96,7 +103,7 @@ function update_fetch_data_finished($success, $results) {
}
/**
* Attempt to drain the queue of tasks for release history data to fetch.
* Attempts to drain the queue of tasks for release history data to fetch.
*/