<!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>[25873] trunk/src: Make some changes to the email templates to account for the fact that an auto update offer might not be to the latest version.</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">
<dt>Revision</dt> <dd><a href="http://core.trac.wordpress.org/changeset/25873">25873</a></dd>
<dt>Author</dt> <dd>nacin</dd>
<dt>Date</dt> <dd>2013-10-22 21:18:09 +0000 (Tue, 22 Oct 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>Make some changes to the email templates to account for the fact that an auto update offer might not be to the latest version.

For example, 3.7.2 install is served a 3.7.3 update, but the current version is 3.8.1.

This commit also allows for core update notification emails to be sent even when we are unable to run an auto update due to filesystem configuration (VCS checkout or file permissions). But, since these emails go through WP_Automatic_Updater, they will not be sent if the updater is outright disabled.

fixes <a href="http://core.trac.wordpress.org/ticket/25654">#25654</a>.</pre>

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

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminincludesclasswpupgraderphp"></a>
<div class="modfile"><h4>Modified: trunk/src/wp-admin/includes/class-wp-upgrader.php (25872 => 25873)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/src/wp-admin/includes/class-wp-upgrader.php        2013-10-22 21:14:06 UTC (rev 25872)
+++ trunk/src/wp-admin/includes/class-wp-upgrader.php   2013-10-22 21:18:09 UTC (rev 25873)
</span><span class="lines">@@ -1652,6 +1652,8 @@
</span><span class="cx">           * There are more fine-grained filters and controls for selective disabling.
</span><span class="cx">           * This filter parallels the AUTOMATIC_UPDATER_DISABLED constant in name.
</span><span class="cx">           *
</span><ins>+                * This also disables update notification emails. That may change in the future.
+                *
</ins><span class="cx">            * @since 3.7.0
</span><span class="cx">           * @param bool $disabled Whether the updater should be disabled.
</span><span class="cx">           */
</span><span class="lines">@@ -1728,17 +1730,19 @@
</span><span class="cx">   *                        should be checked.
</span><span class="cx">   */
</span><span class="cx">  public function should_update( $type, $item, $context ) {
</span><ins>+               // Used to see if WP_Filesystem is set up to allow unattended updates.
+               $skin = new Automatic_Upgrader_Skin;
+
</ins><span class="cx">           if ( $this->is_disabled() )
</span><span class="cx">                  return false;
</span><span class="cx"> 
</span><del>-               // Checks to see if WP_Filesystem is set up to allow unattended updates.
-               $skin = new Automatic_Upgrader_Skin;
-               if ( ! $skin->request_filesystem_credentials( false, $context ) )
</del><ins>+                // If we can't do an auto core update, we may still be able to email the user.
+               if ( ! $skin->request_filesystem_credentials( false, $context ) || $this->is_vcs_checkout( $context ) ) {
+                       if ( 'core' == $type )
+                               $this->notify_core_update( $item );
</ins><span class="cx">                   return false;
</span><ins>+               }
</ins><span class="cx"> 
</span><del>-               if ( $this->is_vcs_checkout( $context ) )
-                       return false;
-
</del><span class="cx">           // Next up, is this an item we can update?
</span><span class="cx">          if ( 'core' == $type )
</span><span class="cx">                  $update = Core_Upgrader::should_update_to_version( $item->current );
</span><span class="lines">@@ -1765,19 +1769,8 @@
</span><span class="cx">          $update = apply_filters( 'auto_update_' . $type, $update, $item );
</span><span class="cx"> 
</span><span class="cx">          if ( ! $update ) {
</span><del>-
-                       // See if we need to notify users of a core update.
-                       if ( 'core' == $type && ! empty( $item->notify_email ) ) {
-                               $notify      = true;
-                               $notified    = get_site_option( 'auto_core_update_notified' );
-
-                               // Don't notify if we've already notified the same email address of the same version.
-                               if ( $notified && $notified['email'] == get_site_option( 'admin_email' ) && $notified['version'] == $item->current )
-                                       return false;
-
-                               $this->send_email( 'manual', $item );
-                       }
-
</del><ins>+                        if ( 'core' == $type )
+                               $this->notify_core_update( $item );
</ins><span class="cx">                   return false;
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="lines">@@ -1799,6 +1792,29 @@
</span><span class="cx">  }
</span><span class="cx"> 
</span><span class="cx">  /**
</span><ins>+        * Notifies an administrator of a core update.
+        *
+        * @since 3.7.0
+        *
+        * @param object $item The update offer.
+        */
+       protected function notify_core_update( $item ) {
+               // See if we need to notify users of a core update.
+               if ( empty( $item->notify_email ) )
+                       return false;
+
+               $notify   = true;
+               $notified = get_site_option( 'auto_core_update_notified' );
+
+               // Don't notify if we've already notified the same email address of the same version.
+               if ( $notified && $notified['email'] == get_site_option( 'admin_email' ) && $notified['version'] == $item->current )
+                       return false;
+
+               $this->send_email( 'manual', $item );
+               return true;
+       }
+
+       /**
</ins><span class="cx">    * Update an item, if appropriate.
</span><span class="cx">   *
</span><span class="cx">   * @since 3.7.0
</span><span class="lines">@@ -1890,6 +1906,9 @@
</span><span class="cx">  public function run() {
</span><span class="cx">          global $wpdb, $wp_version;
</span><span class="cx"> 
</span><ins>+               if ( $this->is_disabled() )
+                       return;
+
</ins><span class="cx">           if ( ! is_main_network() || ! is_main_site() )
</span><span class="cx">                  return;
</span><span class="cx"> 
</span><span class="lines">@@ -2082,7 +2101,7 @@
</span><span class="cx">   *
</span><span class="cx">   * @since 3.7.0
</span><span class="cx">   *
</span><del>-        * @param string $type        The type of update being checked: 'core', 'theme', 'plugin', 'translation'.
</del><ins>+         * @param string $type        The type of email to send. Can be one of 'success', 'fail', 'manual', 'critical'.
</ins><span class="cx">    * @param object $core_update The update offer that was attempted.
</span><span class="cx">   * @param mixed  $result      Optional. The result for the core update. Can be WP_Error.
</span><span class="cx">   */
</span><span class="lines">@@ -2094,6 +2113,14 @@
</span><span class="cx">                  'timestamp' => time(),
</span><span class="cx">          ) );
</span><span class="cx"> 
</span><ins>+               $next_user_core_update = get_preferred_from_update_core();
+               // If the update transient is empty, use the update we just performed
+               if ( ! $next_user_core_update )
+                       $next_user_core_update = $core_update;
+               $newer_version_available = ( 'upgrade' == $next_user_core_update->response && version_compare( $next_user_core_update->version, $core_update, '>' ) );
+
+               $newer_version_available = true;
+               $next_user_core_update->version = $next_user_core_update->current = '3.8.1';
</ins><span class="cx">           /**
</span><span class="cx">           * Filter whether to send an email following an automatic background core update.
</span><span class="cx">           *
</span><span class="lines">@@ -2128,34 +2155,52 @@
</span><span class="cx">                          return;
</span><span class="cx">          }
</span><span class="cx"> 
</span><del>-               $subject = sprintf( $subject, wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ), $core_update->current );
</del><ins>+                // If the auto update is not to the latest version, say that the current version of WP is available instead.
+               $version = 'success' === $type ? $core_update->current : $next_user_core_update->current;
+               $subject = sprintf( $subject, wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ), $version );
</ins><span class="cx"> 
</span><span class="cx">          $body = '';
</span><span class="cx"> 
</span><span class="cx">          switch ( $type ) {
</span><span class="cx">                  case 'success' :
</span><span class="cx">                          $body .= sprintf( __( 'Howdy! Your site at %1$s has been updated automatically to WordPress %2$s.' ), home_url(), $core_update->current );
</span><del>-                               $body .= "\n\n" . __( 'No further action is needed on your part.' );
</del><ins>+                                $body .= "\n\n";
+                               if ( ! $newer_version_available )
+                                       $body .= __( 'No further action is needed on your part.' ) . ' ';
</ins><span class="cx"> 
</span><span class="cx">                          // Can only reference the About screen if their update was successful.
</span><span class="cx">                          list( $about_version ) = explode( '-', $core_update->current, 2 );
</span><del>-                               $body .= ' ' . sprintf( __( "For more on version %s, see the About WordPress screen:" ), $about_version );
</del><ins>+                                $body .= sprintf( __( "For more on version %s, see the About WordPress screen:" ), $about_version );
</ins><span class="cx">                           $body .= "\n" . admin_url( 'about.php' );
</span><ins>+
+                               if ( $newer_version_available ) {
+                                       $body .= "\n\n" . sprintf( __( 'WordPress %s is also now available.' ), $next_user_core_update->current ) . ' ';
+                                       $body .= __( 'Updating is easy and only takes a few moments:' );
+                                       $body .= "\n" . network_admin_url( 'update-core.php' );
+                               }
+
</ins><span class="cx">                           break;
</span><span class="cx"> 
</span><span class="cx">                  case 'fail' :
</span><span class="cx">                  case 'manual' :
</span><del>-                               $body .= sprintf( __( 'Please update your site at %1$s to WordPress %2$s.' ), home_url(), $core_update->current );
</del><ins>+                                $body .= sprintf( __( 'Please update your site at %1$s to WordPress %2$s.' ), home_url(), $next_user_core_update->current );
</ins><span class="cx"> 
</span><span class="cx">                          $body .= "\n\n";
</span><del>-                               if ( 'fail' == $type )
</del><ins>+
+                               // Don't show this message if there is a newer version available.
+                               // Potential for confusion, and also not useful for them to know at this point.
+                               if ( 'fail' == $type && ! $newer_version_available )
</ins><span class="cx">                                   $body .= __( 'We tried but were unable to update your site automatically.' ) . ' ';
</span><ins>+
</ins><span class="cx">                           $body .= __( 'Updating is easy and only takes a few moments:' );
</span><span class="cx">                          $body .= "\n" . network_admin_url( 'update-core.php' );
</span><span class="cx">                          break;
</span><span class="cx"> 
</span><span class="cx">                  case 'critical' :
</span><del>-                               $body .= sprintf( __( 'Your site at %1$s experienced a critical failure while trying to update to the latest version of WordPress, %2$s.' ), home_url(), $core_update->current );
</del><ins>+                                if ( $newer_version_available )
+                                       $body .= sprintf( __( 'Your site at %1$s experienced a critical failure while trying to update WordPress to version %2$s.' ), home_url(), $core_update->current );
+                               else
+                                       $body .= sprintf( __( 'Your site at %1$s experienced a critical failure while trying to update to the latest version of WordPress, %2$s.' ), home_url(), $core_update->current );
</ins><span class="cx"> 
</span><span class="cx">                          $body .= "\n\n" . __( "This means your site may be offline or broken. Don't panic; this can be fixed." );
</span><span class="cx"> 
</span><span class="lines">@@ -2165,15 +2210,15 @@
</span><span class="cx">          }
</span><span class="cx"> 
</span><span class="cx">          // Updates are important!
</span><del>-               if ( $type != 'success' )
</del><ins>+                if ( $type != 'success' || $newer_version_available )
</ins><span class="cx">                   $body .= "\n\n" . __( 'Keeping your site updated is important for security. It also makes the internet a safer place for you and your readers.' );
</span><span class="cx"> 
</span><span class="cx">          // Add a note about the support forums to all emails.
</span><span class="cx">          $body .= "\n\n" . __( 'If you experience any issues or need support, the volunteers in the WordPress.org support forums may be able to help.' );
</span><span class="cx">          $body .= "\n" . __( 'http://wordpress.org/support/' );
</span><span class="cx"> 
</span><del>-               // If things are successful, mention plugins and themes if any are out of date.
-               if ( $type == 'success' && ( get_plugin_updates() || get_theme_updates() ) ) {
</del><ins>+                // If things are successful and we're now on the latest, mention plugins and themes if any are out of date.
+               if ( $type == 'success' && ! $newer_version_available && ( get_plugin_updates() || get_theme_updates() ) ) {
</ins><span class="cx">                   $body .= "\n\n" . __( 'You also have some plugins or themes with updates available. Update them now:' );
</span><span class="cx">                  $body .= "\n" . network_admin_url();
</span><span class="cx">          }
</span><span class="lines">@@ -2182,7 +2227,8 @@
</span><span class="cx"> 
</span><span class="cx">          if ( 'critical' == $type && is_wp_error( $result ) ) {
</span><span class="cx">                  $body .= "\n***\n\n";
</span><del>-                       $body .= __( 'We have some data that describes the error your site encountered.' );
</del><ins>+                        $body .= sprintf( __( 'Your site was running version %s.' ), $GLOBALS['wp_version'] );
+                       $body .= ' ' . __( 'We have some data that describes the error your site encountered.' );
</ins><span class="cx">                   $body .= ' ' . __( 'Your hosting company, support forum volunteers, or a friendly developer may be able to use this information to help you:' );
</span><span class="cx"> 
</span><span class="cx">                  // If we had a rollback and we're still critical, then the rollback failed too.
</span></span></pre></div>
<a id="trunksrcwpincludesupdatephp"></a>
<div class="modfile"><h4>Modified: trunk/src/wp-includes/update.php (25872 => 25873)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/src/wp-includes/update.php 2013-10-22 21:14:06 UTC (rev 25872)
+++ trunk/src/wp-includes/update.php    2013-10-22 21:18:09 UTC (rev 25873)
</span><span class="lines">@@ -415,9 +415,6 @@
</span><span class="cx">  include_once ABSPATH . '/wp-admin/includes/class-wp-upgrader.php';
</span><span class="cx"> 
</span><span class="cx">  $upgrader = new WP_Automatic_Updater;
</span><del>-       if ( $upgrader->is_disabled() )
-               return;
-
</del><span class="cx">   $upgrader->run();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>