diff --git a/docs/CLI.md b/docs/CLI.md index 7c5926dc5..cf87c2971 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -16,6 +16,9 @@ Runs plugin check. : Exclude checks provided as an argument in comma-separated values, e.g. i18n_usage, late_escaping. Applies after evaluating `--checks`. +[--ignore-codes=] +: Ignore error codes provided as an argument in comma-separated values. + [--format=] : Format to display the results. Options are table, csv, and json. The default will be a table. --- @@ -57,6 +60,12 @@ By default, `.git`, `vendor` and `node_modules` directories are excluded. [--warning-severity=] : Warning severity level. +[--include-low-severity-errors] +: Include errors with lower severity than the threshold as other type. + +[--include-low-severity-warnings] +: Include warnings with lower severity than the threshold as other type. + [--slug=] : Slug to override the default. ``` diff --git a/includes/CLI/Plugin_Check_Command.php b/includes/CLI/Plugin_Check_Command.php index 3510091f8..4c321ad32 100644 --- a/includes/CLI/Plugin_Check_Command.php +++ b/includes/CLI/Plugin_Check_Command.php @@ -70,6 +70,9 @@ public function __construct( Plugin_Context $plugin_context ) { * : Exclude checks provided as an argument in comma-separated values, e.g. i18n_usage, late_escaping. * Applies after evaluating `--checks`. * + * [--ignore-codes=] + * : Ignore error codes provided as an argument in comma-separated values. + * * [--format=] * : Format to display the results. Options are table, csv, and json. The default will be a table. * --- @@ -155,6 +158,7 @@ public function check( $args, $assoc_args ) { 'include-low-severity-errors' => false, 'include-low-severity-warnings' => false, 'slug' => '', + 'ignore-codes' => '', ) ); @@ -162,6 +166,9 @@ public function check( $args, $assoc_args ) { $plugin = isset( $args[0] ) ? $args[0] : ''; $checks = wp_parse_list( $options['checks'] ); + // Ignore codes. + $ignore_codes = isset( $options['ignore-codes'] ) ? wp_parse_list( $options['ignore-codes'] ) : array(); + // Create the categories array from CLI arguments. $categories = isset( $options['categories'] ) ? wp_parse_list( $options['categories'] ) : array(); @@ -258,6 +265,10 @@ static function ( $dirs ) use ( $excluded_files ) { } $file_results = $this->flatten_file_results( $file_errors, $file_warnings ); + if ( ! empty( $ignore_codes ) ) { + $file_results = $this->get_filtered_results_by_ignore_codes( $file_results, $ignore_codes ); + } + if ( '' !== $error_severity || '' !== $warning_severity ) { $file_results = $this->get_filtered_results_by_severity( $file_results, intval( $error_severity ), intval( $warning_severity ), $include_low_severity_errors, $include_low_severity_warnings ); } @@ -271,6 +282,10 @@ static function ( $dirs ) use ( $excluded_files ) { foreach ( $warnings as $file_name => $file_warnings ) { $file_results = $this->flatten_file_results( array(), $file_warnings ); + if ( ! empty( $ignore_codes ) ) { + $file_results = $this->get_filtered_results_by_ignore_codes( $file_results, $ignore_codes ); + } + if ( '' !== $error_severity || '' !== $warning_severity ) { $file_results = $this->get_filtered_results_by_severity( $file_results, intval( $error_severity ), intval( $warning_severity ), $include_low_severity_errors, $include_low_severity_warnings ); } @@ -666,4 +681,22 @@ private function get_filtered_results_by_severity( $results, $error_severity, $w return array_merge( $errors, $warnings ); } + + /** + * Returns check results filtered by ignore codes. + * + * @since 1.4.0 + * + * @param array $results Check results. + * @param array $ignore_codes Array of error codes to be ignored. + * @return array Filtered results. + */ + private function get_filtered_results_by_ignore_codes( $results, $ignore_codes ) { + return array_filter( + $results, + static function ( $result ) use ( $ignore_codes ) { + return ! in_array( $result['code'], $ignore_codes, true ); + } + ); + } } diff --git a/tests/behat/features/plugin-check.feature b/tests/behat/features/plugin-check.feature index 80c951350..2b2212efd 100644 --- a/tests/behat/features/plugin-check.feature +++ b/tests/behat/features/plugin-check.feature @@ -119,6 +119,36 @@ Feature: Test that the WP-CLI command works. WordPress.Security.EscapeOutput.OutputNotEscaped """ + When I run the WP-CLI command `plugin check foo-single.php --ignore-codes=WordPress.WP.AlternativeFunctions.rand_mt_rand` + Then STDOUT should not contain: + """ + WordPress.WP.AlternativeFunctions.rand_mt_rand + """ + And STDOUT should contain: + """ + WordPress.Security.EscapeOutput.OutputNotEscaped + """ + + When I run the WP-CLI command `plugin check foo-single.php --ignore-codes=WordPress.Security.EscapeOutput.OutputNotEscaped` + Then STDOUT should not contain: + """ + WordPress.Security.EscapeOutput.OutputNotEscaped + """ + And STDOUT should contain: + """ + WordPress.WP.AlternativeFunctions.rand_mt_rand + """ + + When I run the WP-CLI command `plugin check foo-single.php --ignore-codes="WordPress.WP.AlternativeFunctions.rand_mt_rand,WordPress.Security.EscapeOutput.OutputNotEscaped"` + Then STDOUT should not contain: + """ + WordPress.Security.EscapeOutput.OutputNotEscaped + """ + And STDOUT should not contain: + """ + WordPress.WP.AlternativeFunctions.rand_mt_rand + """ + Scenario: Check plugin with special chars in plugin name Given a WP install with the Plugin Check plugin And a wp-content/plugins/johns-post-counter/johns-post-counter.php file: