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 @@ ...@@ -7,12 +7,15 @@
namespace Drupal\update\Tests; namespace Drupal\update\Tests;
/**
* Tests behavior related to handling updates to contributed modules and themes.
*/
class UpdateContribTest extends UpdateTestBase { class UpdateContribTest extends UpdateTestBase {
public static function getInfo() { public static function getInfo() {
return array( return array(
'name' => 'Update contrib functionality', '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', 'group' => 'Update',
); );
} }
...@@ -52,7 +55,7 @@ function testNoReleasesAvailable() { ...@@ -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() { function testUpdateContribBasic() {
$system_info = array( $system_info = array(
...@@ -80,17 +83,17 @@ function testUpdateContribBasic() { ...@@ -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 * 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 * available updates report is sorted by the parent project names, not by the
* the names of the modules included in each project. In this test case, we * names of the modules included in each project. In this test case, we have
* have 2 contrib projects, "BBB Update test" and "CCC Update test". * two contrib projects, "BBB Update test" and "CCC Update test". However, we
* However, we have a module called "aaa_update_test" that's part of the * have a module called "aaa_update_test" that's part of the "CCC Update test"
* "CCC Update test" project. We need to make sure that we see the "BBB" * project. We need to make sure that we see the "BBB" project before the
* project before the "CCC" project, even though "CCC" includes a module * "CCC" project, even though "CCC" includes a module that's processed first
* that's processed first if you sort alphabetically by module name (which * if you sort alphabetically by module name (which is the order we see things
* is the order we see things inside system_rebuild_module_data() for example). * inside system_rebuild_module_data() for example).
*/ */
function testUpdateContribOrder() { function testUpdateContribOrder() {
// We want core to be version 7.0. // We want core to be version 7.0.
...@@ -152,7 +155,7 @@ function testUpdateContribOrder() { ...@@ -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() { function testUpdateBaseThemeSecurityUpdate() {
// Only enable the subtheme, not the base theme. // Only enable the subtheme, not the base theme.
...@@ -193,7 +196,7 @@ function testUpdateBaseThemeSecurityUpdate() { ...@@ -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() { function testUpdateShowDisabledThemes() {
// Make sure all the update_test_* themes are disabled. // Make sure all the update_test_* themes are disabled.
...@@ -254,7 +257,7 @@ function testUpdateShowDisabledThemes() { ...@@ -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() { function testUpdateBrokenFetchURL() {
$system_info = array( $system_info = array(
...@@ -310,13 +313,12 @@ function testUpdateBrokenFetchURL() { ...@@ -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 * 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 * installed and that was the latest release. Then we use
* hook_update_status_alter() to try to mark this as missing a security * 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 * update, then assert if we see the appropriate warnings on the right pages.
* pages.
*/ */
function testHookUpdateStatusAlter() { function testHookUpdateStatusAlter() {
variable_set('allow_authorize_operations', TRUE); variable_set('allow_authorize_operations', TRUE);
......
...@@ -7,12 +7,15 @@ ...@@ -7,12 +7,15 @@
namespace Drupal\update\Tests; namespace Drupal\update\Tests;
/**
* Tests behavior related to discovering and listing updates to Drupal core.
*/
class UpdateCoreTest extends UpdateTestBase { class UpdateCoreTest extends UpdateTestBase {
public static function getInfo() { public static function getInfo() {
return array( return array(
'name' => 'Update core functionality', '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', 'group' => 'Update',
); );
} }
...@@ -24,7 +27,7 @@ function setUp() { ...@@ -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() { function testNoUpdatesAvailable() {
$this->setSystemInfo7_0(); $this->setSystemInfo7_0();
...@@ -36,7 +39,7 @@ function testNoUpdatesAvailable() { ...@@ -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() { function testNormalUpdateAvailable() {
$this->setSystemInfo7_0(); $this->setSystemInfo7_0();
...@@ -51,7 +54,7 @@ function testNormalUpdateAvailable() { ...@@ -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() { function testSecurityUpdateAvailable() {
$this->setSystemInfo7_0(); $this->setSystemInfo7_0();
...@@ -66,7 +69,7 @@ function testSecurityUpdateAvailable() { ...@@ -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() { function testDatestampMismatch() {
$system_info = array( $system_info = array(
...@@ -89,7 +92,7 @@ function testDatestampMismatch() { ...@@ -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() { function testModulePageRunCron() {
$this->setSystemInfo7_0(); $this->setSystemInfo7_0();
...@@ -102,7 +105,7 @@ function testModulePageRunCron() { ...@@ -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() { function testModulePageUpToDate() {
$this->setSystemInfo7_0(); $this->setSystemInfo7_0();
...@@ -119,7 +122,7 @@ function testModulePageUpToDate() { ...@@ -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() { function testModulePageRegularUpdate() {
$this->setSystemInfo7_0(); $this->setSystemInfo7_0();
...@@ -136,7 +139,7 @@ function testModulePageRegularUpdate() { ...@@ -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() { function testModulePageSecurityUpdate() {
$this->setSystemInfo7_0(); $this->setSystemInfo7_0();
...@@ -171,7 +174,7 @@ function testModulePageSecurityUpdate() { ...@@ -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() { function testServiceUnavailable() {
$this->refreshUpdateStatus(array(), '503-error'); $this->refreshUpdateStatus(array(), '503-error');
...@@ -207,6 +210,9 @@ function testFetchTasks() { ...@@ -207,6 +210,9 @@ function testFetchTasks() {
$this->assertEqual($queue->numberOfItems(), 2, 'Queue contains two items'); $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() { protected function setSystemInfo7_0() {
$setting = array( $setting = array(
'#all' => array( '#all' => array(
......
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
use Drupal\simpletest\UnitTestBase; use Drupal\simpletest\UnitTestBase;
/**
* Tests update functionality unrelated to the database.
*/
class UpdateCoreUnitTest extends UnitTestBase { class UpdateCoreUnitTest extends UnitTestBase {
public static function getInfo() { public static function getInfo() {
...@@ -25,7 +28,7 @@ function setUp() { ...@@ -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() { function testUpdateBuildFetchUrl() {
//first test that we didn't break the trivial case //first test that we didn't break the trivial case
......
...@@ -4,18 +4,18 @@ ...@@ -4,18 +4,18 @@
* @file * @file
* Definition of Drupal\update\Tests\UpdateTestBase. * Definition of Drupal\update\Tests\UpdateTestBase.
* *
* This file contains tests for the update module. The overarching methodology * The overarching methodology of these tests is we need to compare a given
* of these tests is we need to compare a given state of installed modules and * state of installed modules and themes (e.g., version, project grouping,
* themes (e.g. version, project grouping, timestamps, etc) vs. a current * timestamps, etc) against a current state of what the release history XML
* state of what the release history XML files we fetch say is available. We * files we fetch say is available. We have dummy XML files (in the
* have dummy XML files (in the 'tests' subdirectory) that describe various * core/modules/update/tests directory) that describe various scenarios of
* scenarios of what's available for different test projects, and we have * what's available for different test projects, and we have dummy .info file
* dummy .info file data (specified via hook_system_info_alter() in the * data (specified via hook_system_info_alter() in the update_test helper
* update_test helper module) describing what's currently installed. Each * module) describing what's currently installed. Each test case defines a set
* test case defines a set of projects to install, their current state (via * of projects to install, their current state (via the
* the 'update_test_system_info' variable) and the desired available update * 'update_test_system_info' variable) and the desired available update data
* data (via the 'update_test_xml_map' variable), and then performs a series * (via the 'update_test_xml_map' variable), and then performs a series of
* of assertions that the report matches our expectations given the specific * assertions that the report matches our expectations given the specific
* initial state and availability scenario. * initial state and availability scenario.
*/ */
...@@ -24,20 +24,25 @@ ...@@ -24,20 +24,25 @@
use Drupal\simpletest\WebTestBase; 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 { 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 * @param $xml_map
* Array that maps project names to availability scenarios to fetch. * Array that maps project names to availability scenarios to fetch. The key
* The key '#all' is used if a project-specific mapping is not defined. * '#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() * @see update_test_mock_page()
*/ */
protected function refreshUpdateStatus($xml_map, $url = 'update-test') { 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))); variable_set('update_fetch_url', url($url, array('absolute' => TRUE)));
// Save the map for update_test_mock_page() to use. // Save the map for update_test_mock_page() to use.
variable_set('update_test_xml_map', $xml_map); variable_set('update_test_xml_map', $xml_map);
...@@ -46,7 +51,7 @@ protected function refreshUpdateStatus($xml_map, $url = 'update-test') { ...@@ -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() { protected function standardTests() {
$this->assertRaw('<h3>' . t('Drupal core') . '</h3>'); $this->assertRaw('<h3>' . t('Drupal core') . '</h3>');
......
...@@ -7,11 +7,15 @@ ...@@ -7,11 +7,15 @@
namespace Drupal\update\Tests; namespace Drupal\update\Tests;
/**
* Tests project upload and extract functionality.
*/
class UpdateUploadTest extends UpdateTestBase { class UpdateUploadTest extends UpdateTestBase {
public static function getInfo() { public static function getInfo() {
return array( return array(
'name' => 'Upload and extract module functionality', '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', 'group' => 'Update',
); );
} }
...@@ -52,7 +56,7 @@ public function testUploadModule() { ...@@ -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() { function testFileNameExtensionMerging() {
$this->drupalGet('admin/modules/install'); $this->drupalGet('admin/modules/install');
...@@ -63,7 +67,7 @@ function testFileNameExtensionMerging() { ...@@ -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() { function testUpdateManagerCoreSecurityUpdateMessages() {
$setting = array( $setting = array(
......
...@@ -3,6 +3,11 @@ ...@@ -3,6 +3,11 @@
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse; use Symfony\Component\HttpFoundation\StreamedResponse;
/**
* @file
* Module for testing Update Manager functionality.
*/
/** /**
* Implements hook_system_theme_info(). * Implements hook_system_theme_info().
*/ */
...@@ -37,13 +42,13 @@ function update_test_menu() { ...@@ -37,13 +42,13 @@ function update_test_menu() {
/** /**
* Implements hook_system_info_alter(). * Implements hook_system_info_alter().
* *
* This checks the 'update_test_system_info' variable and sees if we need to * Checks the 'update_test_system_info' variable and sees if we need to alter
* alter the system info for the given $file based on the setting. The setting * the system info for the given $file based on the setting. The setting is
* is expected to be a nested associative array. If the key '#all' is defined, * expected to be a nested associative array. If the key '#all' is defined, its
* its subarray will include .info keys and values for all modules and themes * subarray will include .info keys and values for all modules and themes on the
* on the system. Otherwise, the settings array is keyed by the module or * system. Otherwise, the settings array is keyed by the module or theme short
* theme short name ($file->name) and the subarrays contain settings just for * name ($file->name) and the subarrays contain settings just for that module or
* that module or theme. * theme.
*/ */
function update_test_system_info_alter(&$info, $file) { function update_test_system_info_alter(&$info, $file) {
$setting = variable_get('update_test_system_info', array()); $setting = variable_get('update_test_system_info', array());
...@@ -59,13 +64,12 @@ function update_test_system_info_alter(&$info, $file) { ...@@ -59,13 +64,12 @@ function update_test_system_info_alter(&$info, $file) {
/** /**
* Implements hook_update_status_alter(). * Implements hook_update_status_alter().
* *
* This checks the 'update_test_update_status' variable and sees if we need to * Checks the 'update_test_update_status' variable and sees if we need to alter
* alter the update status for the given project based on the setting. The * the update status for the given project based on the setting. The setting is
* setting is expected to be a nested associative array. If the key '#all' is * expected to be a nested associative array. If the key '#all' is defined, its
* defined, its subarray will include .info keys and values for all modules * subarray will include .info keys and values for all modules and themes on the
* and themes on the system. Otherwise, the settings array is keyed by the * system. Otherwise, the settings array is keyed by the module or theme short
* module or theme short name and the subarrays contain settings just for that * name and the subarrays contain settings just for that module or theme.
* module or theme.
*/ */
function update_test_update_status_alter(&$projects) { function update_test_update_status_alter(&$projects) {
$setting = variable_get('update_test_update_status', array()); $setting = variable_get('update_test_update_status', array());
...@@ -83,18 +87,25 @@ function update_test_update_status_alter(&$projects) { ...@@ -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 * 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 * 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 * project which we're trying to test. Before attempting to fetch this data (by
* (by checking for updates on the available updates report), callers need to * checking for updates on the available updates report), callers need to define
* define the 'update_test_xml_map' variable as an array, keyed by project * the 'update_test_xml_map' variable as an array, keyed by project name,
* name, indicating which availability scenario to use for that project. * indicating which availability scenario to use for that project.
* *
* @param $project_name * @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]). * 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) { function update_test_mock_page($project_name) {
$xml_map = variable_get('update_test_xml_map', FALSE); $xml_map = variable_get('update_test_xml_map', FALSE);
...@@ -124,7 +135,7 @@ function update_test_mock_page($project_name) { ...@@ -124,7 +135,7 @@ function update_test_mock_page($project_name) {
} }
/** /**
* Implement hook_archiver_info(). * Implements hook_archiver_info().
*/ */
function update_test_archiver_info() { function update_test_archiver_info() {
return array( return array(
...@@ -156,13 +167,23 @@ function update_test_filetransfer_info() { ...@@ -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 { class UpdateTestFileTransfer {
/**
* Returns an UpdateTestFileTransfer object.
*
* @return
* A new UpdateTestFileTransfer object.
*/
public static function factory() { public static function factory() {
return new UpdateTestFileTransfer; return new UpdateTestFileTransfer;
} }
/**
* Returns a settings form with a text field to input a username.
*/
public function getSettingsForm() { public function getSettingsForm() {
$form = array(); $form = array();
$form['udpate_test_username'] = array( $form['udpate_test_username'] = array(
...@@ -174,7 +195,9 @@ public function getSettingsForm() { ...@@ -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() { function update_callback_service_unavailable() {
drupal_add_http_header('Status', '503 Service unavailable'); drupal_add_http_header('Status', '503 Service unavailable');
......
/**
* @file
* RTL styles used by the Update Manager module.
*/
.update .project { .update .project {
padding-right: .25em; padding-right: .25em;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/** /**
* @file * @file
* Hooks provided by the Update Status module. * Hooks provided by the Update Manager module.
*/ */
/** /**
...@@ -14,23 +14,22 @@ ...@@ -14,23 +14,22 @@
* Alter the list of projects before fetching data and comparing versions. * Alter the list of projects before fetching data and comparing versions.
* *
* Most modules will never need to implement this hook. It is for advanced * Most modules will never need to implement this hook. It is for advanced
* interaction with the update status module: mere mortals need not apply. * interaction with the Update Manager module. The primary use-case for this
* The primary use-case for this hook is to add projects to the list, for * hook is to add projects to the list; for example, to provide update status
* example, to provide update status data on disabled modules and themes. A * data on disabled modules and themes. A contributed module might want to hide
* contributed module might want to hide projects from the list, for example, * projects from the list; for example, if there is a site-specific module that
* if there is a site-specific module that doesn't have any official releases, * doesn't have any official releases, that module could remove itself from this
* that module could remove itself from this list to avoid "No available * list to avoid "No available releases found" warnings on the available updates
* releases found" warnings on the available updates report. In rare cases, a * report. In rare cases, a module might want to alter the data associated with
* module might want to alter the data associated with a project already in * a project already in the list.
* the list.
* *
* @param $projects * @param $projects
* Reference to an array of the projects installed on the system. This * Reference to an array of the projects installed on the system. This
* includes all the metadata documented in the comments below for each * includes all the metadata documented in the comments below for each project
* project (either module or theme) that is currently enabled. The array is * (either module or theme) that is currently enabled. The array is initially
* initially populated inside update_get_projects() with the help of * populated inside update_get_projects() with the help of
* update_process_info_list(), so look there for examples of how to * update_process_info_list(), so look there for examples of how to populate
* populate the array with real values. * the array with real values.
* *
* @see update_get_projects() * @see update_get_projects()
* @see update_process_info_list() * @see update_process_info_list()
...@@ -118,6 +117,7 @@ function hook_update_status_alter(&$projects) { ...@@ -118,6 +117,7 @@ function hook_update_status_alter(&$projects) {
* no problems, return an empty array. * no problems, return an empty array.
* *
* @see update_manager_archive_verify() * @see update_manager_archive_verify()
* @ingroup update_manager_file
*/ */
function hook_verify_update_archive($project, $archive_file, $directory) { function hook_verify_update_archive($project, $archive_file, $directory) {
$errors = array(); $errors = array();
......
...@@ -2,17 +2,21 @@ ...@@ -2,17 +2,21 @@
/** /**
* @file * @file
* Callbacks and related functions invoked by authorize.php to update projects * 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 * We use the Batch API to actually update each individual project on the site.
* level (modules are not loaded), so these functions cannot assume access to * All of the code in this file is run at a low bootstrap level (modules are not
* the rest of the update module code. * loaded), so these functions cannot assume access to the rest of the code of
* the Update Manager module.
*/ */
use Drupal\Core\Updater\UpdaterException; use Drupal\Core\Updater\UpdaterException;
/**