<!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>[1397] sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory: WP.org Themes: Don't update theme post until new version was approved.</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="http://meta.trac.wordpress.org/changeset/1397">1397</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://meta.trac.wordpress.org/changeset/1397","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>obenland</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2015-03-13 12:04:27 +0000 (Fri, 13 Mar 2015)</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'>WP.org Themes: Don't update theme post until new version was approved.

Theme description and tags might change in new versions, so the post can't be
updated with that new information until that version has been approved.

This also fixes a bug where the post date would be set to the upload date of
the new version, mixing new themes with updated themes in the `Latest Themes`
view in the Directory.

Fixes <a href="http://meta.trac.wordpress.org/ticket/943">#943</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginsthemedirectoryadmineditphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory/admin-edit.php</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginsthemedirectoryclasswporgthemesuploadphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory/class-wporg-themes-upload.php</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginsthemedirectorythemedirectoryphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory/theme-directory.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginsthemedirectoryadmineditphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory/admin-edit.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory/admin-edit.php   2015-03-13 00:56:45 UTC (rev 1396)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory/admin-edit.php     2015-03-13 12:04:27 UTC (rev 1397)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -391,6 +391,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">                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">+        // Only run once.
+       remove_action( 'save_post', __FUNCTION__ );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         $new_status = array();
</span><span class="cx" style="display: block; padding: 0 10px">        foreach ( $_POST['wporg_themes_status'] as $version => $status ) {
</span><span class="cx" style="display: block; padding: 0 10px">                // We could check of the passed status is valid, but wporg_themes_update_version_status() handles that beautifully.
</span></span></pre></div>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginsthemedirectoryclasswporgthemesuploadphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory/class-wporg-themes-upload.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory/class-wporg-themes-upload.php    2015-03-13 00:56:45 UTC (rev 1396)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory/class-wporg-themes-upload.php      2015-03-13 12:04:27 UTC (rev 1397)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -524,28 +524,26 @@
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public function create_or_update_theme_post( $ticket_id ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $upload_date = current_time( 'mysql' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $post_args   = array(
-                       'post_author'    => $this->author->ID,
-                       'post_title'     => $this->theme->get( 'Name' ),
-                       'post_name'      => $this->theme_slug,
-                       'post_content'   => $this->theme->get( 'Description' ),
-                       'post_parent'    => $this->theme->post_parent,
-                       'post_date'      => $upload_date,
-                       'comment_status' => 'closed',
-                       'ping_status'    => 'closed',
-                       'post_type'      => 'repopackage',
-                       'tags_input'     => $this->theme->get( 'Tags' ),
-               );
</del><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                // If we already have a post, update it.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         // If we already have a post, get its ID.
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( ! empty( $this->theme_post ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $post_args['ID'] = $this->theme_post->ID;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $post_id = $this->theme_post->ID;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $post_id = wp_update_post( $post_args );
-
-                       // Otherwise create it for this new theme.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         // Otherwise create it for this new theme.
</ins><span class="cx" style="display: block; padding: 0 10px">                 } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $post_id = wp_insert_post( $post_args );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $post_id = wp_insert_post( array(
+                               'post_author'    => $this->author->ID,
+                               'post_title'     => $this->theme->get( 'Name' ),
+                               'post_name'      => $this->theme_slug,
+                               'post_content'   => $this->theme->get( 'Description' ),
+                               'post_parent'    => $this->theme->post_parent,
+                               'post_date'      => $upload_date,
+                               'post_date_gmt'  => $upload_date,
+                               'comment_status' => 'closed',
+                               'ping_status'    => 'closed',
+                               'post_type'      => 'repopackage',
+                               'tags_input'     => $this->theme->get( 'Tags' ),
+                       ) );
</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">                // Finally, add post meta.
</span></span></pre></div>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginsthemedirectorythemedirectoryphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory/theme-directory.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory/theme-directory.php      2015-03-13 00:56:45 UTC (rev 1396)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory/theme-directory.php        2015-03-13 12:04:27 UTC (rev 1397)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -338,6 +338,14 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        wporg_themes_update_wpthemescom( $post->post_name, $version );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        // Update the post with this version's description and tags.
+       $theme_data = wporg_themes_get_header_data( sprintf( 'https://themes.svn.wordpress.org/%1$s/%2$s/style.css', $post->post_name, $version ) );
+       wp_update_post( array(
+               'ID'           => $post_id,
+               'post_content' => $theme_data['Description'],
+               'tags_input'   => $theme_data['Tags'],
+       ) );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         /*
</span><span class="cx" style="display: block; padding: 0 10px">         * Bail if we're activating an old version, the author does not need to be
</span><span class="cx" style="display: block; padding: 0 10px">         * notified about that.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -498,3 +506,86 @@
</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">+
+/**
+ * Custom version of core's deprecated `get_theme_data()` function.
+ *
+ * @param string $theme_file Path to the file.
+ * @return array File headers.
+ */
+function wporg_themes_get_header_data( $theme_file ) {
+       $themes_allowed_tags = array(
+               'a'       => array(
+                       'href'  => array(),
+                       'title' => array(),
+               ),
+               'abbr'    => array(
+                       'title' => array(),
+               ),
+               'acronym' => array(
+                       'title' => array(),
+               ),
+               'code'    => array(),
+               'em'      => array(),
+               'strong'  => array(),
+       );
+
+       $theme_data = implode( '', file( $theme_file ) );
+       $theme_data = str_replace( '\r', '\n', $theme_data );
+       preg_match( '|^[ \t\/*#@]*Theme Name:(.*)$|mi', $theme_data, $theme_name );
+       preg_match( '|^[ \t\/*#@]*Theme URI:(.*)$|mi', $theme_data, $theme_uri );
+       preg_match( '|^[ \t\/*#@]*Description:(.*)$|mi', $theme_data, $description );
+
+       if ( preg_match( '|^[ \t\/*#@]*Author URI:(.*)$|mi', $theme_data, $author_uri ) ) {
+               $author_uri = esc_url( trim( $author_uri[1] ) );
+       } else {
+               $author_uri = '';
+       }
+
+       if ( preg_match( '|^[ \t\/*#@]*Template:(.*)$|mi', $theme_data, $template ) ) {
+               $template = wp_kses( trim( $template[1] ), $themes_allowed_tags );
+       } else {
+               $template = '';
+       }
+
+       if ( preg_match( '|^[ \t\/*#@]*Version:(.*)$|mi', $theme_data, $version ) ) {
+               $version = wp_kses( trim( $version[1] ), $themes_allowed_tags );
+       } else {
+               $version = '';
+       }
+
+       if ( preg_match( '|^[ \t\/*#@]*Status:(.*)$|mi', $theme_data, $status ) ) {
+               $status = wp_kses( trim( $status[1] ), $themes_allowed_tags );
+       } else {
+               $status = 'publish';
+       }
+
+       if ( preg_match( '|^[ \t\/*#@]*Tags:(.*)$|mi', $theme_data, $tags ) ) {
+               $tags = array_map( 'trim', explode( ',', wp_kses( trim( $tags[1] ), array() ) ) );
+       } else {
+               $tags = array();
+       }
+
+       if ( preg_match( '|^[ \t\/*#@]*Author:(.*)$|mi', $theme_data, $author_name ) ) {
+               $author = wp_kses( trim( $author_name[1] ), $themes_allowed_tags );
+       } else {
+               $author = 'Anonymous';
+       }
+
+       $name        = $theme = wp_kses( trim( $theme_name[1] ), $themes_allowed_tags );
+       $theme_uri   = esc_url( trim( $theme_uri[1] ) );
+       $description = wp_kses( trim( $description[1] ), $themes_allowed_tags );
+
+       return array(
+               'Name'        => $name,
+               'Title'       => $theme,
+               'URI'         => $theme_uri,
+               'Description' => $description,
+               'Author'      => $author,
+               'Author_URI'  => $author_uri,
+               'Version'     => $version,
+               'Template'    => $template,
+               'Status'      => $status,
+               'Tags'        => $tags,
+       );
+}
</ins></span></pre>
</div>
</div>

</body>
</html>