<!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>[14066] sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/shortcodes/class-upload-handler.php: Plugin Directory: Plugin Check: Make the Slack logs easier to glance through.</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/14066">14066</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/14066","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>2024-09-19 04:16:09 +0000 (Thu, 19 Sep 2024)</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'>Plugin Directory: Plugin Check: Make the Slack logs easier to glance through.
See <a href="http://meta.trac.wordpress.org/ticket/7778">#7778</a>.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginsplugindirectoryshortcodesclassuploadhandlerphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/shortcodes/class-upload-handler.php</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginsplugindirectoryshortcodesclassuploadhandlerphp"></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/plugin-directory/shortcodes/class-upload-handler.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/plugin-directory/shortcodes/class-upload-handler.php 2024-09-18 19:32:40 UTC (rev 14065)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/shortcodes/class-upload-handler.php 2024-09-19 04:16:09 UTC (rev 14066)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -49,6 +49,13 @@
</span><span class="cx" style="display: block; padding: 0 10px"> public $plugin_slug;
</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">+ * The plugin post object, if known.
+ *
+ * @var \WP_Post
+ */
+ public $plugin_post;
+
+ /**
</ins><span class="cx" style="display: block; padding: 0 10px"> * Get set up to run tests on the uploaded plugin.
</span><span class="cx" style="display: block; padding: 0 10px"> */
</span><span class="cx" style="display: block; padding: 0 10px"> public function __construct() {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -85,6 +92,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> $plugin_post = $for_plugin ? get_post( $for_plugin ) : false;
</span><span class="cx" style="display: block; padding: 0 10px"> $updating_existing = (bool) $plugin_post;
</span><span class="cx" style="display: block; padding: 0 10px"> $this->plugin_slug = $plugin_post->post_name ?? '';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $this->plugin_post = $plugin_post;
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> if ( $for_plugin && ! $updating_existing ) {
</span><span class="cx" style="display: block; padding: 0 10px"> return new WP_Error( 'error_upload', __( 'Error in file upload.', 'wporg-plugins' ) );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -484,6 +492,9 @@
</span><span class="cx" style="display: block; padding: 0 10px"> return $plugin_post;
</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">+ // Store it now that we have it.
+ $this->plugin_post = $plugin_post;
+
</ins><span class="cx" style="display: block; padding: 0 10px"> // Record the submitter.
</span><span class="cx" style="display: block; padding: 0 10px"> if ( ! $updating_existing ) {
</span><span class="cx" style="display: block; padding: 0 10px"> Tools::audit_log(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -676,7 +687,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> $output,
</span><span class="cx" style="display: block; padding: 0 10px"> $return_code
</span><span class="cx" style="display: block; padding: 0 10px"> );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $total_time = microtime(1) - $start_time;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $total_time = round( microtime(1) - $start_time, 1 );
</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"> * Anything that plugin-check outputs that we want to discard completely.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -739,33 +750,60 @@
</span><span class="cx" style="display: block; padding: 0 10px"> );
</span><span class="cx" style="display: block; padding: 0 10px"> if ( $results ) {
</span><span class="cx" style="display: block; padding: 0 10px"> $html .= '<ul class="pc-result" style="list-style: disc">';
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- foreach ( $results as $result ) {
- $html .= sprintf(
- '<li>%s <a href="%s">%s</a>: %s</li>',
- esc_html( $result['file'] ),
- esc_url( $result['docs'] ?? '' ),
- esc_html( $result['type'] . ' ' . $result['code'] ),
- esc_html( $result['message'] )
- );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Display errors, and then warnings.
+ foreach ( [ wp_list_filter( $results, [ 'type' => 'ERROR' ] ), wp_list_filter( $results, [ 'type' => 'ERROR' ], 'NOT' ) ] as $result_set ) {
+ foreach ( $result_set as $result ) {
+ $html .= sprintf(
+ '<li>%s <a href="%s">%s</a>: %s</li>',
+ esc_html( $result['file'] ),
+ esc_url( $result['docs'] ?? '' ),
+ esc_html( $result['type'] . ' ' . $result['code'] ),
+ esc_html( $result['message'] )
+ );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> $html .= '</ul>';
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> $html .= __( 'Note: While the automated plugin scan is based on the Plugin Review Guidelines, it is not a complete review. A successful result from the scan does not guarantee that the plugin will be approved, only that it is sufficient to be reviewed. All submitted plugins are checked manually to ensure they meet security and guideline standards before approval.', 'wporg-plugins' );
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // If the upload is blocked; log it.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // If the upload is blocked; log it to slack.
</ins><span class="cx" style="display: block; padding: 0 10px"> if ( ! $verdict || true ) { // TODO: Temporarily logging all to slack, as it's not output to the submitter.
</span><span class="cx" style="display: block; padding: 0 10px"> // Slack dm the logs.
</span><span class="cx" style="display: block; padding: 0 10px"> $zip_name = reset( $_FILES )['name'];
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $failpass = $verdict ? 'passed' : 'failed';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $failpass = $verdict ? ':white_check_mark: passed' : ':x: failed';
</ins><span class="cx" style="display: block; padding: 0 10px"> if ( $return_code > 1 ) { // TODO: Temporary, as we're always hitting this branch.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $failpass = ' errored: ' . $return_code;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $failpass = ' :rotating_light: errored: ' . $return_code;
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $text = "Plugin check {$failpass} for {$zip_name}: {$this->plugin['Name']} ({$this->plugin_slug}) took {$total_time}s\n";
</del><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- // List the errors, then the warnings (which may be truncated).
- foreach ( [ wp_list_filter( $results, [ 'type' => 'ERROR' ] ), wp_list_filter( $results, [ 'type' => 'ERROR' ], 'NOT' ) ] as $result_set ) {
- foreach ( $result_set as $result ) {
- $text .= " - {$result['file']}: {$result['type']} - {$result['code']}: {$result['message']}\n";
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $plugin_name_slug = $this->plugin['Name'] . ' (' . $this->plugin_slug . ')';
+ // If we have a post object, link to it.
+ if ( $this->plugin_post ) {
+ $edit_post_link = admin_url( 'post.php?post=' . $this->plugin_post->ID . '&action=edit' ); // Can't use get_edit_post_link() as the user can't edit the post.
+ $plugin_name_slug = "<{$edit_post_link}|{$plugin_name_slug}>";
+ }
+
+ $text = "{$failpass} for {$zip_name}: {$plugin_name_slug} took {$total_time}s\n";
+
+ // Include a simplified / merged version of the results for review.
+ $group_by_code = [ 'ERROR' => [], 'WARNING' => [] ];
+ foreach ( $results as $result ) {
+ $group_by_code[ $result['type'] ][ $result['code'] ] ??= [];
+ $group_by_code[ $result['type'] ][ $result['code'] ][] = $result;
+ }
+ foreach ( $group_by_code as $type => $codes ) {
+ foreach ( $codes as $code_results ) {
+ $text .= "• *{$type}: {$code_results[0]['code']}*";
+ if ( 1 === count( $code_results ) ) {
+ $text .= ": {$code_results[0]['message']}\n";
+ } else {
+ $text .= "\n";
+ foreach ( array_unique( wp_list_pluck( $code_results, 'message' ) ) as $i => $message ) {
+ $multiplier = count( wp_list_filter( $code_results, [ 'message' => $message ] ) );
+ $multiplier = $multiplier > 1 ? " {$multiplier}x" : '';
+
+ $text .= " {$i}. {$multiplier} {$message}\n";
+ }
+ }
</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 class="lines" style="display: block; padding: 0 10px; color: #888">@@ -773,7 +811,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> } elseif ( $return_code ) {
</span><span class="cx" style="display: block; padding: 0 10px"> // Log plugin-check timing out.
</span><span class="cx" style="display: block; padding: 0 10px"> $zip_name = reset( $_FILES )['name'];
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $text = "Plugin check error {$return_code} for {$zip_name}: {$this->plugin['Name']} ({$this->plugin_slug}) took {$total_time}s\n";
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $text = ":rotating_light: Error: {$return_code} for {$zip_name}: {$this->plugin['Name']} ({$this->plugin_slug}) took {$total_time}s\n";
</ins><span class="cx" style="display: block; padding: 0 10px"> notify_slack( PLUGIN_CHECK_LOGS_SLACK_CHANNEL, $text, wp_get_current_user(), true );
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span></span></pre>
</div>
</div>
</body>
</html>