diff --git a/docs/pages/pmd/userdocs/cli_reference.md b/docs/pages/pmd/userdocs/cli_reference.md index c616c1847b..a74766610f 100644 --- a/docs/pages/pmd/userdocs/cli_reference.md +++ b/docs/pages/pmd/userdocs/cli_reference.md @@ -80,6 +80,11 @@ The tool comes with a rather extensive help text, simply running with `--help`! The valid values are the standard character sets of `java.nio.charset.Charset`." default="UTF-8" %} + {% include custom/cli_option_row.html options="--[no-]fail-on-processing-error" + description="Specifies whether PMD exits with non-zero status if processing errors occurred. + By default PMD exits with status 5 if processing errors or violations are found. + Disable this option with `--no-fail-on-processing-error` to exit with 0 instead and just write the report." + %} {% include custom/cli_option_row.html options="--[no-]fail-on-violation" description="Specifies whether PMD exits with non-zero status if violations are found. By default PMD exits with status 4 if violations are found. @@ -208,16 +213,23 @@ Or you can set the environment variable `CLASSPATH` before starting PMD, e.g. ## Exit Status -Please note that if PMD detects any violations, it will exit with status 4 (since 5.3). +Please note that if PMD detects any violations, it will exit with status 4 (since 5.3) or 5 (since 7.2.0). This behavior has been introduced to ease PMD integration into scripts or hooks, such as SVN hooks.
0 | Everything is fine, no violations found. |
0 | Everything is fine, no violations found and no processing error occurred. |
1 | PMD exited with an exception. |
2 | Usage error. Command-line parameters are invalid or missing. |
4 | At least one violation has been detected, unless --no-fail-on-violation is set. |
4 | At least one violation has been detected, unless --no-fail-on-violation is set.Since PMD 5.3. |
5 | At least one processing error has occurred. There might be additionally zero or more violations detected.
+ To ignore processing errors, use --no-fail-on-processing-error .Since PMD 7.2.0. |
0 | Everything is fine, no code duplications found. |
0 | Everything is fine, no code duplications found and no processing errors occurred. |
1 | CPD exited with an exception. |
2 | Usage error. Command-line parameters are invalid or missing. |
4 | At least one code duplication has been detected unless --no-fail-on-violation is set. |
4 | At least one code duplication has been detected unless --no-fail-on-violation is set.Since PMD 5.0. |
5 | At least one processing error has occurred. There might be additionally zero or more duplications detected.
+ To ignore processing errors, use --no-fail-on-processing-error .Since PMD 7.2.0. |
This is only returned if {@link PMDConfiguration#isFailOnViolation()} + *
This is only returned if {@link AbstractConfiguration#isFailOnViolation()} * is set. It can be disabled by using CLI flag {@code --no-fail-on-violation}. */ VIOLATIONS_FOUND(4), /** - * PMD did run, but there were either duplications/violations - * or processing errors or both. + * PMD did run, but there was at least one processing error. There + * might be additionally duplications or violations. This is exit code {@code 5}. * - *
In case you find processing errors: Please report them
- * - *If cli flag --no-fail-on-processing-errors is used, then this - * exit code is not used. In such case, either 0 or 4 is returned.
+ *This is only returned if {@link AbstractConfiguration#isFailOnProcessingError()} + * is set. It can be disabled by using CLI flag {@code --no-fail-on-processing-error}. */ - VIOLATIONS_OR_PROCESSING_ERRORS(5); + PROCESSING_ERRORS_OR_VIOLATIONS(5); private final int exitCode; @@ -57,7 +55,7 @@ public enum CliExitCode { case 1: return ERROR; case 2: return USAGE_ERROR; case 4: return VIOLATIONS_FOUND; - case 5: return VIOLATIONS_OR_PROCESSING_ERRORS; + case 5: return PROCESSING_ERRORS_OR_VIOLATIONS; default: throw new IllegalArgumentException("Not a known exit code: " + i); } diff --git a/pmd-cli/src/test/java/net/sourceforge/pmd/cli/CpdCliTest.java b/pmd-cli/src/test/java/net/sourceforge/pmd/cli/CpdCliTest.java index 6597b4c414..5f76af32f8 100644 --- a/pmd-cli/src/test/java/net/sourceforge/pmd/cli/CpdCliTest.java +++ b/pmd-cli/src/test/java/net/sourceforge/pmd/cli/CpdCliTest.java @@ -6,7 +6,7 @@ package net.sourceforge.pmd.cli; import static net.sourceforge.pmd.cli.internal.CliExitCode.OK; import static net.sourceforge.pmd.cli.internal.CliExitCode.VIOLATIONS_FOUND; -import static net.sourceforge.pmd.cli.internal.CliExitCode.VIOLATIONS_OR_PROCESSING_ERRORS; +import static net.sourceforge.pmd.cli.internal.CliExitCode.PROCESSING_ERRORS_OR_VIOLATIONS; import static net.sourceforge.pmd.util.CollectionUtil.listOf; import static org.hamcrest.CoreMatchers.startsWith; import static org.hamcrest.Matchers.containsString; @@ -129,14 +129,14 @@ class CpdCliTest extends BaseCliTest { @Test void testWrongCliOptionResultsInErrorLoggingAfterDir() throws Exception { // --ignore-identifiers doesn't take an argument anymore - it is interpreted as a file for inputPaths - final CliExecutionResult result = runCli(VIOLATIONS_OR_PROCESSING_ERRORS, "--minimum-tokens", "34", "--dir", SRC_DIR, "--ignore-identifiers", "false"); + final CliExecutionResult result = runCli(PROCESSING_ERRORS_OR_VIOLATIONS, "--minimum-tokens", "34", "--dir", SRC_DIR, "--ignore-identifiers", "false"); result.checkStdErr(containsString("No such file false")); } @Test void testWrongCliOptionResultsInErrorLoggingBeforeDir() throws Exception { // --ignore-identifiers doesn't take an argument anymore - it is interpreted as a file for inputPaths - final CliExecutionResult result = runCli(VIOLATIONS_OR_PROCESSING_ERRORS, "--minimum-tokens", "34", "--ignore-identifiers", "false", "--dir", SRC_DIR); + final CliExecutionResult result = runCli(PROCESSING_ERRORS_OR_VIOLATIONS, "--minimum-tokens", "34", "--ignore-identifiers", "false", "--dir", SRC_DIR); result.checkStdErr(containsString("No such file false")); } @@ -221,7 +221,7 @@ class CpdCliTest extends BaseCliTest { */ @Test void testSkipLexicalErrors() throws Exception { - runCli(VIOLATIONS_OR_PROCESSING_ERRORS, + runCli(PROCESSING_ERRORS_OR_VIOLATIONS, "--minimum-tokens", "10", "-d", BASE_RES_PATH + "badandgood/", "--format", "text", @@ -234,7 +234,7 @@ class CpdCliTest extends BaseCliTest { @Test void testExitCodeWithLexicalErrors() throws Exception { - runCli(VIOLATIONS_OR_PROCESSING_ERRORS, + runCli(PROCESSING_ERRORS_OR_VIOLATIONS, "--minimum-tokens", "10", "-d", Paths.get(BASE_RES_PATH, "badandgood", "BadFile.java").toString(), "--format", "text") @@ -259,7 +259,7 @@ class CpdCliTest extends BaseCliTest { @Test void testExitCodeWithLexicalErrorsAndSkipLexical() throws Exception { - runCli(VIOLATIONS_OR_PROCESSING_ERRORS, + runCli(PROCESSING_ERRORS_OR_VIOLATIONS, "--minimum-tokens", "10", "-d", Paths.get(BASE_RES_PATH, "badandgood", "BadFile.java").toString(), "--format", "text", diff --git a/pmd-cli/src/test/java/net/sourceforge/pmd/cli/PmdCliTest.java b/pmd-cli/src/test/java/net/sourceforge/pmd/cli/PmdCliTest.java index 36a19974a5..361c4891af 100644 --- a/pmd-cli/src/test/java/net/sourceforge/pmd/cli/PmdCliTest.java +++ b/pmd-cli/src/test/java/net/sourceforge/pmd/cli/PmdCliTest.java @@ -8,7 +8,7 @@ import static net.sourceforge.pmd.cli.internal.CliExitCode.ERROR; import static net.sourceforge.pmd.cli.internal.CliExitCode.OK; import static net.sourceforge.pmd.cli.internal.CliExitCode.USAGE_ERROR; import static net.sourceforge.pmd.cli.internal.CliExitCode.VIOLATIONS_FOUND; -import static net.sourceforge.pmd.cli.internal.CliExitCode.VIOLATIONS_OR_PROCESSING_ERRORS; +import static net.sourceforge.pmd.cli.internal.CliExitCode.PROCESSING_ERRORS_OR_VIOLATIONS; import static net.sourceforge.pmd.util.CollectionUtil.listOf; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; @@ -321,7 +321,7 @@ class PmdCliTest extends BaseCliTest { @Test void exitStatusWithProcessingErrors() throws Exception { - runCli(VIOLATIONS_OR_PROCESSING_ERRORS, "--use-version", "dummy-parserThrows", + runCli(PROCESSING_ERRORS_OR_VIOLATIONS, "--use-version", "dummy-parserThrows", "-d", srcDir.toString(), "-f", "text", "-R", RULESET_WITH_VIOLATION) .verify(r -> { r.checkStdOut(containsString("someSource.dummy\t-\tParseException: Parse exception: ohio")); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/AbstractConfiguration.java b/pmd-core/src/main/java/net/sourceforge/pmd/AbstractConfiguration.java index b4b0c68332..1118b97d85 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/AbstractConfiguration.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/AbstractConfiguration.java @@ -384,7 +384,12 @@ public abstract class AbstractConfiguration { * Whether PMD should exit with status 4 (the default behavior, true) if * violations are found or just with 0 (to not break the build, e.g.). * + *
Note: If additionally processing errors occurred, the exit status is 5. See + * {@link #isFailOnProcessingError()}. + * * @return failOnViolation + * + * @see #isFailOnProcessingError() */ public boolean isFailOnViolation() { return failOnViolation; @@ -394,17 +399,43 @@ public abstract class AbstractConfiguration { * Sets whether PMD should exit with status 4 (the default behavior, true) * if violations are found or just with 0 (to not break the build, e.g.). * - * @param failOnViolation - * failOnViolation + *
Note: If additionally processing errors occurred, the exit status is 5. See + * {@link #isFailOnProcessingError()}. + * + * @param failOnViolation whether to exit with 4 and fail the build if violations are found. + * + * @see #isFailOnProcessingError() */ public void setFailOnViolation(boolean failOnViolation) { this.failOnViolation = failOnViolation; } + /** + * Whether PMD should exit with status 5 (the default behavior, true) if + * processing errors occurred or just with 0 (to not break the build, e.g.). + * + *
Note: If additionally violations are found, the exist status is 4. See + * {@link #isFailOnViolation()}. + * + * @return failOnProcessingError + * + * @see #isFailOnViolation() + */ public boolean isFailOnProcessingError() { return failOnProcessingError; } + /** + * Sets whether PMD should exit with status 5 (the default behavior, true) + * if processing errors occurred or just with 0 (to not break the build, e.g.). + * + *
Note: If additionally violations are found, the exist status is 4. See + * {@link #isFailOnViolation()}. + * + * @param failOnProcessingError whether to exit with 5 and fail the build if processing errors occurred. + * + * @see #isFailOnViolation() + */ public void setFailOnProcessingError(boolean failOnProcessingError) { this.failOnProcessingError = failOnProcessingError; }