diff --git a/core/modules/update/tests/modules/update_test/update_test.module b/core/modules/update/tests/modules/update_test/update_test.module index ff5aad5..43df987 100644 --- a/core/modules/update/tests/modules/update_test/update_test.module +++ b/core/modules/update/tests/modules/update_test/update_test.module @@ -1,6 +1,11 @@ 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()); @@ -56,13 +61,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()); @@ -80,18 +84,20 @@ 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]). + * + * @see update_test_menu() */ function update_test_mock_page($project_name) { $xml_map = variable_get('update_test_xml_map', FALSE); @@ -115,7 +121,7 @@ function update_test_mock_page($project_name) { } /** - * Implement hook_archiver_info(). + * Implements hook_archiver_info(). */ function update_test_archiver_info() { return array( @@ -147,13 +153,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( @@ -165,7 +181,9 @@ class UpdateTestFileTransfer { } /** - * 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'); diff --git a/core/modules/update/update.api.php b/core/modules/update/update.api.php index 83b93b2..9126438 100644 --- a/core/modules/update/update.api.php +++ b/core/modules/update/update.api.php @@ -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(); diff --git a/core/modules/update/update.authorize.inc b/core/modules/update/update.authorize.inc index 48dfd35..f4e8ec8 100644 --- a/core/modules/update/update.authorize.inc +++ b/core/modules/update/update.authorize.inc @@ -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 @@ use Drupal\Core\Updater\UpdaterException; * @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) { @@ -168,11 +175,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 +242,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 +301,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 + * 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() diff --git a/core/modules/update/update.compare.inc b/core/modules/update/update.compare.inc index b729750..5c3bf48 100644 --- a/core/modules/update/update.compare.inc +++ b/core/modules/update/update.compare.inc @@ -6,7 +6,7 @@ */ /** - * Fetch an array of installed and enabled projects. + * 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 @@ -15,14 +15,39 @@ * 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 cache the results into the {cache_update} table using the - * 'update_project_projects' cache ID. However, since this is not the data - * about available updates fetched from the network, it is ok 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 cache. + * This array is fairly expensive to construct, since it involves a lot of disk + * I/O, so we cache the results into the {cache_update} table using the + * 'update_project_projects' cache ID. 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 + * cache. + * + * @return + * An associative array of currently enabled projects keyed by the + * machine-readable project short name. Each project contains: + * - name: The machine-readable project short name. + * - info: An array with values from the main .info file for this project. + * - name: The human-readable name of the project. + * - package: The package that the project is grouped under. + * - version: The version of the project. + * - project: The Drupal.org project name. + * - datestamp: The date stamp of the project's main .info file. + * - _info_file_ctime: The maximum file change time for all of the .info + * files included in this project. + * - datestamp: The date stamp when the project was released, if known. + * - includes: An associative array containing all projects included with this + * project, keyed by the machine-readable short name with the human-readable + * name as value. + * - project_type: The type of project. Allowed values are 'module' and + * 'theme'. + * - project_status: This indicates if the project is enabled and will always + * be TRUE, as the function only returns enabled projects. + * - sub_themes: If the project is a theme it contains an associative array of + * all sub-themes. + * - base_themes: If the project is a theme it contains an associative array + * of all base-themes. * * @see update_process_project_info() * @see update_calculate_project_data() @@ -53,25 +78,25 @@ function update_get_projects() { } /** - * Populate an array of project data. - * - * This iterates over a list of the installed modules or themes and groups - * them by project and status. A few parts of this function assume that - * enabled modules and themes are always processed first, and if disabled - * modules or themes are being processed (there is a setting to control if - * disabled code should be included in the Available updates report or not), - * those are only processed after $projects has been populated with - * information about the enabled code. 'Hidden' modules and themes are always - * ignored. This function also records the latest change time on the .info - * files for each module or theme, which is important data which is used when - * deciding if the cached available update data should be invalidated. + * Populates an array of project data. + * + * This iterates over a list of the installed modules or themes and groups them + * by project and status. A few parts of this function assume that enabled + * modules and themes are always processed first, and if disabled modules or + * themes are being processed (there is a setting to control if disabled code + * should be included or not in the 'Available updates' report), those are only + * processed after $projects has been populated with information about the + * enabled code. Modules and themes set as hidden are always ignored. This + * function also records the latest change time on the .info files for each + * module or theme, which is important data which is used when deciding if the + * cached available update data should be invalidated. * * @param $projects * Reference to the array of project data of what's installed on this site. * @param $list * Array of data to process to add the relevant info to the $projects array. * @param $project_type - * The kind of data in the list (can be 'module' or 'theme'). + * The kind of data in the list. Can be 'module' or 'theme'. * @param $status * Boolean that controls what status (enabled or disabled) to process out of * the $list and add to the $projects array. @@ -211,8 +236,13 @@ function _update_process_info_list(&$projects, $list, $project_type, $status) { } /** - * Given a $file object (as returned by system_get_files_database()), figure - * out what project it belongs to. + * Determines what project a given file object belongs to. + * + * @param $file + * A file object as returned by system_get_files_database(). + * + * @return + * The canonical project short name. * * @see system_get_files_database() */ @@ -228,7 +258,9 @@ function update_get_project_name($file) { } /** - * Process the list of projects on the system to figure out the currently + * Determines version and type information for currently installed projects. + * + * Processes the list of projects on the system to figure out the currently * installed versions, and other information that is required before we can * compare against the available releases to produce the status report. * @@ -277,7 +309,7 @@ function update_process_project_info(&$projects) { } /** - * Calculate the current update status of all projects on the site. + * Calculates the current update status of all projects on the site. * * The results of this function are expensive to compute, especially on sites * with lots of modules or themes, since it involves a lot of comparisons and @@ -285,13 +317,16 @@ function update_process_project_info(&$projects) { * table using the 'update_project_data' cache ID. However, since this is not * the data about available updates fetched from the network, it is ok 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 + * 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 cache. * * @param array $available * Data about available project releases. * + * @return + * An array of installed projects with current update status information. + * * @see update_get_available() * @see update_get_projects() * @see update_process_project_info() @@ -327,32 +362,30 @@ function update_calculate_project_data($available) { } /** - * Calculate the current update status of a specific project. + * Calculates the current update status of a specific project. * - * This function is the heart of the update status feature. For each project - * it is invoked with, it first checks if the project has been flagged with a + * This function is the heart of the update status feature. For each project it + * is invoked with, it first checks if the project has been flagged with a * special status like "unsupported" or "insecure", or if the project node * itself has been unpublished. In any of those cases, the project is marked * with an error and the next project is considered. * * If the project itself is valid, the function decides what major release * series to consider. The project defines what the currently supported major - * versions are for each version of core, so the first step is to make sure - * the current version is still supported. If so, that's the target version. - * If the current version is unsupported, the project maintainer's recommended - * major version is used. There's also a check to make sure that this function - * never recommends an earlier release than the currently installed major - * version. - * - * Given a target major version, it scans the available releases looking for + * versions are for each version of core, so the first step is to make sure the + * current version is still supported. If so, that's the target version. If the + * current version is unsupported, the project maintainer's recommended major + * version is used. There's also a check to make sure that this function never + * recommends an earlier release than the currently installed major version. + * + * Given a target major version, the available releases is scanned looking for * the specific release to recommend (avoiding beta releases and development - * snapshots if possible). This is complicated to describe, but an example - * will help clarify. For the target major version, find the highest patch - * level. If there is a release at that patch level with no extra ("beta", - * etc), then we recommend the release at that patch level with the most - * recent release date. If every release at that patch level has extra (only - * betas), then recommend the latest release from the previous patch - * level. For example: + * snapshots if possible). For the target major version, it finds the highest + * patch level. If there is a release at that patch level with no extra ("beta", + * etc.), then the release at that patch level with the most recent release date + * is recommended. If every release at that patch level has extra (only betas), + * then the latest release from the previous patch level is recommended. For + * example: * * 1.6-bugfix <-- recommended version because 1.6 already exists. * 1.6 @@ -363,15 +396,14 @@ function update_calculate_project_data($available) { * 1.5 <-- recommended version because no 1.6 exists. * 1.4 * - * It also looks for the latest release from the same major version, even a - * beta release, to display to the user as the "Latest version" option. - * Additionally, it finds the latest official release from any higher major - * versions that have been released to provide a set of "Also available" - * options. + * It also looks for the latest release from the same major version, even a beta + * release, to display to the user as the "Latest version" option. Additionally, + * it finds the latest official release from any higher major versions that have + * been released to provide a set of "Also available" options. * - * Finally, and most importantly, it keeps scanning the release history until - * it gets to the currently installed release, searching for anything marked - * as a security update. If any security updates have been found between the + * Finally, and most importantly, it keeps scanning the release history until it + * gets to the currently installed release, searching for anything marked as a + * security update. If any security updates have been found between the * recommended release and the installed version, all of the releases that * included a security fix are recorded so that the site administrator can be * warned their site is insecure, and links pointing to the release notes for @@ -381,9 +413,13 @@ function update_calculate_project_data($available) { * This function relies on the fact that the .xml release history data comes * sorted based on major version and patch level, then finally by release date * if there are multiple releases such as betas from the same major.patch - * version (e.g. 5.x-1.5-beta1, 5.x-1.5-beta2, and 5.x-1.5). Development + * version (e.g., 5.x-1.5-beta1, 5.x-1.5-beta2, and 5.x-1.5). Development * snapshots for a given major version are always listed last. * + * @param $project_data + * An array containing information about a specific project. + * @param $available + * Data about available project releases of a specific project. */ function update_calculate_project_update_status(&$project_data, $available) { foreach (array('title', 'link') as $attribute) { @@ -707,16 +743,16 @@ function update_calculate_project_update_status(&$project_data, $available) { } /** - * Retrieve data from {cache_update} or empty the cache when necessary. + * Retrieves data from {cache_update} or empties the cache when necessary. * * Two very expensive arrays computed by this module are the list of all - * installed modules and themes (and .info data, project associations, etc), - * and the current status of the site relative to the currently available - * releases. These two arrays are cached in the {cache_update} table and used - * whenever possible. The cache is cleared whenever the administrator visits - * the status report, available updates report, or the module or theme - * administration pages, since we should always recompute the most current - * values on any of those pages. + * installed modules and themes (and .info data, project associations, etc), and + * the current status of the site relative to the currently available releases. + * These two arrays are cached in the {cache_update} table and used whenever + * possible. The cache is cleared whenever the administrator visits the status + * report, available updates report, or the module or theme administration + * pages, since we should always recompute the most current values on any of + * those pages. * * Note: while both of these arrays are expensive to compute (in terms of disk * I/O and some fairly heavy CPU processing), neither of these is the actual @@ -726,13 +762,13 @@ function update_calculate_project_update_status(&$project_data, $available) { * hour and never get invalidated just by visiting a page on the site. * * @param $cid - * The cache id of data to return from the cache. Valid options are + * The cache ID of data to return from the cache. Valid options are * 'update_project_data' and 'update_project_projects'. * * @return * The cached value of the $projects array generated by - * update_calculate_project_data() or update_get_projects(), or an empty - * array when the cache is cleared. + * update_calculate_project_data() or update_get_projects(), or an empty array + * when the cache is cleared. */ function update_project_cache($cid) { $projects = array(); @@ -764,13 +800,13 @@ function update_project_cache($cid) { } /** - * Filter the project .info data to only save attributes we need. + * Filters the project .info data to only save attributes we need. * * @param array $info * Array of .info file data as returned by drupal_parse_info_file(). * * @return - * Array of .info file data we need for the Update manager. + * Array of .info file data we need for the update manager. * * @see _update_process_info_list() */ diff --git a/core/modules/update/update.fetch.inc b/core/modules/update/update.fetch.inc index 8588832..511423e 100644 --- a/core/modules/update/update.fetch.inc +++ b/core/modules/update/update.fetch.inc @@ -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. */ function _update_fetch_data() { $queue = queue('update_fetch_tasks'); @@ -108,13 +115,14 @@ function _update_fetch_data() { } /** - * Process a task to fetch available update data for a single project. + * Processes a task to fetch available update data for a single project. * - * Once the release history XML data is downloaded, it is parsed and saved - * into the {cache_update} table in an entry just for that project. + * Once the release history XML data is downloaded, it is parsed and saved into + * the {cache_update} table in an entry just for that project. * * @param $project * Associative array of information about the project to fetch data for. + * * @return * TRUE if we fetched parsable XML, otherwise FALSE. */ @@ -184,7 +192,7 @@ function _update_process_fetch_task($project) { } /** - * Clear out all the cached available update data and initiate re-fetching. + * Clears out all the cached available update data and initiates re-fetching. */ function _update_refresh() { module_load_include('inc', 'update', 'update.compare'); @@ -211,7 +219,7 @@ function _update_refresh() { } /** - * Add a task to the queue for fetching release history data for a project. + * Adds a task to the queue for fetching release history data for a project. * * We only create a new fetch task if there's no task already in the queue for * this particular project (based on 'fetch_task::' entries in the @@ -219,8 +227,8 @@ function _update_refresh() { * * @param $project * Associative array of information about a project as created by - * update_get_projects(), including keys such as 'name' (short name), - * and the 'info' array with data from a .info file for the project. + * update_get_projects(), including keys such as 'name' (short name), and the + * 'info' array with data from a .info file for the project. * * @see update_get_projects() * @see update_get_available() @@ -250,14 +258,17 @@ function _update_create_fetch_task($project) { /** * Generates the URL to fetch information about project updates. * - * This figures out the right URL to use, based on the project's .info file - * and the global defaults. Appends optional query arguments when the site is + * This figures out the right URL to use, based on the project's .info file and + * the global defaults. Appends optional query arguments when the site is * configured to report usage stats. * * @param $project * The array of project information from update_get_projects(). * @param $site_key - * The anonymous site key hash (optional). + * (optional) The anonymous site key hash. Defaults to an empty string. + * + * @return + * The URL for fetching information about updates to the specified project. * * @see update_fetch_data() * @see _update_process_fetch_task() @@ -283,10 +294,11 @@ function _update_build_fetch_url($project, $site_key = '') { } /** - * Return the base of the URL to fetch available update data for a project. + * Returns the base of the URL to fetch available update data for a project. * * @param $project * The array of project information from update_get_projects(). + * * @return * The base of the URL used for fetching available update data. This does * not include the path elements to specify a particular project, version, @@ -299,10 +311,10 @@ function _update_get_fetch_url_base($project) { } /** - * Perform any notifications that should be done once cron fetches new data. + * Performs any notifications that should be done once cron fetches new data. * - * This method checks the status of the site using the new data and depending - * on the configuration of the site, notifies administrators via email if there + * This method checks the status of the site using the new data and, depending + * on the configuration of the site, notifies administrators via e-mail if there * are new releases or missing security updates. * * @see update_requirements() @@ -337,7 +349,7 @@ function _update_cron_notify() { } /** - * Parse the XML of the Drupal release history info files. + * Parses the XML of the Drupal release history info files. * * @param $raw_xml * A raw XML string of available release data for a given project. diff --git a/core/modules/update/update.install b/core/modules/update/update.install index 9ff39d1..406b9ae 100644 --- a/core/modules/update/update.install +++ b/core/modules/update/update.install @@ -2,26 +2,25 @@ /** * @file - * Install, update and uninstall functions for the update module. + * Install, update, and uninstall functions for the Update Manager module. */ /** * Implements hook_requirements(). * * @return - * An array describing the status of the site regarding available updates. - * If there is no update data, only one record will be returned, indicating - * that the status of core can't be determined. If data is available, there - * will be two records: one for core, and another for all of contrib - * (assuming there are any contributed modules or themes enabled on the - * site). In addition to the fields expected by hook_requirements ('value', - * 'severity', and optionally 'description'), this array will contain a - * 'reason' attribute, which is an integer constant to indicate why the - * given status is being returned (UPDATE_NOT_SECURE, UPDATE_NOT_CURRENT, or - * UPDATE_UNKNOWN). This is used for generating the appropriate e-mail - * notification messages during update_cron(), and might be useful for other - * modules that invoke update_requirements() to find out if the site is up - * to date or not. + * An array describing the status of the site regarding available updates. If + * there is no update data, only one record will be returned, indicating that + * the status of core can't be determined. If data is available, there will be + * two records: one for core, and another for all of contrib (assuming there + * are any contributed modules or themes enabled on the site). In addition to + * the fields expected by hook_requirements ('value', 'severity', and + * optionally 'description'), this array will contain a 'reason' attribute, + * which is an integer constant to indicate why the given status is being + * returned (UPDATE_NOT_SECURE, UPDATE_NOT_CURRENT, or UPDATE_UNKNOWN). This + * is used for generating the appropriate e-mail notification messages during + * update_cron(), and might be useful for other modules that invoke + * update_requirements() to find out if the site is up to date or not. * * @see _update_message_text() * @see _update_cron_notify() @@ -96,19 +95,19 @@ function update_uninstall() { } /** - * Private helper method to fill in the requirements array. + * Fills in the requirements array. * * This is shared for both core and contrib to generate the right elements in * the array for hook_requirements(). * * @param $project - * Array of information about the project we're testing as returned by - * update_calculate_project_data(). + * Array of information about the project we're testing as returned by + * update_calculate_project_data(). * @param $type - * What kind of project is this ('core' or 'contrib'). + * What kind of project this is ('core' or 'contrib'). * * @return - * An array to be included in the nested $requirements array. + * An array to be included in the nested $requirements array. * * @see hook_requirements() * @see update_requirements() diff --git a/core/modules/update/update.manager.inc b/core/modules/update/update.manager.inc index f7881d4..3c84331 100644 --- a/core/modules/update/update.manager.inc +++ b/core/modules/update/update.manager.inc @@ -3,6 +3,7 @@ /** * @file * Administrative screens and processing functions for the update manager. + * * This allows site administrators with the 'administer software updates' * permission to either upgrade existing projects, or download and install new * ones, so long as the killswitch setting ('allow_authorize_operations') is @@ -11,28 +12,28 @@ * To install new code, the administrator is prompted for either the URL of an * archive file, or to directly upload the archive file. The archive is loaded * into a temporary location, extracted, and verified. If everything is - * successful, the user is redirected to authorize.php to type in their file - * transfer credentials and authorize the installation to proceed with - * elevated privileges, such that the extracted files can be copied out of the - * temporary location and into the live web root. + * successful, the user is redirected to authorize.php to type in file transfer + * credentials and authorize the installation to proceed with elevated + * privileges, such that the extracted files can be copied out of the temporary + * location and into the live web root. * * Updating existing code is a more elaborate process. The first step is a - * selection form where the user is presented with a table of installed - * projects that are missing newer releases. The user selects which projects - * they wish to upgrade, and presses the "Download updates" button to - * continue. This sets up a batch to fetch all the selected releases, and - * redirects to admin/update/download to display the batch progress bar as it - * runs. Each batch operation is responsible for downloading a single file, - * extracting the archive, and verifying the contents. If there are any - * errors, the user is redirected back to the first page with the error - * messages. If all downloads were extacted and verified, the user is instead - * redirected to admin/update/ready, a landing page which reminds them to - * backup their database and asks if they want to put the site offline during - * the upgrade. Once the user presses the "Install updates" button, they are - * redirected to authorize.php to supply their web root file access - * credentials. The authorized operation (which lives in update.authorize.inc) - * sets up a batch to copy each extracted update from the temporary location - * into the live web root. + * selection form where the user is presented with a table of installed projects + * that are missing newer releases. The user selects which projects they wish to + * update, and presses the "Download updates" button to continue. This sets up a + * batch to fetch all the selected releases, and redirects to + * admin/update/download to display the batch progress bar as it runs. Each + * batch operation is responsible for downloading a single file, extracting the + * archive, and verifying the contents. If there are any errors, the user is + * redirected back to the first page with the error messages. If all downloads + * were extacted and verified, the user is instead redirected to + * admin/update/ready, a landing page which reminds them to backup their + * database and asks if they want to put the site offline during the update. + * Once the user presses the "Install updates" button, they are redirected to + * authorize.php to supply their web root file access credentials. The + * authorized operation (which lives in update.authorize.inc) sets up a batch to + * copy each extracted update from the temporary location into the live web + * root. */ use Drupal\Core\Updater\Updater; @@ -47,18 +48,19 @@ use Drupal\Core\FileTransfer\Local; */ /** - * Build the form for the update manager page to update existing projects. + * Form constructor for the Update Manager update form. * * This presents a table with all projects that have available updates with * checkboxes to select which ones to upgrade. * - * @param $form - * @param $form_state * @param $context - * String representing the context from which we're trying to update, can be: - * 'module', 'theme' or 'report'. - * @return - * The form array for selecting which projects to update. + * String representing the context from which we're trying to update. + * Allowed values are 'module', 'theme', and 'report'. + * + * @see update_manager_update_form_validate() + * @see update_manager_update_form_submit() + * @see update_menu() + * @ingroup forms */ function update_manager_update_form($form, $form_state = array(), $context) { if (!_update_manager_check_backends($form, 'update')) { @@ -266,7 +268,7 @@ function update_manager_update_form($form, $form_state = array(), $context) { } /** - * Returns HTML for the first page in the update manager wizard to select projects. + * Returns HTML for the first page in the process of updating projects. * * @param $variables * An associative array containing: @@ -283,7 +285,11 @@ function theme_update_manager_update_form($variables) { } /** - * Validation callback to ensure that at least one project is selected. + * Form validation handler for update_manager_update_form(). + * + * Ensures that at least one project is selected. + * + * @see update_manager_update_form_submit() */ function update_manager_update_form_validate($form, &$form_state) { if (!empty($form_state['values']['projects'])) { @@ -298,11 +304,11 @@ function update_manager_update_form_validate($form, &$form_state) { } /** - * Submit function for the main update form. + * Form submission handler for update_manager_update_form(). * - * This sets up a batch to download, extract and verify the selected releases + * Sets up a batch that downloads, extracts, and verifies the selected releases. * - * @see update_manager_update_form() + * @see update_manager_update_form_validate() */ function update_manager_update_form_submit($form, &$form_state) { $projects = array(); @@ -332,7 +338,12 @@ function update_manager_update_form_submit($form, &$form_state) { } /** - * Batch callback invoked when the download batch is completed. + * Batch callback: Performs actions when the download batch is completed. + * + * @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_manager_download_batch_finished($success, $results) { if (!empty($results['errors'])) { @@ -355,15 +366,21 @@ function update_manager_download_batch_finished($success, $results) { } /** + * Form constructor for the update ready form. + * * Build the form when the site is ready to update (after downloading). * * This form is an intermediary step in the automated update workflow. It is - * presented to the site administrator after all the required updates have - * been downloaded and verified. The point of this page is to encourage the - * user to backup their site, gives them the opportunity to put the site - * offline, and then asks them to confirm that the update should continue. - * After this step, the user is redirected to authorize.php to enter their - * file transfer credentials and attempt to complete the update. + * presented to the site administrator after all the required updates have been + * downloaded and verified. The point of this page is to encourage the user to + * backup their site, gives them the opportunity to put the site offline, and + * then asks them to confirm that the update should continue. After this step, + * the user is redirected to authorize.php to enter their file transfer + * credentials and attempt to complete the update. + * + * @see update_manager_update_ready_form_submit() + * @see update_menu() + * @ingroup forms */ function update_manager_update_ready_form($form, &$form_state) { if (!_update_manager_check_backends($form, 'update')) { @@ -392,14 +409,13 @@ function update_manager_update_ready_form($form, &$form_state) { } /** - * Submit handler for the form to confirm that an update should continue. + * Form submission handler for update_manager_update_ready_form(). * * If the site administrator requested that the site is put offline during the - * update, do so now. Otherwise, pull information about all the required - * updates out of the SESSION, figure out what Drupal\Core\Updater\Updater class - * is needed for each one, generate an array of update operations to perform, - * and hand it all off to system_authorized_init(), then redirect to - * authorize.php. + * update, do so now. Otherwise, pull information about all the required updates + * out of the SESSION, figure out what Drupal\Core\Updater\Updater class is + * needed for each one, generate an array of update operations to perform, and + * hand it all off to system_authorized_init(), then redirect to authorize.php. * * @see update_authorize_run_update() * @see system_authorized_init() @@ -466,18 +482,19 @@ function update_manager_update_ready_form_submit($form, &$form_state) { */ /** - * Build the form for the update manager page to install new projects. + * Form constructor for the Update Manager install form. * * This presents a place to enter a URL or upload an archive file to use to * install a new module or theme. * - * @param $form - * @param $form_state * @param $context - * String representing the context from which we're trying to install, can - * be: 'module', 'theme' or 'report'. - * @return - * The form array for selecting which project to install. + * String representing the context from which we're trying to install. + * Allowed values are 'module', 'theme', and 'report'. + * + * @see update_manager_install_form_validate() + * @see update_manager_install_form_submit() + * @see update_menu() + * @ingroup forms */ function update_manager_install_form($form, &$form_state, $context) { if (!_update_manager_check_backends($form, 'install')) { @@ -528,11 +545,11 @@ function update_manager_install_form($form, &$form_state, $context) { * @param array $form * Reference to the form array we're building. * @param string $operation - * The Update manager operation we're in the middle of. Can be either - * 'update' or 'install'. Use to provide operation-specific interface text. + * The update manager operation we're in the middle of. Can be either 'update' + * or 'install'. Use to provide operation-specific interface text. * * @return - * TRUE if the Update manager should continue to the next step in the + * TRUE if the update manager should continue to the next step in the * workflow, or FALSE if we've hit a fatal configuration and must halt the * workflow. */ @@ -590,7 +607,9 @@ function _update_manager_check_backends(&$form, $operation) { } /** - * Validate the form for installing a new project via the update manager. + * Form validation handler for update_manager_install_form(). + * + * @see update_manager_install_form_submit() */ function update_manager_install_form_validate($form, &$form_state) { if (!($form_state['values']['project_url'] XOR !empty($_FILES['files']['name']['project_upload']))) { @@ -599,7 +618,7 @@ function update_manager_install_form_validate($form, &$form_state) { } /** - * Handle form submission when installing new projects via the update manager. + * Form submission handler for update_manager_install_form(). * * Either downloads the file specified in the URL to a temporary cache, or * uploads the file attached to the form, then attempts to extract the archive @@ -609,6 +628,7 @@ function update_manager_install_form_validate($form, &$form_state) { * operation to run via authorize.php which will copy the extracted files from * the temporary location into the live site. * + * @see update_manager_install_form_validate() * @see update_authorize_run_install() * @see system_authorized_init() * @see system_authorized_get_url() @@ -730,21 +750,21 @@ function update_manager_install_form_submit($form, &$form_state) { * @{ * Update manager file management functions. * - * These functions are used by the update manager to copy, extract - * and verify archive files. + * These functions are used by the update manager to copy, extract, and verify + * archive files. */ /** - * Unpack a downloaded archive file. + * Unpacks a downloaded archive file. * - * @param string $project - * The short name of the project to download. * @param string $file * The filename of the archive you wish to extract. * @param string $directory * The directory you wish to extract the archive into. + * * @return Archiver * The Archiver object used to extract the archive. + * * @throws Exception on failure. */ function update_manager_archive_extract($file, $directory) { @@ -773,7 +793,7 @@ function update_manager_archive_extract($file, $directory) { } /** - * Verify an archive after it has been downloaded and extracted. + * Verifies an archive after it has been downloaded and extracted. * * This function is responsible for invoking hook_verify_update_archive(). * @@ -785,8 +805,8 @@ function update_manager_archive_extract($file, $directory) { * The directory that the archive was extracted into. * * @return array - * An array of error messages to display if the archive was invalid. If - * there are no errors, it will be an empty array. + * An array of error messages to display if the archive was invalid. If there + * are no errors, it will be an empty array. * */ function update_manager_archive_verify($project, $archive_file, $directory) { @@ -796,7 +816,7 @@ function update_manager_archive_verify($project, $archive_file, $directory) { /** * Copies a file from $url to the temporary directory for updates. * - * If the file has already been downloaded, returns the the local path. + * Returns the local path if the file has already been downloaded. * * @param $url * The URL of the file on the server. @@ -825,18 +845,18 @@ function update_manager_file_get($url) { } /** - * Batch operation: download, unpack, and verify a project. + * Batch callback: Downloads, unpacks, and verifies a project. * - * This function assumes that the provided URL points to a file archive of - * some sort. The URL can have any scheme that we have a file stream wrapper - * to support. The file is downloaded to a local cache. + * This function assumes that the provided URL points to a file archive of some + * sort. The URL can have any scheme that we have a file stream wrapper to + * support. The file is downloaded to a local cache. * * @param string $project * The short name of the project to download. * @param string $url * The URL to download a specific project release archive file. * @param array $context - * Reference to an array used for BatchAPI storage. + * Reference to an array used for Batch API storage. * * @see update_manager_download_page() */ @@ -885,8 +905,8 @@ function update_manager_batch_project_get($project, $url, &$context) { * Determines if file transfers will be performed locally. * * If the server is configured such that webserver-created files have the same - * owner as the configuration directory (e.g. sites/default) where new code - * will eventually be installed, the Update manager can transfer files entirely + * owner as the configuration directory (e.g., sites/default) where new code + * will eventually be installed, the update manager can transfer files entirely * locally, without changing their ownership (in other words, without prompting * the user for FTP, SSH or other credentials). * diff --git a/core/modules/update/update.module b/core/modules/update/update.module index ea9aec2..f09adbe 100644 --- a/core/modules/update/update.module +++ b/core/modules/update/update.module @@ -2,10 +2,13 @@ /** * @file - * The "Update status" module checks for available updates of Drupal core and - * any installed contributed modules and themes. It warns site administrators - * if newer releases are available via the system status report - * (admin/reports/status), the module and theme pages, and optionally via email. + * Handles updates of Drupal core and contributed projects. + * + * The module checks for available updates of Drupal core and any installed + * contributed modules and themes. It warns site administrators if newer + * releases are available via the system status report (admin/reports/status), + * the module and theme pages, and optionally via e-mail. It also provides the + * ability to install contributed modules and themes via an user interface. */ /** @@ -246,11 +249,14 @@ function update_menu() { } /** - * Determine if the current user can access the updater menu items. + * Access callback: Determines if current user can access updater menu items. + * + * It both enforces the 'administer software updates' permission and the global + * kill switch for the authorize.php script. * - * This is used as a menu system access callback. It both enforces the - * 'administer software updates' permission and the global killswitch for the - * authorize.php script. + * @return + * TRUE if the current user can access the updater menu items; FALSE + * otherwise. * * @see update_menu() */ @@ -327,10 +333,10 @@ function update_themes_disabled($themes) { } /** - * Implements hook_form_FORM_ID_alter(). + * Implements hook_form_FORM_ID_alter() for system_modules(). * - * Adds a submit handler to the system modules form, so that if a site admin - * saves the form, we invalidate the cache of available updates. + * Adds a form submission handler to the system modules form, so that if a site + * admin saves the form, we invalidate the cache of available updates. * * @see _update_cache_clear() */ @@ -339,7 +345,9 @@ function update_form_system_modules_alter(&$form, $form_state) { } /** - * Helper function for use as a form submit callback. + * Form submission handler for system_modules(). + * + * @see update_form_system_modules_alter() */ function update_cache_clear_submit($form, &$form_state) { // Clear all update module caches. @@ -358,20 +366,22 @@ function _update_no_data() { } /** - * Internal helper to try to get the update information from the cache - * if possible, and to refresh the cache when necessary. + * Tries to get update information from cache and refreshes it when necessary. * * In addition to checking the cache lifetime, this function also ensures that * there are no .info 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 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. + * data. If any .info 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. * * @param $refresh - * Boolean to indicate if this method should refresh the cache automatically - * if there's no data. + * (optional) Boolean to indicate if this method should refresh the cache + * automatically if there's no data. Defaults to FALSE. + * + * @return + * Array of data about available releases, keyed by project shortname. * * @see update_refresh() * @see update_get_projects() @@ -428,7 +438,11 @@ function update_get_available($refresh = FALSE) { } /** - * Wrapper to load the include file and then create a new fetch task. + * Creates a new fetch task after loading the necessary include file. + * + * @param $project + * Associative array of information about a project. See update_get_projects() + * for the keys used. * * @see _update_create_fetch_task() */ @@ -438,7 +452,7 @@ function update_create_fetch_task($project) { } /** - * Wrapper to load the include file and then refresh the release data. + * Refreshes the release data after loading the necessary include file. * * @see _update_refresh() */ @@ -448,7 +462,9 @@ function update_refresh() { } /** - * Wrapper to load the include file and then attempt to fetch update data. + * Attempts to fetch update data after loading the necessary include file. + * + * @see _update_fetch_data() */ function update_fetch_data() { module_load_include('inc', 'update', 'update.fetch'); @@ -456,7 +472,7 @@ function update_fetch_data() { } /** - * Return all currently cached data about available releases for all projects. + * Returns all currently cached data about available releases for all projects. * * @return * Array of data about available releases, keyed by project shortname. @@ -481,17 +497,17 @@ function _update_get_cached_available_releases() { /** * Implements hook_mail(). * - * Constructs the email notification message when the site is out of date. + * Constructs the e-mail notification message when the site is out of date. * * @param $key * Unique key to indicate what message to build, always 'status_notify'. * @param $message * Reference to the message array being built. * @param $params - * Array of parameters to indicate what kind of text to include in the - * message body. This is a keyed array of message type ('core' or 'contrib') - * as the keys, and the status reason constant (UPDATE_NOT_SECURE, etc) for - * the values. + * Array of parameters to indicate what kind of text to include in the message + * body. This is a keyed array of message type ('core' or 'contrib') as the + * keys, and the status reason constant (UPDATE_NOT_SECURE, etc) for the + * values. * * @see drupal_mail() * @see _update_cron_notify() @@ -518,22 +534,23 @@ function update_mail($key, &$message, $params) { } /** - * Helper function to return the appropriate message text when the site is out - * of date or missing a security update. + * Returns the appropriate message text when site is out of date or not secure. * * These error messages are shared by both update_requirements() for the * site-wide status report at admin/reports/status and in the body of the - * notification emails generated by update_cron(). + * notification e-mail messages generated by update_cron(). * * @param $msg_type - * String to indicate what kind of message to generate. Can be either - * 'core' or 'contrib'. + * String to indicate what kind of message to generate. Can be either 'core' + * or 'contrib'. * @param $msg_reason * Integer constant specifying why message is generated. * @param $report_link - * Boolean that controls if a link to the updates report should be added. + * (optional) Boolean that controls if a link to the updates report should be + * added. Defaults to FALSE. * @param $language - * An optional language object to use. + * (optional) A language object to use. Defaults to NULL. + * * @return * The properly translated error message for the given key. */ @@ -603,10 +620,9 @@ function _update_message_text($msg_type, $msg_reason, $report_link = FALSE, $lan } /** - * Private sort function to order projects based on their status. + * Orders projects based on their status. * - * @see update_requirements() - * @see uasort() + * Callback for uasort() within update_requirements(). */ function _update_project_status_sort($a, $b) { // The status constants are numerically in the right order, so we can @@ -621,17 +637,16 @@ function _update_project_status_sort($a, $b) { /** * Returns HTML for the last time we checked for update data. * - * In addition to properly formating the given timestamp, this function also + * In addition to properly formatting the given timestamp, this function also * provides a "Check manually" link that refreshes the available update and * redirects back to the same page. * * @param $variables * An associative array containing: - * - 'last': The timestamp when the site last checked for available updates. + * - last: The timestamp when the site last checked for available updates. * * @see theme_update_report() * @see theme_update_available_updates_form() - * * @ingroup themeable */ function theme_update_last_check($variables) { @@ -647,7 +662,7 @@ function theme_update_last_check($variables) { * Implements hook_verify_update_archive(). * * First, we ensure that the archive isn't a copy of Drupal core, which the - * Update manager does not yet support. @see http://drupal.org/node/606592 + * update manager does not yet support. See http://drupal.org/node/606592 * * Then, we make sure that at least one module included in the archive file has * an .info file which claims that the code is compatible with the current @@ -719,19 +734,19 @@ function update_verify_update_archive($project, $archive_file, $directory) { * cleared when we're populating it after successfully fetching new available * update data. Usage of the core cache API results in all sorts of potential * problems that would result in attempting to fetch available update data all - * the time, including if a site has a "minimum cache lifetime" (which is both - * a minimum and a maximum) defined, or if a site uses memcache or another - * plug-able cache system that assumes volatile caches. + * the time, including if a site has a "minimum cache lifetime" (which is both a + * minimum and a maximum) defined, or if a site uses memcache or another + * pluggable cache system that assumes volatile caches. * - * Update module still uses the {cache_update} table, but instead of using - * the cache API, there are private helper functions that implement these same - * basic tasks but ensure that the cache is not prematurely cleared, and that - * the data is always stored in the database, even if memcache or another cache - * backend is in use. + * The Update Manager module still uses the {cache_update} table, but instead of + * using the cache API, there are private helper functions that implement these + * same basic tasks but ensure that the cache is not prematurely cleared, and + * that the data is always stored in the database, even if memcache or another + * cache backend is in use. */ /** - * Store data in the private update status cache table. + * Stores data in the private update status cache table. * * @param $cid * The cache ID to save the data with. @@ -743,6 +758,8 @@ function update_verify_update_archive($project, $archive_file, $directory) { * by explicitly using _update_cache_clear(). * - A Unix timestamp: Indicates that the item should be kept at least until * the given time, after which it will be invalidated. + * + * @see _update_cache_get() */ function _update_cache_set($cid, $data, $expire) { $fields = array( @@ -764,12 +781,15 @@ function _update_cache_set($cid, $data, $expire) { } /** - * Retrieve data from the private update status cache table. + * Retrieves data from the private update status cache table. * * @param $cid * The cache ID to retrieve. + * * @return - * The data for the given cache ID, or NULL if the ID was not found. + * An array of data for the given cache ID, or NULL if the ID was not found. + * + * @see _update_cache_set() */ function _update_cache_get($cid) { $cache = db_query("SELECT data, created, expire, serialized FROM {cache_update} WHERE cid = :cid", array(':cid' => $cid))->fetchObject(); @@ -782,7 +802,10 @@ function _update_cache_get($cid) { } /** - * Return an array of cache items with a given cache ID prefix. + * Returns an array of cache items with a given cache ID prefix. + * + * @param string $cid_prefix + * The cache ID prefix. * * @return * Associative array of cache items, keyed by cache ID. @@ -808,11 +831,12 @@ function _update_get_cache_multiple($cid_prefix) { * Invalidates cached data relating to update status. * * @param $cid - * Optional cache ID of the record to clear from the private update module - * cache. If empty, all records will be cleared from the table. + * (optional) Cache ID of the record to clear from the private update module + * cache. If empty, all records will be cleared from the table. Defaults to + * NULL. * @param $wildcard - * If $wildcard is TRUE, cache IDs starting with $cid are deleted in - * addition to the exact cache ID specified by $cid. + * (optional) If TRUE, cache IDs starting with $cid are deleted in addition to + * the exact cache ID specified by $cid. Defaults to FALSE. */ function _update_cache_clear($cid = NULL, $wildcard = FALSE) { if (empty($cid)) { @@ -833,18 +857,18 @@ function _update_cache_clear($cid = NULL, $wildcard = FALSE) { /** * Implements hook_flush_caches(). * - * Called from update.php (among others) to flush the caches. - * Since we're running update.php, we are likely to install a new version of - * something, in which case, we want to check for available update data again. - * However, because we have our own caching system, we need to directly clear - * the database table ourselves at this point and return nothing, for example, - * on sites that use memcache where cache_clear_all() won't know how to purge - * this data. + * Called from update.php (among others) to flush the caches. Since we're + * running update.php, we are likely to install a new version of something, in + * which case, we want to check for available update data again. However, + * because we have our own caching system, we need to directly clear the + * database table ourselves at this point and return nothing, for example, on + * sites that use memcache where cache_clear_all() won't know how to purge this + * data. * - * However, we only want to do this from update.php, since otherwise, we'd - * lose all the available update data on every cron run. So, we specifically - * check if the site is in MAINTENANCE_MODE == 'update' (which indicates - * update.php is running, not update module... alas for overloaded names). + * However, we only want to do this from update.php, since otherwise, we'd lose + * all the available update data on every cron run. So, we specifically check if + * the site is in MAINTENANCE_MODE == 'update' (which indicates update.php is + * running, not update module... alas for overloaded names). */ function update_flush_caches() { if (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'update') { @@ -858,7 +882,7 @@ function update_flush_caches() { */ /** - * Return a short unique identifier for this Drupal installation. + * Returns a short unique identifier for this Drupal installation. * * @return * An eight character string uniquely identifying this Drupal installation. @@ -872,14 +896,15 @@ function _update_manager_unique_identifier() { } /** - * Return the directory where update archive files should be extracted. + * Returns the directory where update archive files should be extracted. * * @param $create - * If TRUE, attempt to create the directory if it does not already exist. + * (optional) Whether to attempt to create the directory if it does not + * already exist. Defaults to TRUE. * * @return - * The full path to the temporary directory where update file archives - * should be extracted. + * The full path to the temporary directory where update file archives should + * be extracted. */ function _update_manager_extract_directory($create = TRUE) { $directory = &drupal_static(__FUNCTION__, ''); @@ -893,14 +918,15 @@ function _update_manager_extract_directory($create = TRUE) { } /** - * Return the directory where update archive files should be cached. + * Returns the directory where update archive files should be cached. * * @param $create - * If TRUE, attempt to create the directory if it does not already exist. + * (optional) Whether to attempt to create the directory if it does not + * already exist. Defaults to TRUE. * * @return - * The full path to the temporary directory where update file archives - * should be cached. + * The full path to the temporary directory where update file archives should + * be cached. */ function _update_manager_cache_directory($create = TRUE) { $directory = &drupal_static(__FUNCTION__, ''); @@ -914,7 +940,7 @@ function _update_manager_cache_directory($create = TRUE) { } /** - * Clear the temporary files and directories based on file age from disk. + * Clears the temporary files and directories based on file age from disk. */ function update_clear_update_disk_cache() { // List of update module cache directories. Do not create the directories if @@ -931,19 +957,19 @@ function update_clear_update_disk_cache() { } /** - * Delete stale files and directories from the Update manager disk cache. + * Deletes stale files and directories from the update manager disk cache. * - * Files and directories older than 6 hours and development snapshots older - * than 5 minutes are considered stale. We only cache development snapshots - * for 5 minutes since otherwise updated snapshots might not be downloaded as + * Files and directories older than 6 hours and development snapshots older than + * 5 minutes are considered stale. We only cache development snapshots for 5 + * minutes since otherwise updated snapshots might not be downloaded as * expected. * * When checking file ages, we need to use the ctime, not the mtime - * (modification time) since many (all?) tar implementations go out of their - * way to set the mtime on the files they create 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 archive file - * was unpacked. + * (modification time) since many (all?) tar implementations go out of their way + * to set the mtime on the files they create 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 archive file was + * unpacked. * * @param $path * A string containing a file path or (streamwrapper) URI. diff --git a/core/modules/update/update.report.inc b/core/modules/update/update.report.inc index 7703503..0e0cd36 100644 --- a/core/modules/update/update.report.inc +++ b/core/modules/update/update.report.inc @@ -6,7 +6,9 @@ */ /** - * Menu callback. Generate a page about the update status of projects. + * Page callback: Generates a page about the update status of projects. + * + * @see update_menu() */ function update_status() { if ($available = update_get_available(TRUE)) { @@ -257,6 +259,7 @@ function theme_update_report($variables) { * - status: The integer code for a project's current update status. * * @see update_calculate_project_data() + * @ingroup themeable */ function theme_update_status_label($variables) { switch ($variables['status']) { diff --git a/core/modules/update/update.settings.inc b/core/modules/update/update.settings.inc index 60ac3ca..5cd2414 100644 --- a/core/modules/update/update.settings.inc +++ b/core/modules/update/update.settings.inc @@ -6,7 +6,11 @@ */ /** - * Form builder for the update settings tab. + * Form constructor for the update settings form. + * + * @see update_settings_validate() + * @see update_settings_submit() + * @ingroup forms */ function update_settings($form) { $form['update_check_frequency'] = array( @@ -57,9 +61,11 @@ function update_settings($form) { } /** - * Validation callback for the settings form. + * Form validation handler for update_settings(). + * + * Validates the e-mail addresses and ensures the field is formatted correctly. * - * Validates the email addresses and ensures the field is formatted correctly. + * @see update_settings_submit() */ function update_settings_validate($form, &$form_state) { if (!empty($form_state['values']['update_notify_emails'])) { @@ -89,13 +95,15 @@ function update_settings_validate($form, &$form_state) { } /** - * Submit handler for the settings tab. + * Form submission handler for update_settings(). + * + * Also invalidates the cache of available updates if the "Check for updates of + * disabled modules and themes" setting is being changed. The available updates + * report needs to refetch available update data after this setting changes or + * it would show misleading things (e.g., listing the disabled projects on the + * site with the "No available releases found" warning). * - * Also invalidates the cache of available updates if the "Check for updates - * of disabled modules and themes" setting is being changed. The available - * updates report need to refetch available update data after this setting - * changes or it would show misleading things (e.g. listing the disabled - * projects on the site with the "No available releases found" warning). + * @see update_settings_validate() */ function update_settings_submit($form, $form_state) { $op = $form_state['values']['op']; diff --git a/core/modules/update/update.test b/core/modules/update/update.test index f91e41a..0272507 100644 --- a/core/modules/update/update.test +++ b/core/modules/update/update.test @@ -2,33 +2,37 @@ /** * @file - * Tests for update.module. + * Tests for the Update Manager module. * - * 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 + * This file contains tests for the Update Manager 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) against + * 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 * initial state and availability scenario. */ /** - * Base class to define some shared functions used by all update tests. + * Defines some shared functions used by all update tests. */ class UpdateTestHelper extends DrupalWebTestCase { + /** - * 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() */ @@ -42,7 +46,7 @@ class UpdateTestHelper extends DrupalWebTestCase { } /** - * 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('

' . t('Drupal core') . '

'); @@ -52,6 +56,9 @@ class UpdateTestHelper extends DrupalWebTestCase { } +/** + * Tests behavior related to discovering and listing updates to Drupal core. + */ class UpdateCoreTestCase extends UpdateTestHelper { public static function getInfo() { @@ -111,7 +118,7 @@ class UpdateCoreTestCase extends UpdateTestHelper { } /** - * 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( @@ -134,7 +141,7 @@ class UpdateCoreTestCase extends UpdateTestHelper { } /** - * 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(); @@ -147,7 +154,7 @@ class UpdateCoreTestCase extends UpdateTestHelper { } /** - * 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(); @@ -164,7 +171,7 @@ class UpdateCoreTestCase extends UpdateTestHelper { } /** - * 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(); @@ -181,7 +188,7 @@ class UpdateCoreTestCase extends UpdateTestHelper { } /** - * 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(); @@ -216,7 +223,7 @@ class UpdateCoreTestCase extends UpdateTestHelper { } /** - * 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'); @@ -225,6 +232,9 @@ class UpdateCoreTestCase extends UpdateTestHelper { $this->assertUniqueText(t('Failed to get available update data for one project.')); } + /** + * Sets the version to 7.0 when no project-specific mapping is defined. + */ protected function setSystemInfo7_0() { $setting = array( '#all' => array( @@ -236,6 +246,9 @@ class UpdateCoreTestCase extends UpdateTestHelper { } +/** + * Tests behavior related to handling updates to contributed modules and themes. + */ class UpdateTestContribCase extends UpdateTestHelper { public static function getInfo() { @@ -281,7 +294,7 @@ class UpdateTestContribCase extends UpdateTestHelper { } /** - * 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( @@ -309,17 +322,17 @@ class UpdateTestContribCase extends UpdateTestHelper { } /** - * 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. @@ -381,7 +394,7 @@ class UpdateTestContribCase extends UpdateTestHelper { } /** - * 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. @@ -422,7 +435,7 @@ class UpdateTestContribCase extends UpdateTestHelper { } /** - * 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. @@ -483,7 +496,7 @@ class UpdateTestContribCase extends UpdateTestHelper { } /** - * 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( @@ -539,13 +552,12 @@ class UpdateTestContribCase extends UpdateTestHelper { } /** - * 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); @@ -601,7 +613,11 @@ class UpdateTestContribCase extends UpdateTestHelper { } +/** + * Tests project upload and extract functionality. + */ class UpdateTestUploadCase extends UpdateTestHelper { + public static function getInfo() { return array( 'name' => 'Upload and extract module functionality', @@ -646,7 +662,7 @@ class UpdateTestUploadCase extends UpdateTestHelper { } /** - * 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'); @@ -657,7 +673,7 @@ class UpdateTestUploadCase extends UpdateTestHelper { } /** - * 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( @@ -698,6 +714,9 @@ class UpdateTestUploadCase extends UpdateTestHelper { } +/** + * Tests update functionality unrelated to the database. + */ class UpdateCoreUnitTestCase extends DrupalUnitTestCase { public static function getInfo() { @@ -714,7 +733,7 @@ class UpdateCoreUnitTestCase extends DrupalUnitTestCase { } /** - * 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