<!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>[11372] sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-trac-watcher: SVN Watcher: Move the Trac importer from running within profiles.wordpress.org into this plugin.</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 { white-space: pre-line; 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/11372">11372</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/11372","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>dd32</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2021-12-15 04:38:09 +0000 (Wed, 15 Dec 2021)</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'>SVN Watcher: Move the Trac importer from running within profiles.wordpress.org into this plugin.

The Trac importer was previously running as part of profiles, but was sporadic due to the different cron setup of the various WordPress.org multisites.
This brings over the code to here, leaving profiles just consuming the data instead.

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

<h3>Modified Paths</h3>
<ul>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswporgtracwatchersvnphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-trac-watcher/svn.php</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswporgtracwatchertracwatchphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-trac-watcher/trac-watch.php</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswporgtracwatchertracphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-trac-watcher/trac.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswporgtracwatchersvnphp"></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/wporg-trac-watcher/svn.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/wporg-trac-watcher/svn.php       2021-12-15 02:47:05 UTC (rev 11371)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-trac-watcher/svn.php 2021-12-15 04:38:09 UTC (rev 11372)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -20,6 +20,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'name'        => 'Core',
</span><span class="cx" style="display: block; padding: 0 10px">                        'url'         => 'https://develop.svn.wordpress.org',
</span><span class="cx" style="display: block; padding: 0 10px">                        'trac'        => 'https://core.trac.wordpress.org',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        'trac_table'  => 'trac_core',
</ins><span class="cx" style="display: block; padding: 0 10px">                         'rev_table'   => 'trac_core_revisions',
</span><span class="cx" style="display: block; padding: 0 10px">                        'props_table' => 'trac_core_props',
</span><span class="cx" style="display: block; padding: 0 10px">                ],
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -28,9 +29,46 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'name'        => 'Meta',
</span><span class="cx" style="display: block; padding: 0 10px">                        'url'         => 'https://meta.svn.wordpress.org',
</span><span class="cx" style="display: block; padding: 0 10px">                        'trac'        => 'https://meta.trac.wordpress.org',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        'trac_table'  => 'trac_meta',
</ins><span class="cx" style="display: block; padding: 0 10px">                         'rev_table'   => 'trac_meta_revisions',
</span><span class="cx" style="display: block; padding: 0 10px">                        'props_table' => 'trac_meta_props',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                ]
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         ],
+               'plugins' => [
+                       'slug'        => 'plugins',
+                       'name'        => 'Plugins',
+                       'url'         => 'https://plugins.svn.wordpress.org',
+                       'trac'        => 'https://plugins.trac.wordpress.org',
+                       'trac_table'  => 'trac_plugins',
+                       'rev_table'   => false,
+                       'props_table' => false,
+               ],
+               'themes' => [
+                       'slug'        => 'themes',
+                       'name'        => 'Themes',
+                       'url'         => 'https://themes.svn.wordpress.org',
+                       'trac'        => 'https://themes.trac.wordpress.org',
+                       'trac_table'  => 'trac_themes',
+                       'rev_table'   => false,
+                       'props_table' => false,
+               ],
+               'buddypress' => [
+                       'slug'        => 'buddypress',
+                       'name'        => 'BuddyPress',
+                       'url'         => 'https://buddypress.svn.wordpress.org',
+                       'trac'        => 'https://buddypress.trac.wordpress.org',
+                       'trac_table'  => 'trac_buddypress',
+                       'rev_table'   => false,
+                       'props_table' => false,
+               ],
+               'bbpress' => [
+                       'slug'        => 'bbpress',
+                       'name'        => 'bbPress',
+                       'url'         => 'https://bbpress.svn.wordpress.org',
+                       'trac'        => 'https://bbpress.trac.wordpress.org',
+                       'trac_table'  => 'trac_bbpress',
+                       'rev_table'   => false,
+                       'props_table' => false,
+               ],
</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"> 
</span></span></pre></div>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswporgtracwatchertracwatchphp"></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/wporg-trac-watcher/trac-watch.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/wporg-trac-watcher/trac-watch.php        2021-12-15 02:47:05 UTC (rev 11371)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-trac-watcher/trac-watch.php  2021-12-15 04:38:09 UTC (rev 11372)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -89,7 +89,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">        ) ENGINE=InnoDB DEFAULT CHARSET=latin1;";
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        foreach ( SVN\get_svns() as $prefix => $info ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $wpdb->query( sprintf( $trac_table, 'trac_' . $prefix ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( ! empty( $info['trac_table'] ) ) {
+                       $wpdb->query( sprintf( $trac_table, $info['trac_table'] ) );
+               }
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( ! empty( $info['rev_table'] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $wpdb->query( sprintf( $revisions_table, $info['rev_table'] ) );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span></span></pre></div>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswporgtracwatchertracphp"></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/wporg-trac-watcher/trac.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/wporg-trac-watcher/trac.php      2021-12-15 02:47:05 UTC (rev 11371)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-trac-watcher/trac.php        2021-12-15 04:38:09 UTC (rev 11372)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,10 +1,61 @@
</span><span class="cx" style="display: block; padding: 0 10px"> <?php
</span><span class="cx" style="display: block; padding: 0 10px"> namespace WordPressdotorg\Trac\Watcher\Trac;
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+use function WordPressdotorg\Trac\Watcher\SVN\get_svns;
+use SimpleXmlElement;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> add_action( 'import_trac_feeds', function() {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        // Trac RSS feed import from profiles.w.org to be moved here.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       foreach ( get_svns() as $svn ) {
+               if ( empty( $svn['trac'] ) || empty( $svn['trac_table'] ) ) {
+                       continue;
+               }
+
+               import_trac_feed( $svn );
+       }
</ins><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">+function import_trac_feed( $svn ) {
+       global $wpdb;
+
+       $feed_url = $svn['trac'] . '/timeline?ticket=on&changeset=on&milestone=on&wiki=on&max=50&daysback=5&format=rss';
+
+       $feed = wp_remote_retrieve_body( wp_remote_get( $feed_url, array( 'timeout' => 60 ) ) );
+       if ( ! $feed ) {
+               return;
+       }
+
+       $xml = new SimpleXmlElement( $feed );
+       if ( ! isset( $xml->channel->item ) ) {
+               return;
+       }
+
+       $trac_table = $svn['trac_table']; // Not user input, safe.
+
+       foreach ( $xml->channel->item as $item ) {
+               $dc     = $item->children( 'http://purl.org/dc/elements/1.1/' );
+               $md5_id = md5( strip_tags( $item->title . $dc->creator . $item->pubDate ) );
+
+               if ( $wpdb->get_var( $wpdb->prepare( "SELECT md5_id FROM {$trac_table} WHERE md5_id = %s LIMIT 1", $md5_id ) ) ) {
+                       // if this entry is already in our database, that means all the previous ones should be too
+                       break;
+               }
+
+               $wpdb->insert(
+                       $trac_table,
+                       [
+                               'md5_id'      => $md5_id,
+                               'description' => trim( strip_tags( (string) $item->description, '<a><strike>' ) ),
+                               'summary'     => (string) $item->summary,
+                               'category'    => (string) $item->category,
+                               'username'    => (string) $dc->creator,
+                               'link'        => (string) $item->link,
+                               'pubdate'     => gmdate( 'Y-m-d H:i:s', strtotime( (string) $item->pubDate ) ),
+                               'title'       => (string) $item->title,
+                       ]
+               );
+       }
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> function format_trac_markup( $message ) {
</span><span class="cx" style="display: block; padding: 0 10px">        $message = esc_html( $message );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre>
</div>
</div>

</body>
</html>