<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[30758] trunk/src/wp-admin/includes/class-wp-upgrader.php: Add missing DocBlocks and parameter descriptions for a wide variety of properties and methods in `WP_Upgrader`, `Plugin_Upgrader`, `Theme_Upgrader`, `Language_Pack_Upgrader`, `Core_Upgrader`, and `File_upload_Upgrader`.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/30758">30758</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/30758","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>DrewAPicture</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2014-12-07 00:25:44 +0000 (Sun, 07 Dec 2014)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Add missing DocBlocks and parameter descriptions for a wide variety of properties and methods in `WP_Upgrader`, `Plugin_Upgrader`, `Theme_Upgrader`, `Language_Pack_Upgrader`, `Core_Upgrader`, and `File_upload_Upgrader`.

Props jdgrimes, DrewAPicture.

See <a href="https://core.trac.wordpress.org/ticket/29086">#29086</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminincludesclasswpupgraderphp">trunk/src/wp-admin/includes/class-wp-upgrader.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminincludesclasswpupgraderphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/class-wp-upgrader.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/class-wp-upgrader.php 2014-12-06 23:52:25 UTC (rev 30757)
+++ trunk/src/wp-admin/includes/class-wp-upgrader.php   2014-12-07 00:25:44 UTC (rev 30758)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -21,24 +21,100 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 2.8.0
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> class WP_Upgrader {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * The error/notification strings used to update the user on the progress.
+        *
+        * @since 2.8.0
+        * @var string $strings
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $strings = array();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * The upgrader skin being used.
+        *
+        * @since 2.8.0
+        * @var WP_Upgrader_Skin $skin
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $skin = null;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * The result of the installation.
+        *
+        * This is set by {@see WP_Upgrader::install_package()}, only when the package is installed
+        * successfully. It will then be an array, unless a {@see WP_Error} is returned by the
+        * {@see 'upgrader_post_install'} filter. In that case, the `WP_Error` will be assigned to
+        * it.
+        *
+        * @since 2.8.0
+        * @var WP_Error|array $result {
+        *      @type string $source             The full path to the source the files were installed from.
+        *      @type string $source_files       List of all the files in the source directory.
+        *      @type string $destination        The full path to the install destination folder.
+        *      @type string $destination_name   The name of the destination folder, or empty if `$destination`
+        *                                       and `$local_destination` are the same.
+        *      @type string $local_destination  The full local path to the destination folder. This is usually
+        *                                       the same as `$destination`.
+        *      @type string $remote_destination The full remote path to the destination folder
+        *                                       (i.e., from `$wp_filesystem`).
+        *      @type bool   $clear_destination  Whether the destination folder was cleared.
+        * }
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $result = array();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * The total number of updates being performed.
+        *
+        * Set by the bulk update methods.
+        *
+        * @since 3.0.0
+        * @var int $update_count
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $update_count = 0;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * The current update if multiple updates are being performed.
+        *
+        * Used by the bulk update methods, and incremented for each update.
+        *
+        * @since 3.0.0
+        * @var int
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $update_current = 0;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function __construct($skin = null) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Construct the upgrader with a skin.
+        *
+        * @since 2.8.0
+        *
+        * @param WP_Upgrader_Skin $skin The upgrader skin to use. Default is a {@see WP_Upgrader_Skin}
+        *                               instance.
+        */
+       public function __construct( $skin = null ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( null == $skin )
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->skin = new WP_Upgrader_Skin();
</span><span class="cx" style="display: block; padding: 0 10px">                else
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->skin = $skin;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Initialize the upgrader.
+        *
+        * This will set the relationship between the skin being used and this upgrader,
+        * and also add the generic strings to `WP_Upgrader::$strings`.
+        *
+        * @since 2.8.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function init() {
</span><span class="cx" style="display: block; padding: 0 10px">                $this->skin->set_upgrader($this);
</span><span class="cx" style="display: block; padding: 0 10px">                $this->generic_strings();
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Add the generic strings to WP_Upgrader::$strings.
+        *
+        * @since 2.8.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function generic_strings() {
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['bad_request'] = __('Invalid Data provided.');
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['fs_unavailable'] = __('Could not access filesystem.');
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -61,6 +137,18 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['maintenance_end'] = __('Disabling Maintenance mode&#8230;');
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Connect to the filesystem.
+        *
+        * @since 2.8.0
+        *
+        * @param array $directories                  Optional. A list of directories. If any of these do
+        *                                            not exist, a {@see WP_Error} object will be returned.
+        *                                            Default empty array.
+        * @param bool  $allow_relaxed_file_ownership Whether to allow relaxed file ownership.
+        *                                            Default false.
+        * @return bool|WP_Error True if able to connect, false or a {@see WP_Error} otherwise.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function fs_connect( $directories = array(), $allow_relaxed_file_ownership = false ) {
</span><span class="cx" style="display: block; padding: 0 10px">                global $wp_filesystem;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -110,7 +198,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return true;
</span><span class="cx" style="display: block; padding: 0 10px">        } //end fs_connect();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function download_package($package) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Download a package.
+        *
+        * @since 2.8.0
+        *
+        * @param string $package The URI of the package. If this is the full path to an
+        *                        existing local file, it will be returned untouched.
+        * @return string|WP_Error The full path to the downloaded package file, or a {@see WP_Error} object.
+        */
+       public function download_package( $package ) {
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                /**
</span><span class="cx" style="display: block; padding: 0 10px">                 * Filter whether to return the package.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -142,7 +239,17 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $download_file;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function unpack_package($package, $delete_package = true) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Unpack a compressed package file.
+        *
+        * @since 2.8.0
+        *
+        * @param string $package        Full path to the package file.
+        * @param bool   $delete_package Optional. Whether to delete the package file after attempting
+        *                               to unpack it. Default true.
+        * @return string|WP_Error The path to the unpacked contents, or a {@see WP_Error} on failure.
+        */
+       public function unpack_package( $package, $delete_package = true ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 global $wp_filesystem;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->skin->feedback('unpack_package');
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -181,6 +288,33 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $working_dir;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Install a package.
+        *
+        * Copies the contents of a package form a source directory, and installs them in
+        * a destination directory. Optionally removes the source. It can also optionally
+        * clear out the destination folder if it already exists.
+        *
+        * @since 2.8.0
+        *
+        * @param array|string $args {
+        *     Optional. Array or string of arguments for installing a package. Default empty array.
+        *
+        *     @type string $source                      Required path to the package source. Default empty.
+        *     @type string $destination                 Required path to a folder to install the package in.
+        *                                               Default empty.
+        *     @type bool   $clear_destination           Whether to delete any files already in the destination
+        *                                               folder. Default false.
+        *     @type bool   $clear_working               Whether to delete the files form the working directory
+        *                                               after copying to the destination. Default false.
+        *     @type bool   $abort_if_destination_exists Whether to abort the installation if
+        *                                               the destination folder already exists. Default true.
+        *     @type array  $hook_extra                  Extra arguments to pass to the filter hooks called by
+        *                                               {@see WP_Upgrader::install_package()}. Default empty array.
+        * }
+        *
+        * @return array|WP_Error The result (also stored in `WP_Upgrader:$result`), or a {@see WP_Error} on failure.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function install_package( $args = array() ) {
</span><span class="cx" style="display: block; padding: 0 10px">                global $wp_filesystem, $wp_theme_directories;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -357,6 +491,40 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $this->result;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Run an upgrade/install.
+        *
+        * Attempts to download the package (if it is not a local file), unpack it, and
+        * install it in the destination folder.
+        *
+        * @since 2.8.0
+        *
+        * @param array $options {
+        *     Array or string of arguments for upgrading/installing a package.
+        *
+        *     @type string $package                     The full path or URI of the package to install.
+        *                                               Default empty.
+        *     @type string $destination                 The full path to the destination folder.
+        *                                               Default empty.
+        *     @type bool   $clear_destination           Whether to delete any files already in the
+        *                                               destination folder. Default false.
+        *     @type bool   $clear_working               Whether to delete the files form the working
+        *                                               directory after copying to the destination.
+        *                                               Default false.
+        *     @type bool   $abort_if_destination_exists Whether to abort the installation if the destination
+        *                                               folder already exists. When true, `$clear_destination`
+        *                                               should be false. Default true.
+        *     @type bool   $is_multi                    Whether this run is one of multiple upgrade/install
+        *                                               actions being performed in bulk. When true, the skin
+        *                                               {@see WP_Upgrader::header()} and {@see WP_Upgrader::footer()}
+        *                                               aren't called. Default false.
+        *     @type array  $hook_extra                  Extra arguments to pass to the filter hooks called by
+        *                                               {@see WP_Upgrader::run()}.
+        * }
+        *
+        * @return array|false|WP_error The result from self::install_package() on success, otherwise a WP_Error,
+        *                              or false if unable to connect to the filesystem.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function run( $options ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $defaults = array(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -451,7 +619,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $result;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function maintenance_mode($enable = false) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Toggle maintenance mode for the site.
+        *
+        * Creates/deletes the maintenance file to enable/disable maintenance mode.
+        *
+        * @since 2.8.0
+        *
+        * @param bool $enable True to enable maintenance mode, false to disable.
+        */
+       public function maintenance_mode( $enable = false ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 global $wp_filesystem;
</span><span class="cx" style="display: block; padding: 0 10px">                $file = $wp_filesystem->abspath() . '.maintenance';
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $enable ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -477,9 +654,28 @@
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> class Plugin_Upgrader extends WP_Upgrader {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Plugin upgrade result.
+        *
+        * @since 2.8.0
+        * @var array|WP_Error $result
+        * @see WP_Upgrader::$result
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $result;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * Whether a bulk upgrade/install is being performed.
+        *
+        * @since 2.9.0
+        * @var bool $bulk
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $bulk = false;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Initialize the upgrade strings.
+        *
+        * @since 2.8.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function upgrade_strings() {
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['up_to_date'] = __('The plugin is at the latest version.');
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['no_package'] = __('Update package not available.');
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -491,6 +687,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['process_success'] = __('Plugin updated successfully.');
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Initialize the install strings.
+        *
+        * @since 2.8.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function install_strings() {
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['no_package'] = __('Install package not available.');
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['downloading_package'] = __('Downloading install package from <span class="code">%s</span>&#8230;');
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -501,6 +702,22 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['process_success'] = __('Plugin installed successfully.');
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Install a plugin package.
+        *
+        * @since 2.8.0
+        * @since 3.7.0 The `$args` parameter was added, making clearing the plugin update cache optional.
+        *
+        * @param string $package The full local path or URI of the package.
+        * @param array  $args {
+        *     Optional. Other arguments for installing a plugin package. Default empty array.
+        *
+        *     @type bool $clear_update_cache Whether to clear the plugin updates cache if successful.
+        *                                    Default true.
+        * }
+        *
+        * @return bool|WP_Error True if the install was successful, false or a WP_Error otherwise.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function install( $package, $args = array() ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $defaults = array(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -535,6 +752,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return true;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Upgrade a plugin.
+        *
+        * @since 2.8.0
+        * @since 3.7.0 The `$args` parameter was added, making clearing the plugin update cache optional.
+        *
+        * @param string $plugin The basename path to the main plugin file.
+        * @param array  $args {
+        *     Optional. Other arguments for upgrading a plugin package. Defualt empty array.
+        *
+        *     @type bool $clear_update_cache Whether to clear the plugin updates cache if successful.
+        *                                    Default true.
+        * }
+        * @return bool|WP_Error True if the upgrade was successful, false or a {@see WP_Error} object otherwise.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function upgrade( $plugin, $args = array() ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $defaults = array(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -586,6 +818,22 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return true;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Bulk upgrade several plugins at once.
+        *
+        * @since 2.8.0
+        * @since 3.7.0 The `$args` parameter was added, making clearing the plugin update cache optional.
+        *
+        * @param string $plugins Array of the basename paths of the plugins' main files.
+        * @param array  $args {
+        *     Optional. Other arguments for upgrading several plugins at once. Default empty array.
+        *
+        *     @type bool $clear_update_cache Whether to clear the plugin updates cache if successful.
+        *                                    Default true.
+        * }
+        *
+        * @return array|false An array of results indexed by plugin file, or false if unable to connect to the filesystem.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function bulk_upgrade( $plugins, $args = array() ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $defaults = array(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -700,6 +948,17 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $results;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Check a source package to be sure it contains a plugin.
+        *
+        * This function is added to the {@see 'upgrader_source_selection'} filter by
+        * {@see Plugin_Upgrader::install()}.
+        *
+        * @since 3.3.0
+        *
+        * @param string $source The path to the downloaded package source.
+        * @return string|WP_Error The source as passed, or a {@see WP_Error} object if no plugins were found.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function check_package($source) {
</span><span class="cx" style="display: block; padding: 0 10px">                global $wp_filesystem;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -726,7 +985,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $source;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        // Return plugin info.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Retrieve the path to the file that contains the plugin info.
+        *
+        * This isn't used internally in the class, but is called by the skins.
+        *
+        * @since 2.8.0
+        *
+        * @return string|false The full path to the main plugin file, or false.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function plugin_info() {
</span><span class="cx" style="display: block; padding: 0 10px">                if ( ! is_array($this->result) )
</span><span class="cx" style="display: block; padding: 0 10px">                        return false;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -742,7 +1009,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $this->result['destination_name'] . '/' . $pluginfiles[0];
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        //Hooked to pre_install
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Deactivates a plugin before it is upgraded.
+        *
+        * Hooked to the {@see 'upgrader_pre_install'} filter by {@see Plugin_Upgrader::upgrade()}.
+        *
+        * @since 2.8.0
+        *
+        * @param bool|WP_Error $return Upgrade offer return.
+        * @param array         $plugin Plugin package arguments.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function deactivate_plugin_before_upgrade($return, $plugin) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( is_wp_error($return) ) //Bypass.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -762,7 +1038,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        //Hooked to upgrade_clear_destination
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Delete the old plugin during an upgrade.
+        *
+        * Hooked to the {@see 'upgrader_clear_destination'} filter by
+        * {@see Plugin_Upgrader::upgrade()} and {@see Plugin_Upgrader::bulk_upgrade()}.
+        *
+        * @since 2.8.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function delete_old_plugin($removed, $local_destination, $remote_destination, $plugin) {
</span><span class="cx" style="display: block; padding: 0 10px">                global $wp_filesystem;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -801,9 +1084,28 @@
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> class Theme_Upgrader extends WP_Upgrader {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Result of the theme upgrade offer.
+        *
+        * @since 2.8.0
+        * @var array|WP_Erorr $result
+        * @see WP_Upgrader::$result
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $result;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * Whether multiple plugins are being upgraded/installed in bulk.
+        *
+        * @since 2.9.0
+        * @var bool $bulk
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $bulk = false;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Initialize the upgrade strings.
+        *
+        * @since 2.8.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function upgrade_strings() {
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['up_to_date'] = __('The theme is at the latest version.');
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['no_package'] = __('Update package not available.');
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -815,6 +1117,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['process_success'] = __('Theme updated successfully.');
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Initialize the install strings.
+        *
+        * @since 2.8.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function install_strings() {
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['no_package'] = __('Install package not available.');
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['downloading_package'] = __('Downloading install package from <span class="code">%s</span>&#8230;');
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -835,7 +1142,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['parent_theme_not_found'] = __('<strong>The parent theme could not be found.</strong> You will need to install the parent theme, <strong>%s</strong>, before you can use this child theme.');
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function check_parent_theme_filter($install_result, $hook_extra, $child_result) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Check if a child theme is being installed and we need to install its parent.
+        *
+        * Hooked to the {@see 'upgrader_post_install'} filter by {@see Theme_Upgrader::install()}.
+        *
+        * @since 3.4.0
+        */
+       public function check_parent_theme_filter( $install_result, $hook_extra, $child_result ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 // Check to see if we need to install a parent theme
</span><span class="cx" style="display: block; padding: 0 10px">                $theme_info = $this->theme_info();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -894,11 +1208,38 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $install_result;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function hide_activate_preview_actions($actions) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Don't display the activate and preview actions to the user.
+        *
+        * Hooked to the {@see 'install_theme_complete_actions'} filter by
+        * {@see Theme_Upgrader::check_parent_theme_filter()} when installing
+        * a child theme and installing the parent theme fails.
+        *
+        * @since 3.4.0
+        *
+        * @param array $actions Preview actions.
+        */
+       public function hide_activate_preview_actions( $actions ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 unset($actions['activate'], $actions['preview']);
</span><span class="cx" style="display: block; padding: 0 10px">                return $actions;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Install a theme package.
+        *
+        * @since 2.8.0
+        * @since 3.7.0 The `$args` parameter was added, making clearing the update cache optional.
+        *
+        * @param string $package The full local path or URI of the package.
+        * @param array  $args {
+        *     Optional. Other arguments for installing a theme package. Default empty array.
+        *
+        *     @type bool $clear_update_cache Whether to clear the updates cache if successful.
+        *                                    Default true.
+        * }
+        *
+        * @return bool|WP_Error True if the install was successful, false or a {@see WP_Error} object otherwise.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function install( $package, $args = array() ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $defaults = array(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -935,6 +1276,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return true;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Upgrade a theme.
+        *
+        * @since 2.8.0
+        * @since 3.7.0 The `$args` parameter was added, making clearing the update cache optional.
+        *
+        * @param string $theme The theme slug.
+        * @param array  $args {
+        *     Optional. Other arguments for upgrading a theme. Default empty array.
+        *
+        *     @type bool $clear_update_cache Whether to clear the update cache if successful.
+        *                                    Default true.
+        * }
+        * @return bool|WP_Error True if the upgrade was successful, false or a {@see WP_Error} object otherwise.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function upgrade( $theme, $args = array() ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $defaults = array(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -985,6 +1341,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return true;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Upgrade several themes at once.
+        *
+        * @since 3.0.0
+        * @since 3.7.0 The `$args` parameter was added, making clearing the update cache optional.
+        *
+        * @param string $themes The theme slugs.
+        * @param array  $args {
+        *     Optional. Other arguments for upgrading several themes at once. Default empty array.
+        *
+        *     @type bool $clear_update_cache Whether to clear the update cache if successful.
+        *                                    Default true.
+        * }
+        * @return array[]|false An array of results, or false if unable to connect to the filesystem.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function bulk_upgrade( $themes, $args = array() ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $defaults = array(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1087,7 +1458,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $results;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function check_package($source) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Check that the package source contains a valid theme.
+        *
+        * Hooked to the {@see 'upgrader_source_selection'} filter by {@see Theme_Upgrader::install()}.
+        * It will return an error if the theme doesn't have style.css or index.php
+        * files.
+        *
+        * @since 3.3.0
+        *
+        * @param string $source The full path to the package source.
+        * @return string|WP_Error The source or a WP_Error.
+        */
+       public function check_package( $source ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 global $wp_filesystem;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( is_wp_error($source) )
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1114,6 +1497,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $source;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Turn on maintenance mode before attempting to upgrade the current theme.
+        *
+        * Hooked to the {@see 'upgrader_pre_install'} filter by {@see Theme_Upgrader::upgrade()} and
+        * {@see Theme_Upgrader::bulk_upgrade()}.
+        *
+        * @since 2.8.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function current_before($return, $theme) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( is_wp_error($return) )
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1130,6 +1521,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $return;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Turn off maintenance mode after upgrading the current theme.
+        *
+        * Hooked to the {@see 'upgrader_post_install'} filter by {@see Theme_Upgrader::upgrade()}
+        * and {@see Theme_Upgrader::bulk_upgrade()}.
+        *
+        * @since 2.8.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function current_after($return, $theme) {
</span><span class="cx" style="display: block; padding: 0 10px">                if ( is_wp_error($return) )
</span><span class="cx" style="display: block; padding: 0 10px">                        return $return;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1152,6 +1551,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $return;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Delete the old theme during an upgrade.
+        *
+        * Hooked to the {@see 'upgrader_clear_destination'} filter by {@see Theme_Upgrader::upgrade()}
+        * and {@see Theme_Upgrader::bulk_upgrade()}.
+        *
+        * @since 2.8.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function delete_old_theme( $removed, $local_destination, $remote_destination, $theme ) {
</span><span class="cx" style="display: block; padding: 0 10px">                global $wp_filesystem;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1171,6 +1578,17 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return true;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Get the WP_Theme object for a theme.
+        *
+        * @since 2.8.0
+        * @since 3.0.0 The `$theme` argument was added.
+        *
+        * @param string $theme The directory name of the theme. This is optional, and if not supplied,
+        *                      the directory name from the last result will be used.
+        * @return WP_Theme|false The theme's info object, or false `$theme` is not supplied
+        *                        and the last result isn't set.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function theme_info($theme = null) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( empty($theme) ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1195,9 +1613,30 @@
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> class Language_Pack_Upgrader extends WP_Upgrader {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Result of the language pack upgrade.
+        *
+        * @since 3.7.0
+        * @var array|WP_Error $result
+        * @see WP_Upgrader::$result
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $result;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * Whether a bulk upgrade/install is being performed.
+        *
+        * @since 3.7.0
+        * @var bool $bulk
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $bulk = true;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Asynchronously upgrade language packs after other upgrades have been made.
+        *
+        * Hooked to the {@see 'upgrader_process_complete'} action by default.
+        *
+        * @since 3.7.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public static function async_upgrade( $upgrader = false ) {
</span><span class="cx" style="display: block; padding: 0 10px">                // Avoid recursion.
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $upgrader && $upgrader instanceof Language_Pack_Upgrader ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1247,6 +1686,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $lp_upgrader->bulk_upgrade( $language_updates );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Initialize the upgrade strings.
+        *
+        * @since 3.7.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function upgrade_strings() {
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['starting_upgrade'] = __( 'Some of your translations need updating. Sit tight for a few more seconds while we update them as well.' );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['up_to_date'] = __( 'The translation is up to date.' ); // We need to silently skip this case
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1257,6 +1701,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['process_success'] = __( 'Translation updated successfully.' );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Upgrade a language pack.
+        *
+        * @since 3.7.0
+        *
+        * @param string|false $update Optional. Whether an update offer is available. Default false.
+        * @param array        $args   Optional. Other optional arguments, see
+        *                             {@see Language_Pack_Upgrader::bulk_upgrade()}. Default empty array.
+        * @return array|WP_Error The result of the upgrade, or a {@see wP_Error} object instead.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function upgrade( $update = false, $args = array() ) {
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $update ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $update = array( $update );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1271,6 +1725,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $results[0];
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Bulk upgrade language packs.
+        *
+        * @since 3.7.0
+        *
+        * @param array $language_updates Optional. Language pack updates. Default empty array.
+        * @param array $args {
+        *     Optional. Other arguments for upgrading multiple language packs. Default empty array
+        *
+        *     @type bool $clear_update_cache Whether to clear the update cache when done.
+        *                                    Default true.
+        * }
+        * @return array|true|false|WP_Error Will return an array of results, or true if there are no updates,
+        *                                   false or WP_Error for initial errors.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function bulk_upgrade( $language_updates = array(), $args = array() ) {
</span><span class="cx" style="display: block; padding: 0 10px">                global $wp_filesystem;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1378,6 +1847,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $results;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Check the package source to make sure there are .mo and .po files.
+        *
+        * Hooked to the {@see 'upgrader_source_selection'} filter by
+        * {@see Language_Pack_Upgrader::bulk_upgrade()}.
+        *
+        * @since 3.7.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function check_package( $source, $remote_source ) {
</span><span class="cx" style="display: block; padding: 0 10px">                global $wp_filesystem;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1403,6 +1880,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $source;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Get the name of an item being updated.
+        *
+        * @since 3.7.0
+        *
+        * @param object The data for an update.
+        * @return string The name of the item being updated.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function get_name_for_update( $update ) {
</span><span class="cx" style="display: block; padding: 0 10px">                switch ( $update->type ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        case 'core':
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1434,6 +1919,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> class Core_Upgrader extends WP_Upgrader {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Initialize the upgrade strings.
+        *
+        * @since 2.8.0
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function upgrade_strings() {
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['up_to_date'] = __('WordPress is at the latest version.');
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['no_package'] = __('Update package not available.');
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1445,6 +1935,24 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->strings['rollback_was_required'] = __( 'Due to an error during updating, WordPress has rolled back to your previous version.' );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Upgrade WordPress core.
+        *
+        * @since 2.8.0
+        *
+        * @param object $current Response object for whether WordPress is current.
+        * @param array  $args {
+        *        Optional. Arguments for upgrading WordPress core. Default empty array.
+        *
+        *        @type bool $pre_check_md5    Whether to check the file checksums before
+        *                                     attempting the upgrade. Default true.
+        *        @type bool $attempt_rollback Whether to attempt to rollback the chances if
+        *                                     there is a problem. Default false.
+        *        @type bool $do_rollback      Whether to perform this "upgrade" as a rollback.
+        *                                     Default false.
+        * }
+        * @return null|false|WP_Error False or WP_Error on failure, null on success.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function upgrade( $current, $args = array() ) {
</span><span class="cx" style="display: block; padding: 0 10px">                global $wp_filesystem;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1593,8 +2101,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return $result;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        // Determines if this WordPress Core version should update to $offered_ver or not
-       public static function should_update_to_version( $offered_ver /* x.y.z */ ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Determines if this WordPress Core version should update to an offered version or not.
+        *
+        * @since 3.7.0
+        *
+        * @param string $offered_ver The offered version, of the format x.y.z.
+        * @return bool True if we should update to the offered version, otherwise false.
+        */
+       public static function should_update_to_version( $offered_ver ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 include( ABSPATH . WPINC . '/version.php' ); // $wp_version; // x.y.z
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $current_branch = implode( '.', array_slice( preg_split( '/[.-]/', $wp_version  ), 0, 2 ) ); // x.y
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1692,6 +2207,13 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Compare the disk file checksums agains the expected checksums.
+        *
+        * @since 3.7.0
+        *
+        * @return bool True if the checksums match, otherwise false.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function check_files() {
</span><span class="cx" style="display: block; padding: 0 10px">                global $wp_version, $wp_local_package;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1720,11 +2242,40 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 2.8.0
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> class File_Upload_Upgrader {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * The full path to the file package.
+        *
+        * @since 2.8.0
+        * @var string $package
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $package;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * The name of the file.
+        *
+        * @since 2.8.0
+        * @var string $filename
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $filename;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * The ID of the attachment post for this file.
+        *
+        * @since 3.3.0
+        * @var int $id
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public $id = 0;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function __construct($form, $urlholder) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ /**
+        * Construct the upgrader for a form.
+        *
+        * @since 2.8.0
+        *
+        * @param string $form      The name of the form the file was uploaded from.
+        * @param string $urlholder The name of the `GET` parameter that holds the filename.
+        */
+       public function __construct( $form, $urlholder ) {
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( empty($_FILES[$form]['name']) && empty($_GET[$urlholder]) )
</span><span class="cx" style="display: block; padding: 0 10px">                        wp_die(__('Please select a file'));
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1775,6 +2326,13 @@
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * Delete the attachment/uploaded file.
+        *
+        * @since 3.2.2
+        *
+        * @return bool Whether the cleanup was successful.
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function cleanup() {
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $this->id )
</span><span class="cx" style="display: block; padding: 0 10px">                        wp_delete_attachment( $this->id );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2093,7 +2651,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'attempt_rollback'   => true,
</span><span class="cx" style="display: block; padding: 0 10px">                        // Allow relaxed file ownership in some scenarios
</span><span class="cx" style="display: block; padding: 0 10px">                        'allow_relaxed_file_ownership' => $allow_relaxed_file_ownership,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        
</del><span class="cx" style="display: block; padding: 0 10px">                 ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // If the filesystem is unavailable, false is returned.
</span></span></pre>
</div>
</div>

</body>
</html>