From e6104f1fed5078fcb411422876fa19afc53fd8bd Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 12 Apr 2024 00:12:40 -0700 Subject: [PATCH 01/65] Bumped workflows actions to latest versions --- .github/workflows/bld.yml | 4 ++-- .github/workflows/pages.yml | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index 422b9cc..3c9d30a 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -12,12 +12,12 @@ jobs: steps: - name: Checkout source repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up JDK ${{ matrix.java-version }} - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: "zulu" java-version: ${{ matrix.java-version }} diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 2120d4c..e191f6d 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -30,14 +30,14 @@ jobs: steps: - name: Checkout source repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - distribution: 'zulu' + distribution: "zulu" java-version: 17 - name: Build Javadocs @@ -50,8 +50,8 @@ jobs: uses: actions/upload-pages-artifact@v1 with: # Upload generated Javadocs repository - path: 'build/javadoc/' + path: "build/javadoc/" - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v1 \ No newline at end of file + uses: actions/deploy-pages@v1 From 40dd2ce116db4c499b6892ff0f3c2c04bdd75b13 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 12 Apr 2024 00:13:37 -0700 Subject: [PATCH 02/65] Log if execution was successful --- .../rife/bld/extension/DetektOperation.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index 3ed4d2e..359037f 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -18,8 +18,11 @@ package rife.bld.extension; import rife.bld.BaseProject; import rife.bld.operations.AbstractProcessOperation; +import rife.bld.operations.exceptions.ExitStatusException; +import rife.tools.exceptions.FileUtilsErrorException; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -241,6 +244,22 @@ public class DetektOperation extends AbstractProcessOperation { return this; } + /** + * Performs the operation. + * + * @throws InterruptedException when the operation was interrupted + * @throws IOException when an exception occurred during the execution of the process + * @throws FileUtilsErrorException when an exception occurred during the retrieval of the operation output + * @throws ExitStatusException when the exit status was changed during the operation + */ + @Override + public void execute() throws IOException, FileUtilsErrorException, InterruptedException, ExitStatusException { + super.execute(); + if (successful_ && LOGGER.isLoggable(Level.INFO)) { + LOGGER.info("Detekt executed successfully."); + } + } + /** * Part of the {@link #execute} operation, constructs the command list * to use for building the process. From 5f33e4263c7d8bed71a77ab6051af219950cc9c2 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 17 Apr 2024 22:36:26 -0700 Subject: [PATCH 03/65] Bumped to version 0.9.4-SNAPSHOT --- config/pmd.xml | 11 +++++------ .../java/rife/bld/extension/DetektOperationBuild.java | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/config/pmd.xml b/config/pmd.xml index cb0b643..3d3203c 100644 --- a/config/pmd.xml +++ b/config/pmd.xml @@ -19,15 +19,15 @@ + - + - @@ -35,8 +35,9 @@ - + + @@ -52,8 +53,6 @@ - - @@ -107,4 +106,4 @@ - \ No newline at end of file + diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 36e7dea..207a826 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -34,7 +34,7 @@ public class DetektOperationBuild extends Project { public DetektOperationBuild() { pkg = "rife.bld.extension"; name = "DetektOperation"; - version = version(0, 9, 3); + version = version(0, 9, 4, "SNAPSHOT"); javaRelease = 17; downloadSources = true; @@ -72,7 +72,7 @@ public class DetektOperationBuild extends Project { .license( new PublishLicense() .name("The Apache License, Version 2.0") - .url("http://www.apache.org/licenses/LICENSE-2.0.txt") + .url("https://www.apache.org/licenses/LICENSE-2.0.txt") ) .scm( new PublishScm() From a4d443d26bb90380cbcbf9e021be8b4edd53fec4 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 17 Apr 2024 22:41:34 -0700 Subject: [PATCH 04/65] Bumped Detekt extension to 0.9.4-SNAPSHOT --- examples/lib/bld/bld-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 7e4c965..4686623 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,7 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.extensions=com.uwyn.rife2:bld-kotlin:0.9.3 -bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.3 +bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.4-SNAPSHOT bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.downloadLocation= bld.sourceDirectories= From 4db7553ca1768333bea082ec25cbea556e625860 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 9 May 2024 21:01:01 -0700 Subject: [PATCH 05/65] Bumped bld to version 1.9.1 --- .idea/libraries/bld.xml | 4 ++-- .vscode/settings.json | 2 +- examples/.idea/libraries/bld.xml | 4 ++-- examples/.vscode/settings.json | 2 +- examples/lib/bld/bld-wrapper.jar | Bin 27319 -> 27319 bytes examples/lib/bld/bld-wrapper.properties | 4 ++-- lib/bld/bld-wrapper.jar | Bin 27319 -> 27319 bytes lib/bld/bld-wrapper.properties | 2 +- .../bld/extension/DetektOperationBuild.java | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.idea/libraries/bld.xml b/.idea/libraries/bld.xml index 0b615c1..a2969be 100644 --- a/.idea/libraries/bld.xml +++ b/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/.vscode/settings.json b/.vscode/settings.json index 9e8368e..d136e4d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,7 @@ ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-1.9.0.jar", + "${HOME}/.bld/dist/bld-1.9.1.jar", "lib/**/*.jar" ] } diff --git a/examples/.idea/libraries/bld.xml b/examples/.idea/libraries/bld.xml index 0b615c1..a2969be 100644 --- a/examples/.idea/libraries/bld.xml +++ b/examples/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index 9e8368e..d136e4d 100644 --- a/examples/.vscode/settings.json +++ b/examples/.vscode/settings.json @@ -9,7 +9,7 @@ ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-1.9.0.jar", + "${HOME}/.bld/dist/bld-1.9.1.jar", "lib/**/*.jar" ] } diff --git a/examples/lib/bld/bld-wrapper.jar b/examples/lib/bld/bld-wrapper.jar index 82762f1dd24fca63ea5add2e5d08292f16e8a107..e188fc7daeda7d4eeda518a048aee20ce8faa097 100644 GIT binary patch delta 166 zcmdmfm2vx3M&1B#W)=|!4h{~6H{FXT^42i}sf~R~#vpq0X5(%qFvHP|T@TFgPC3sA zX2_-)f~6)0W+*DMFa&tBbLeNj&1Pp{U| Date: Thu, 9 May 2024 21:01:33 -0700 Subject: [PATCH 06/65] Bumped PMD extension to version 0.9.9 --- lib/bld/bld-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index a8bd9cf..56cd8a5 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -1,6 +1,6 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true -bld.extension-pmd=com.uwyn.rife2:bld-pmd:0.9.8 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:0.9.9 bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.downloadLocation= bld.sourceDirectories= From 1523e0a2b72c832eda0bf67bf873dc2c237d6c11 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 9 May 2024 21:02:09 -0700 Subject: [PATCH 07/65] Bumped Kotlin to version 1.9.24 --- examples/src/bld/java/com/example/ExampleBuild.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index 96c33ff..9c02b47 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -31,7 +31,7 @@ public class ExampleBuild extends Project { repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES); - final var kotlin = version(1, 9, 23); + final var kotlin = version(1, 9, 24); scope(compile) .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin)); scope(test) From 251425c625deda78267429cf198c6674c312afd8 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 9 May 2024 21:02:32 -0700 Subject: [PATCH 08/65] Updated bld badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b1abb9..c983fff 100755 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Java](https://img.shields.io/badge/java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) -[![bld](https://img.shields.io/badge/1.9.0-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) +[![bld](https://img.shields.io/badge/1.9.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) [![Release](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/releases/com/uwyn/rife2/bld-detekt/maven-metadata.xml?color=blue)](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-detekt) [![Snapshot](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/snapshots/com/uwyn/rife2/bld-detekt/maven-metadata.xml?label=snapshot)](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-detekt) [![GitHub CI](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml/badge.svg)](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml) From 6946a3c26d3263fe308437d6e35c54cc8f56c9a0 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 11 May 2024 15:09:16 -0700 Subject: [PATCH 09/65] Log if baseline generation was successful --- src/main/java/rife/bld/extension/DetektOperation.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index 359037f..7541107 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -256,7 +256,12 @@ public class DetektOperation extends AbstractProcessOperation { public void execute() throws IOException, FileUtilsErrorException, InterruptedException, ExitStatusException { super.execute(); if (successful_ && LOGGER.isLoggable(Level.INFO)) { - LOGGER.info("Detekt executed successfully."); + if (createBaseline_) { + LOGGER.info("Detekt baseline successfully generated: " + + "file://" + new File(baseline_).toURI().getPath()); + } else { + LOGGER.info("Detekt executed successfully."); + } } } From 154359e0cd2f36bb1fe8b9ffe3dc4ebf98854526 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 12 May 2024 17:24:13 -0700 Subject: [PATCH 10/65] Version 0.9.4 --- examples/lib/bld/bld-wrapper.properties | 2 +- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 5 ++--- src/main/java/rife/bld/extension/DetektReport.java | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 3ef531b..dfa1d5b 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,7 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.extensions=com.uwyn.rife2:bld-kotlin:0.9.4 -bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.4-SNAPSHOT +bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.4 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.downloadLocation= bld.sourceDirectories= diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index bc64872..6c87b41 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -34,7 +34,7 @@ public class DetektOperationBuild extends Project { public DetektOperationBuild() { pkg = "rife.bld.extension"; name = "DetektOperation"; - version = version(0, 9, 4, "SNAPSHOT"); + version = version(0, 9, 4); javaRelease = 17; downloadSources = true; @@ -88,12 +88,11 @@ public class DetektOperationBuild extends Project { new DetektOperationBuild().start(args); } - @BuildCommand(summary = "Check source code with PMD") + @BuildCommand(summary = "Checks source code with PMD") public void pmd() { new PmdOperation() .fromProject(this) .ruleSets("config/pmd.xml") .execute(); } - } diff --git a/src/main/java/rife/bld/extension/DetektReport.java b/src/main/java/rife/bld/extension/DetektReport.java index 183a71d..0560f3d 100644 --- a/src/main/java/rife/bld/extension/DetektReport.java +++ b/src/main/java/rife/bld/extension/DetektReport.java @@ -17,7 +17,7 @@ package rife.bld.extension; /** - * Defines a report for given report-id to be stores in the given path. + * Defines a report for the given report-id to be stored on the given path. * * @param id the report-id * @param path the given path From 0a716260ac7e9b7914df33dd7cda69a8d08ffcc9 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 23 May 2024 21:52:42 -0700 Subject: [PATCH 11/65] Normalized execution logging messages --- src/main/java/rife/bld/extension/DetektOperation.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index 7541107..6104037 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -257,10 +257,10 @@ public class DetektOperation extends AbstractProcessOperation { super.execute(); if (successful_ && LOGGER.isLoggable(Level.INFO)) { if (createBaseline_) { - LOGGER.info("Detekt baseline successfully generated: " + LOGGER.info("Detekt baseline generated successfully: " + "file://" + new File(baseline_).toURI().getPath()); } else { - LOGGER.info("Detekt executed successfully."); + LOGGER.info("Detekt operation finished successfully."); } } } From 833eddf28cfded72a757ebd509b0b9a079cbc4fc Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 23 May 2024 22:05:56 -0700 Subject: [PATCH 12/65] Bumped Kotlin to version 2.0.0 --- examples/lib/bld/bld-wrapper.properties | 2 +- examples/src/bld/java/com/example/ExampleBuild.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index dfa1d5b..7a088fe 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,6 +1,6 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true -bld.extensions=com.uwyn.rife2:bld-kotlin:0.9.4 +bld.extensions=com.uwyn.rife2:bld-kotlin:0.9.7 bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.4 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.downloadLocation= diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index 9c02b47..32e06e4 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -31,7 +31,7 @@ public class ExampleBuild extends Project { repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES); - final var kotlin = version(1, 9, 24); + final var kotlin = version(2, 0, 0); scope(compile) .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin)); scope(test) From 61c200ee541844c71f9d8fa4c27d442ee6c80213 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 26 May 2024 17:39:06 -0700 Subject: [PATCH 13/65] Bumped assertj-core to version 3.26.0 --- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 6c87b41..1c830e1 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -47,7 +47,7 @@ public class DetektOperationBuild extends Project { scope(test) .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 2))) .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 2))) - .include(dependency("org.assertj", "assertj-core", version(3, 25, 3))); + .include(dependency("org.assertj", "assertj-core", version(3, 26, 0))); javadocOperation() .javadocOptions() .author() From 6fa52100ecaa47bbfbcd90df6b1434a3ea90a9c9 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 26 May 2024 17:59:39 -0700 Subject: [PATCH 14/65] Added test for all parameters --- .idea/misc.xml | 14 ---- .../bld/extension/DetektOperationBuild.java | 2 +- .../rife/bld/extension/DetektOperation.java | 2 +- .../bld/extension/DetektOperationTest.java | 69 +++++++++++++++++++ 4 files changed, 71 insertions(+), 16 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 22c7683..cf8a3be 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,20 +3,6 @@ - - - diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 1c830e1..15bf2ff 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -34,7 +34,7 @@ public class DetektOperationBuild extends Project { public DetektOperationBuild() { pkg = "rife.bld.extension"; name = "DetektOperation"; - version = version(0, 9, 4); + version = version(0, 9, 5, "SNAPSHOT"); javaRelease = 17; downloadSources = true; diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index 6104037..6db96db 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -402,7 +402,7 @@ public class DetektOperation extends AbstractProcessOperation { // report if (!report_.isEmpty()) { report_.forEach(it -> { - args.add("-r"); + args.add("--report"); args.add(it.id().name().toLowerCase() + ":" + it.path()); }); } diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index dd3e4f4..26e42e6 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -18,6 +18,7 @@ package rife.bld.extension; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import rife.bld.BaseProject; import rife.bld.blueprints.BaseProjectBlueprint; import rife.bld.operations.exceptions.ExitStatusException; @@ -57,6 +58,74 @@ class DetektOperationTest { } } + @Test + void testCheckAllParameters() { + var params = List.of( + "--all-rules", + "--auto-correct", + "--base-path", + "--baseline", + "--build-upon-default-config", + "--classpath", + "--config", + "--config-resource", + "--create-baseline", + "--debug", + "--disable-default-rulesets", + "--excludes", + "--generate-config", + "--includes", + "--input", + "--jdk-home", + "--jvm-target", + "--language-version", + "--max-issues", + "--parallel", + "--plugins", + "--report" + ); + + var args = new DetektOperation() + .fromProject(new BaseProject()) + .allRules(true) + .autoCorrect(true) + .basePath("basePath") + .baseline("baseline") + .buildUponDefaultConfig(true) + .classPath("classpath") + .classPath(List.of("path2", "path3")) + .config("config") + .config(List.of("config2", "config4")) + .configResource("configResource") + .createBaseline(true) + .debug(true) + .disableDefaultRuleSets(true) + .excludes("excludes") + .generateConfig(true) + .includes("patterns") + .input("input") + .jdkHome("jdkHome") + .jvmTarget("jvmTarget") + .languageVersion("languageVersion") + .maxIssues(10) + .parallel(true) + .plugins("jars") + .plugins(List.of("jars2", "jar3")) + .report(new DetektReport(DetektReportId.HTML, "reports")) + .executeConstructProcessCommandList(); + + for (var p : params) { + var found = false; + for (var a : args) { + if (a.startsWith(p)) { + found = true; + break; + } + } + assertThat(found).as(p + " not found.").isTrue(); + } + } + @Test void testExampleBaseline() throws IOException, ExitStatusException, InterruptedException { var tmpDir = Files.createTempDirectory("bld-detekt-").toFile(); From 32e95b2efa2c197c4f2e6775280827a61e8123a4 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 26 May 2024 22:25:58 -0700 Subject: [PATCH 15/65] Bumped Kotlin extension to version 0.9.8 --- examples/lib/bld/bld-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 7a088fe..3e7152d 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,6 +1,6 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true -bld.extensions=com.uwyn.rife2:bld-kotlin:0.9.7 +bld.extensions=com.uwyn.rife2:bld-kotlin:0.9.8 bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.4 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.downloadLocation= From 1e62bc3fba6bc2487f27e58a0f3cc2842471ed68 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 27 May 2024 16:12:39 -0700 Subject: [PATCH 16/65] Added script to list parameters --- cliargs.sh | 8 ++++++++ src/test/java/rife/bld/extension/DetektOperationTest.java | 3 +-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100755 cliargs.sh diff --git a/cliargs.sh b/cliargs.sh new file mode 100755 index 0000000..3ad0820 --- /dev/null +++ b/cliargs.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +java -cp "lib/compile/*:examples/lib/bld/*" io.gitlab.arturbosch.detekt.cli.Main --help |\ +grep "^ --.*" |\ +sed -e "s/ /\"/" -e "s/, .*//" -e "s/$/\",/" -e '/version/d' -e '/help/d' |\ +sort |\ +sed -e '$s/,//' + diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index 26e42e6..f3bfb55 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -63,8 +63,8 @@ class DetektOperationTest { var params = List.of( "--all-rules", "--auto-correct", - "--base-path", "--baseline", + "--base-path", "--build-upon-default-config", "--classpath", "--config", @@ -78,7 +78,6 @@ class DetektOperationTest { "--input", "--jdk-home", "--jvm-target", - "--language-version", "--max-issues", "--parallel", "--plugins", From 7413565d87def41791ba184d222e7b756ef217a7 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 27 May 2024 20:55:00 -0700 Subject: [PATCH 17/65] Read parameters from resource file --- cliargs.sh | 4 +-- .../bld/extension/DetektOperationTest.java | 29 ++++--------------- src/test/resources/detekt-args.txt | 21 ++++++++++++++ 3 files changed, 28 insertions(+), 26 deletions(-) create mode 100644 src/test/resources/detekt-args.txt diff --git a/cliargs.sh b/cliargs.sh index 3ad0820..c8b56e2 100755 --- a/cliargs.sh +++ b/cliargs.sh @@ -2,7 +2,7 @@ java -cp "lib/compile/*:examples/lib/bld/*" io.gitlab.arturbosch.detekt.cli.Main --help |\ grep "^ --.*" |\ -sed -e "s/ /\"/" -e "s/, .*//" -e "s/$/\",/" -e '/version/d' -e '/help/d' |\ +sed -e "s/ //" -e "s/, .*//" -e '/version/d' -e '/help/d' |\ sort |\ -sed -e '$s/,//' +sed -e '$s/,//' > "src/test/resources/detekt-args.txt" diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index f3bfb55..c368d19 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -25,6 +25,7 @@ import rife.bld.operations.exceptions.ExitStatusException; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Paths; import java.util.List; import java.util.Objects; import java.util.logging.ConsoleHandler; @@ -59,30 +60,10 @@ class DetektOperationTest { } @Test - void testCheckAllParameters() { - var params = List.of( - "--all-rules", - "--auto-correct", - "--baseline", - "--base-path", - "--build-upon-default-config", - "--classpath", - "--config", - "--config-resource", - "--create-baseline", - "--debug", - "--disable-default-rulesets", - "--excludes", - "--generate-config", - "--includes", - "--input", - "--jdk-home", - "--jvm-target", - "--max-issues", - "--parallel", - "--plugins", - "--report" - ); + void testCheckAllParameters() throws IOException { + var params = Files.readAllLines(Paths.get("src", "test", "resources", "detekt-args.txt")); + + assertThat(params).isNotEmpty(); var args = new DetektOperation() .fromProject(new BaseProject()) diff --git a/src/test/resources/detekt-args.txt b/src/test/resources/detekt-args.txt new file mode 100644 index 0000000..b804831 --- /dev/null +++ b/src/test/resources/detekt-args.txt @@ -0,0 +1,21 @@ +--all-rules +--auto-correct +--baseline +--base-path +--build-upon-default-config +--classpath +--config +--config-resource +--create-baseline +--debug +--disable-default-rulesets +--excludes +--generate-config +--includes +--input +--jdk-home +--jvm-target +--max-issues +--parallel +--plugins +--report From be15297cc55a540b0616ea0a37919ab83c1fb6ea Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 28 May 2024 13:54:33 -0700 Subject: [PATCH 18/65] Execute cliargs script before running tests --- checkcliargs.sh | 12 ------------ lib/bld/bld-wrapper.properties | 1 + scripts/checkcliargs.sh | 12 ++++++++++++ cliargs.sh => scripts/cliargs.sh | 0 .../rife/bld/extension/DetektOperationBuild.java | 11 +++++++++++ .../java/rife/bld/extension/DetektOperationTest.java | 10 +++++----- 6 files changed, 29 insertions(+), 17 deletions(-) delete mode 100755 checkcliargs.sh create mode 100755 scripts/checkcliargs.sh rename cliargs.sh => scripts/cliargs.sh (100%) diff --git a/checkcliargs.sh b/checkcliargs.sh deleted file mode 100755 index 9f49d61..0000000 --- a/checkcliargs.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -MAIN="io.gitlab.arturbosch.detekt.cli.Main" -TMPNEW=/tmp/checkcliargs-new -TMPOLD=/tmp/checkcliargs-old - -java -cp "lib/compile/*:examples/lib/bld/*" $MAIN --help >$TMPNEW -java -cp "examples/lib/bld/*" $MAIN --help >$TMPOLD - -diff $TMPOLD $TMPNEW - -rm -rf $TMPNEW $TMPOLD diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 56cd8a5..eb5f238 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -1,6 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.extension-pmd=com.uwyn.rife2:bld-pmd:0.9.9 +bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.0 bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.downloadLocation= bld.sourceDirectories= diff --git a/scripts/checkcliargs.sh b/scripts/checkcliargs.sh new file mode 100755 index 0000000..44517ee --- /dev/null +++ b/scripts/checkcliargs.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +main=io.gitlab.arturbosch.detekt.cli.Main +new=/tmp/checkcliargs-new +old=/tmp/checkcliargs-old + +java -cp "lib/compile/*:examples/lib/bld/*" $main --help >$new +java -cp "examples/lib/bld/*" $main --help >$old + +diff $old $new + +rm -rf $new $old diff --git a/cliargs.sh b/scripts/cliargs.sh similarity index 100% rename from cliargs.sh rename to scripts/cliargs.sh diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 15bf2ff..5e687e0 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -95,4 +95,15 @@ public class DetektOperationBuild extends Project { .ruleSets("config/pmd.xml") .execute(); } + + @Override + public void test() throws Exception { + new ExecOperation() + .fromProject(this) + .command("scripts/cliargs.sh") + .execute(); + super.test(); + } + + } diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index c368d19..9112adc 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -61,11 +61,11 @@ class DetektOperationTest { @Test void testCheckAllParameters() throws IOException { - var params = Files.readAllLines(Paths.get("src", "test", "resources", "detekt-args.txt")); + var args = Files.readAllLines(Paths.get("src", "test", "resources", "detekt-args.txt")); - assertThat(params).isNotEmpty(); + assertThat(args).isNotEmpty(); - var args = new DetektOperation() + var params = new DetektOperation() .fromProject(new BaseProject()) .allRules(true) .autoCorrect(true) @@ -94,9 +94,9 @@ class DetektOperationTest { .report(new DetektReport(DetektReportId.HTML, "reports")) .executeConstructProcessCommandList(); - for (var p : params) { + for (var p : args) { var found = false; - for (var a : args) { + for (var a : params) { if (a.startsWith(p)) { found = true; break; From 4b101bb18335cc6b6b6a241a81a7771cd800c699 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 22 Jun 2024 17:23:46 -0700 Subject: [PATCH 19/65] Moved Report and ReportID to their own sub-package --- .../java/rife/bld/extension/DetektOperation.java | 2 +- .../{DetektReport.java => detekt/Report.java} | 4 ++-- .../{DetektReportId.java => detekt/ReportId.java} | 4 ++-- .../java/rife/bld/extension/DetektOperationTest.java | 12 +++++++----- 4 files changed, 12 insertions(+), 10 deletions(-) rename src/main/java/rife/bld/extension/{DetektReport.java => detekt/Report.java} (90%) rename src/main/java/rife/bld/extension/{DetektReportId.java => detekt/ReportId.java} (93%) diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index 6db96db..a1377ba 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -617,7 +617,7 @@ public class DetektOperation extends AbstractProcessOperation { * @param reports one or more reports * @return this operation instance */ - public DetektOperation report(DetektReport... reports) { + public DetektOperation report(Report... reports) { report_.addAll(List.of(reports)); return this; } diff --git a/src/main/java/rife/bld/extension/DetektReport.java b/src/main/java/rife/bld/extension/detekt/Report.java similarity index 90% rename from src/main/java/rife/bld/extension/DetektReport.java rename to src/main/java/rife/bld/extension/detekt/Report.java index 0560f3d..32dcc60 100644 --- a/src/main/java/rife/bld/extension/DetektReport.java +++ b/src/main/java/rife/bld/extension/detekt/Report.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package rife.bld.extension; +package rife.bld.extension.detekt; /** * Defines a report for the given report-id to be stored on the given path. @@ -24,5 +24,5 @@ package rife.bld.extension; * @author Erik C. Thauvin * @since 1.0 */ -public record DetektReport(DetektReportId id, String path) { +public record Report(ReportId id, String path) { } diff --git a/src/main/java/rife/bld/extension/DetektReportId.java b/src/main/java/rife/bld/extension/detekt/ReportId.java similarity index 93% rename from src/main/java/rife/bld/extension/DetektReportId.java rename to src/main/java/rife/bld/extension/detekt/ReportId.java index ab398eb..ef53bc9 100644 --- a/src/main/java/rife/bld/extension/DetektReportId.java +++ b/src/main/java/rife/bld/extension/detekt/ReportId.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package rife.bld.extension; +package rife.bld.extension.detekt; /** * The report-id values. @@ -22,6 +22,6 @@ package rife.bld.extension; * @author Erik C. Thauvin * @since 1.0 */ -public enum DetektReportId { +public enum ReportId { TXT, XML, HTML, MD, SARIF } diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index 9112adc..c480af9 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -20,6 +20,8 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import rife.bld.BaseProject; import rife.bld.blueprints.BaseProjectBlueprint; +import rife.bld.extension.detekt.Report; +import rife.bld.extension.detekt.ReportId; import rife.bld.operations.exceptions.ExitStatusException; import java.io.File; @@ -147,11 +149,11 @@ class DetektOperationTest { var op = new DetektOperation() .fromProject(new BaseProjectBlueprint(new File("examples"), "com.example", "Example")) - .report(new DetektReport(DetektReportId.HTML, html.getAbsolutePath())) - .report(new DetektReport(DetektReportId.XML, xml.getAbsolutePath())) - .report(new DetektReport(DetektReportId.TXT, txt.getAbsolutePath())) - .report(new DetektReport(DetektReportId.MD, md.getAbsolutePath())) - .report(new DetektReport(DetektReportId.SARIF, sarif.getAbsolutePath())); + .report(new Report(ReportId.HTML, html.getAbsolutePath())) + .report(new Report(ReportId.XML, xml.getAbsolutePath())) + .report(new Report(ReportId.TXT, txt.getAbsolutePath())) + .report(new Report(ReportId.MD, md.getAbsolutePath())) + .report(new Report(ReportId.SARIF, sarif.getAbsolutePath())); assertThatThrownBy(op::execute).isInstanceOf(ExitStatusException.class); From 093a32cfdd69a725315e14d8fff58d2af3a828db Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 22 Jun 2024 17:25:53 -0700 Subject: [PATCH 20/65] Bumped extensions dependencies Exec to version 1.0.1 PMD to version 1.1.0 --- examples/lib/bld/bld-wrapper.jar | Bin 27319 -> 27319 bytes lib/bld/bld-wrapper.jar | Bin 27319 -> 27319 bytes lib/bld/bld-wrapper.properties | 6 +++--- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/lib/bld/bld-wrapper.jar b/examples/lib/bld/bld-wrapper.jar index e188fc7daeda7d4eeda518a048aee20ce8faa097..ef31ff4f272c6cff6ffe4300434dc77205a94216 100644 GIT binary patch delta 131 zcmdmfm2vx3M&1B#W)=|!4h{~6puQ6mdFz;g)W$v~V-UT0vvD^QnBi!~t_Nm#r<`X5 wGi1{Y!BUe0GweYElP705gXx69e;#vM+x;)DP0O;g7M*si- diff --git a/lib/bld/bld-wrapper.jar b/lib/bld/bld-wrapper.jar index ee7a9452d801c419a3ecfcc50190c4bf04f7e3a8..044c7e8ecc8dcb6aedc3e02c4ced84472b05bdc8 100644 GIT binary patch delta 131 zcmdmfm2vx3M&1B#W)=|!4h{|mzrGU_dFz;g)W$v~V-UT0vvD^QnBi!~t_Nm#r<`X5 wGi1{Y!BUe0GweYElP705gXx69e;#vM+x;)DP0DL(&c>n+a diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index eb5f238..80d6f54 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -1,8 +1,8 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true -bld.extension-pmd=com.uwyn.rife2:bld-pmd:0.9.9 -bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.0 -bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.downloadLocation= +bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.1 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.0 +bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=1.9.1 From 29255aae21fd7f3f9948a7457ed5b4d86377bcdd Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 22 Jun 2024 17:27:14 -0700 Subject: [PATCH 21/65] Fixed copyright template --- .idea/copyright/Apache_License.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.idea/copyright/Apache_License.xml b/.idea/copyright/Apache_License.xml index ade80da..4446c15 100644 --- a/.idea/copyright/Apache_License.xml +++ b/.idea/copyright/Apache_License.xml @@ -1,6 +1,6 @@ - - + \ No newline at end of file From a6be88bf54f7554597d576a10bfbd4e43161fada Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 22 Jun 2024 17:28:55 -0700 Subject: [PATCH 22/65] Added includes and excludes collection Changed Collection to Collection whenever applicable --- .../rife/bld/extension/DetektOperation.java | 234 +++++++++++++++--- .../bld/extension/DetektOperationTest.java | 48 ++-- 2 files changed, 228 insertions(+), 54 deletions(-) diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index a1377ba..b1d1bf1 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -17,6 +17,8 @@ package rife.bld.extension; import rife.bld.BaseProject; +import rife.bld.extension.detekt.Report; +import rife.bld.extension.detekt.ReportId; import rife.bld.operations.AbstractProcessOperation; import rife.bld.operations.exceptions.ExitStatusException; import rife.tools.exceptions.FileUtilsErrorException; @@ -24,6 +26,7 @@ import rife.tools.exceptions.FileUtilsErrorException; import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.logging.Level; @@ -53,12 +56,13 @@ public class DetektOperation extends AbstractProcessOperation { "sarif4k-jvm-", "snakeyaml-engine-", "trove4j-"); - private static final Logger LOGGER = Logger.getLogger(DetektReport.class.getName()); - private final Collection classpath_ = new ArrayList<>(); - private final Collection config_ = new ArrayList<>(); - private final Collection input_ = new ArrayList<>(); - private final Collection plugins_ = new ArrayList<>(); - private final Collection report_ = new ArrayList<>(); + private static final Logger LOGGER = Logger.getLogger(Report.class.getName()); + private final Collection classpath_ = new ArrayList<>(); + private final Collection config_ = new ArrayList<>(); + private final Collection excludes_ = new ArrayList<>(); + private final Collection input_ = new ArrayList<>(); + private final Collection plugins_ = new ArrayList<>(); + private final Collection report_ = new ArrayList<>(); private boolean allRules_; private boolean autoCorrect_; private String basePath_; @@ -68,9 +72,8 @@ public class DetektOperation extends AbstractProcessOperation { private boolean createBaseline_; private boolean debug_; private boolean disableDefaultRuleSets_; - private String excludes_; private boolean generateConfig_; - private String includes_; + private final Collection includes_ = new ArrayList<>(); private String jdkHome_; private String jvmTarget_; private String languageVersion_; @@ -117,6 +120,19 @@ public class DetektOperation extends AbstractProcessOperation { return this; } + /** + * Specifies a directory as the base path. Currently, it impacts all file + * paths in the formatted reports. File paths in console output and txt + * report are not affected and remain as absolute paths. + * + * @param path the directory path + * @return this operation instance + */ + public DetektOperation basePath(File path) { + basePath_ = path.getAbsolutePath(); + return this; + } + /** * If a baseline xml file is passed in, only new code smells not in the * baseline are printed in the console. @@ -129,6 +145,18 @@ public class DetektOperation extends AbstractProcessOperation { return this; } + /** + * If a baseline xml file is passed in, only new code smells not in the + * baseline are printed in the console. + * + * @param baseline the baseline xml file + * @return this operation instance + */ + public DetektOperation baseline(File baseline) { + baseline_ = baseline.getAbsolutePath(); + return this; + } + /** * Preconfigures detekt with a bunch of rules and some opinionated defaults * for you. Allows additional provided configurations to override the @@ -143,51 +171,93 @@ public class DetektOperation extends AbstractProcessOperation { } /** - * EXPERIMENTAL: Paths where to find user class files and depending jar files. + * EXPERIMENTAL: Paths where to find user class files and jar dependencies. + * Used for type resolution. + * + * @param paths one or more files + * @return this operation instance + */ + public DetektOperation classPath(File... paths) { + classpath_.addAll(List.of(paths)); + return this; + } + + /** + * EXPERIMENTAL: Paths where to find user class files and jar dependencies. * Used for type resolution. * * @param paths one or more files * @return this operation instance */ public DetektOperation classPath(String... paths) { - classpath_.addAll(List.of(paths)); + classpath_.addAll(Arrays.stream(paths).map(File::new).toList()); return this; } + /** - * EXPERIMENTAL: Paths where to find user class files and depending jar files. + * EXPERIMENTAL: Paths where to find user class files and jar dependencies. * Used for type resolution. * - * @param paths the list of files + * @param paths the paths * @return this operation instance */ - public DetektOperation classPath(Collection paths) { + public DetektOperation classPath(Collection paths) { classpath_.addAll(paths); return this; } /** - * Path to the config file ({@code path/to/config.yml}). + * Paths where to find user class files and jar dependencies. + * + * @return the paths + */ + public Collection classPath() { + return classpath_; + } + + /** + * Paths to the config files ({@code path/to/config.yml}). * * @param configs one or more config files * @return this operation instance */ - public DetektOperation config(String... configs) { + public DetektOperation config(File... configs) { config_.addAll(List.of(configs)); return this; } /** - * Path to the config file ({@code path/to/config.yml}). + * Paths to the config files ({@code path/to/config.yml}). * - * @param configs the list pf config files + * @param configs one or more config files * @return this operation instance */ - public DetektOperation config(Collection configs) { + public DetektOperation config(String... configs) { + config_.addAll(Arrays.stream(configs).map(File::new).toList()); + return this; + } + + /** + * Paths to the config files ({@code path/to/config.yml}). + * + * @param configs the config files + * @return this operation instance + */ + public DetektOperation config(Collection configs) { config_.addAll(configs); return this; } + /** + * Paths to config files. + * + * @return the config files paths. + */ + public Collection config() { + return config_; + } + /** * Path to the config resource on detekt's classpath ({@code path/to/config.yml}). * @@ -199,6 +269,17 @@ public class DetektOperation extends AbstractProcessOperation { return this; } + /** + * Path to the config resource on detekt's classpath ({@code path/to/config.yml}). + * + * @param resource the config resource path + * @return this operation instance + */ + public DetektOperation configResource(File resource) { + configResource_ = resource.getAbsolutePath(); + return this; + } + /** * Treats current analysis findings as a smell baseline for future detekt * runs. @@ -236,14 +317,34 @@ public class DetektOperation extends AbstractProcessOperation { /** * Globbing patterns describing paths to exclude from the analysis. * - * @param patterns the patterns + * @param patterns one or more pattern * @return this operation instance */ - public DetektOperation excludes(String patterns) { - excludes_ = patterns; + public DetektOperation excludes(String... patterns) { + excludes_.addAll(List.of(patterns)); return this; } + /** + * Globbing patterns describing paths to exclude from the analysis. + * + * @param patterns a collection of patterns + * @return this operation instance + */ + public DetektOperation excludes(Collection patterns) { + excludes_.addAll(patterns); + return this; + } + + /** + * Returns the globbing patterns describing paths to exclude from the analysis. + * + * @return the globbing patterns + */ + public Collection excludes() { + return excludes_; + } + /** * Performs the operation. * @@ -311,13 +412,13 @@ public class DetektOperation extends AbstractProcessOperation { // classpath if (!classpath_.isEmpty()) { args.add("--classpath"); - args.add(String.join(File.pathSeparator, classpath_.stream().filter(this::isNotBlank).toList())); + args.add(String.join(File.pathSeparator, classpath_.stream().map(File::getAbsolutePath).toList())); } // config if (!config_.isEmpty()) { args.add("-config"); - args.add(String.join(";", config_.stream().filter(this::isNotBlank).toList())); + args.add(String.join(";", config_.stream().map(File::getAbsolutePath).toList())); } // config-resource @@ -342,9 +443,9 @@ public class DetektOperation extends AbstractProcessOperation { } // excludes - if (isNotBlank(excludes_)) { + if (!excludes_.isEmpty()) { args.add("--excludes"); - args.add(excludes_); + args.add(String.join(",", excludes_)); } // generate-config @@ -353,15 +454,15 @@ public class DetektOperation extends AbstractProcessOperation { } // includes - if (isNotBlank(includes_)) { + if (!includes_.isEmpty()) { args.add("--includes"); - args.add(includes_); + args.add(String.join(",", includes_)); } // input if (!input_.isEmpty()) { args.add("--input"); - args.add(String.join(",", input_.stream().filter(this::isNotBlank).toList())); + args.add(String.join(",", input_.stream().map(File::getAbsolutePath).toList())); } // jdk-home @@ -396,7 +497,7 @@ public class DetektOperation extends AbstractProcessOperation { // plugins if (!plugins_.isEmpty()) { args.add("--plugins"); - args.add(String.join(",", plugins_.stream().filter(this::isNotBlank).toList())); + args.add(String.join(",", plugins_.stream().map(File::getAbsolutePath).toList())); } // report @@ -433,7 +534,7 @@ public class DetektOperation extends AbstractProcessOperation { if (baseline.exists()) { baseline_ = baseline.getAbsolutePath(); } - excludes(".*/build/.*,.*/resources/.*"); + excludes(".*/build/.*", ".*/resources/.*"); return this; } @@ -476,23 +577,44 @@ public class DetektOperation extends AbstractProcessOperation { /** * Globbing patterns describing paths to include in the analysis. Useful in - * combination with {@link #excludes(String) excludes} patterns. + * combination with {@link #excludes() excludes} patterns. * - * @param patterns the patterns + * @param patterns one or more patterns * @return this operation instance */ - public DetektOperation includes(String patterns) { - includes_ = patterns; + public DetektOperation includes(String... patterns) { + includes_.addAll(List.of(patterns)); return this; } + /** + * Globbing patterns describing paths to include in the analysis. Useful in + * combination with {@link #excludes() excludes} patterns. + * + * @param patterns a collection of patterns + * @return this operation instance + */ + public DetektOperation includes(Collection patterns) { + includes_.addAll(patterns); + return this; + } + + /** + * Returns the globbing patterns describing paths to include in the analysis. + * + * @return the globbing patterns + */ + public Collection includes() { + return includes_; + } + /** * Input paths to analyze. If not specified the current working directory is used. * - * @param paths the list of paths + * @param paths the paths * @return this operation instance */ - public DetektOperation input(Collection paths) { + public DetektOperation input(Collection paths) { input_.addAll(paths); return this; } @@ -504,16 +626,28 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation input(String... paths) { + input_.addAll(Arrays.stream(paths).map(File::new).toList()); + return this; + } + + /** + * Input paths to analyze. If not specified the current working directory is used. + * + * @param paths one or more paths + * @return this operation instance + */ + public DetektOperation input(File... paths) { input_.addAll(List.of(paths)); return this; } + /** * Returns the input paths to analyze. * * @return the input paths */ - public Collection input() { + public Collection input() { return input_; } @@ -596,6 +730,17 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation plugins(String... jars) { + plugins_.addAll(Arrays.stream(jars).map(File::new).toList()); + return this; + } + + /** + * Extra paths to plugin jars. + * + * @param jars one or more jars + * @return this operation instance + */ + public DetektOperation plugins(File... jars) { plugins_.addAll(List.of(jars)); return this; } @@ -603,16 +748,25 @@ public class DetektOperation extends AbstractProcessOperation { /** * Extra paths to plugin jars. * - * @param jars the list of jars + * @param jars the jars paths * @return this operation instance */ - public DetektOperation plugins(Collection jars) { + public DetektOperation plugins(Collection jars) { plugins_.addAll(jars); return this; } /** - * Generates a report for given {@link DetektReportId report-id} and stores it on given 'path'. + * Extra path to plugins jars. + * + * @return the jars paths + */ + public Collection plugins() { + return plugins_; + } + + /** + * Generates a report for given {@link ReportId report-id} and stores it on given 'path'. * * @param reports one or more reports * @return this operation instance diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index c480af9..760d824 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -36,7 +36,6 @@ import java.util.logging.Logger; import static org.assertj.core.api.Assertions.*; - @SuppressWarnings("PMD.AvoidDuplicateLiterals") class DetektOperationTest { @BeforeAll @@ -67,34 +66,55 @@ class DetektOperationTest { assertThat(args).isNotEmpty(); - var params = new DetektOperation() + var op = new DetektOperation() .fromProject(new BaseProject()) .allRules(true) .autoCorrect(true) .basePath("basePath") + .basePath(new File("basePath")) .baseline("baseline") .buildUponDefaultConfig(true) - .classPath("classpath") - .classPath(List.of("path2", "path3")) - .config("config") - .config(List.of("config2", "config4")) + .classPath(new File("path1")) + .classPath("path2", "path3") + .classPath(List.of(new File("path4"), new File("path5"))) + .config(new File("config1")) + .config("config2", "config3") + .config(List.of(new File("config4"), new File("config5"))) .configResource("configResource") + .configResource(new File("configResource")) .createBaseline(true) .debug(true) .disableDefaultRuleSets(true) - .excludes("excludes") + .excludes(List.of("excludes1", "excludes2")) + .excludes("excludes3", "excludes4") .generateConfig(true) - .includes("patterns") - .input("input") + .includes(List.of("includes1", "includes2")) + .includes("includes3", "includes4", "includes5") + .input(new File("input1")) + .input("input2", "input3") + .input(List.of(new File("input4"), new File("input5"))) .jdkHome("jdkHome") .jvmTarget("jvmTarget") .languageVersion("languageVersion") .maxIssues(10) .parallel(true) - .plugins("jars") - .plugins(List.of("jars2", "jar3")) - .report(new DetektReport(DetektReportId.HTML, "reports")) - .executeConstructProcessCommandList(); + .plugins(new File("jar1")) + .plugins("jar2", "jar3") + .plugins(List.of(new File("jar4"), new File("jar5"))) + .report(new Report(ReportId.HTML, "reports")); + + assertThat(op.excludes()).as("excludes[]").containsExactly(".*/build/.*", ".*/resources/.*", + "excludes1", "excludes2", "excludes3", "excludes4"); + + for (var i = 1; i < 6; i++) { + assertThat(op.classPath()).as("classPath[" + i + ']').hasSize(5).contains(new File("path" + i)); + assertThat(op.config()).as("config[" + i + ']').hasSize(5).contains(new File("config" + i)); + assertThat(op.includes()).as("includes[" + i + ']').hasSize(5).contains("includes" + i); + assertThat(op.input()).as("input[" + i + ']').hasSize(5).contains(new File("input" + i)); + assertThat(op.plugins()).as("plugins[" + i + ']').hasSize(5).contains(new File("jar" + i)); + } + + var params = op.executeConstructProcessCommandList(); for (var p : args) { var found = false; @@ -117,7 +137,7 @@ class DetektOperationTest { var op = new DetektOperation() .fromProject(new BaseProjectBlueprint(new File("examples"), "com.example", "Example")) - .baseline(baseline.getAbsolutePath()) + .baseline(baseline) .createBaseline(true); op.execute(); From b2574279eb898b948fd3add770a38bdc6c8fd2f6 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 22 Jun 2024 17:35:02 -0700 Subject: [PATCH 23/65] Use SNAPSHOT in examples --- examples/lib/bld/bld-wrapper.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 3e7152d..fbc3fc9 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,8 +1,8 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true -bld.extensions=com.uwyn.rife2:bld-kotlin:0.9.8 -bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.4 -bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.downloadLocation= +bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.5-SNAPSHOT +bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.0-SNAPSHOT +bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=1.9.1 From b26240df760c9d9e9acd8092bf0a7351daafed14 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 22 Jul 2024 16:25:57 -0700 Subject: [PATCH 24/65] Bumped bld to version 2.0.0-SHAPSHOT --- .github/workflows/bld.yml | 15 ++++-------- .idea/libraries/bld.xml | 4 ++-- .vscode/settings.json | 2 +- examples/.idea/libraries/bld.xml | 4 ++-- examples/.vscode/settings.json | 2 +- examples/lib/bld/bld-wrapper.jar | Bin 27319 -> 29519 bytes examples/lib/bld/bld-wrapper.properties | 2 +- .../bld/java/com/example/ExampleBuild.java | 22 +++++++++--------- lib/bld/bld-wrapper.jar | Bin 27319 -> 29769 bytes lib/bld/bld-wrapper.properties | 4 ++-- .../bld/extension/DetektOperationBuild.java | 15 ++++++------ 11 files changed, 32 insertions(+), 38 deletions(-) diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index 3c9d30a..2d50ee7 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -22,17 +22,12 @@ jobs: distribution: "zulu" java-version: ${{ matrix.java-version }} - - name: Grant execute permission for bld - run: chmod +x bld - - - name: Download the dependencies + - name: Download dependencies run: ./bld download - - name: Download the examples dependencies - run: | - cd examples - chmod +x bld - ./bld download + - name: Download dependencies [examples] + working-directory: examples + run: ./bld download - - name: Run tests with bld + - name: Run tests run: ./bld compile test diff --git a/.idea/libraries/bld.xml b/.idea/libraries/bld.xml index a2969be..2fb5ff0 100644 --- a/.idea/libraries/bld.xml +++ b/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/.vscode/settings.json b/.vscode/settings.json index d136e4d..33a9922 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,7 @@ ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-1.9.1.jar", + "${HOME}/.bld/dist/bld-2.0.0-SNAPSHOT.jar", "lib/**/*.jar" ] } diff --git a/examples/.idea/libraries/bld.xml b/examples/.idea/libraries/bld.xml index a2969be..2fb5ff0 100644 --- a/examples/.idea/libraries/bld.xml +++ b/examples/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index d136e4d..33a9922 100644 --- a/examples/.vscode/settings.json +++ b/examples/.vscode/settings.json @@ -9,7 +9,7 @@ ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-1.9.1.jar", + "${HOME}/.bld/dist/bld-2.0.0-SNAPSHOT.jar", "lib/**/*.jar" ] } diff --git a/examples/lib/bld/bld-wrapper.jar b/examples/lib/bld/bld-wrapper.jar index ef31ff4f272c6cff6ffe4300434dc77205a94216..3f131d137922e617f602bce7e977bc7bae387351 100644 GIT binary patch delta 27497 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%0Dqi84JzV~s3V|9|699_i|z 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 delta 25376 zcmV(}K+wO*=mEFY0S!<~0|XQR2nYxOPL9Zt4SoYoj>wUYFn@drd|Xxa|2g-)cBxyt1LYOAgc4#t_&P+EsGy+YE-Ij+sDO$;ClKCJ)x7DPU{{dnMKNgHuc836NB#p9Yv`u5EAOl?Mu2?+S z%ap$*7+({OVCwiTrdcHoo-XldD7>X+&d@49<<&wsq=uO}?GsY3eZ2Y1GU;aDgVj&(|Xl}*RfT&AM#$hqO3NT9ne+1?uIk9KKz zyk2_Fx9NoJJy&D4?nsx0x6q~&=_Dp=Q~&18K|!k8u*{DJa83FF*0@bu!SYQQKTjFV59_i`9 z2rLo#Y#&CgPl_^EW6sK)2M;T4DJkJMP^C8 z1FFfUW?BQPbwz`Lc(8piU72Q-WU^N_-V{hJHnmb47L@^Mbs)+#W)O%u>wL71DX%BA zDSsLe>RWV1rYLE^K3Xpn>FKWA+1ry(8|h4o&a$bK&Iae|&S5~@42V^00!MK&|l zWRac?!^&U=gc_M-lTBUJ4T+COoURb2l3^rvvyf|zd~LNUMCX9!z;7%b)4F86pL(d* zqOeU7>H`?9qT-QAPfX)sEog+Ee&DM+Ie*pk!KfNKvG8lurWk>aqn0(S=v-af(z&L# zt*x%537q4he>AuyxKnl(4@SdS@D4iHqMbJFqVqE3G@~C--W!N_Z4H8O^S!uSzBLeS z4Q}rbhP#3p-0KW)bOzNFKq+5f(}kiPC-erk1(!#{U4eLeD83b6;MZ^*is)kcgnvbs z*z`%=Z5UV@H+?;Uu3&9Xk8Jxgn=Y4aPmpc5Hm_}2Uf1f~egXPiARRwt(^b-OOiTUB zx_RC%(t3?e*Gg-V)0zd4Q0~(oM z_7J`<8jVEjk_{H!oK!P_Q{S9w@PE@ybgQu0XJO;KbGL1cM$Qdva>eO(=+js*9>;QG zmFL7FVIO@CdK$u0;p*zjzLZe==q|L$`sP(8)nY>gL<-5c&x2D%=mxj=sh#ez>0bIG zSj43Z(~4nP3$)~F+$rlEzN7{TG~1~*VVPO);Bk$39K9fe}BcM2c-A0 z4he_r@1qBqp7ri#u=-!TInWae`m=U%ZOP(zwBPBGwnB?_*=xZTH`cDJYwBEH*VNWh z+feSTtEH}?uC}$V)t?Qa4vd(d1eP2s-T|bmcLbv{(c+osyI&Xjee`umgr@>}=V6;3 zp*>Ipa5`!?#UefZ@u096)PHGGX(jnmx<6*q`ptE&o}Q3(zB%hHdKTD8E2eV-QGckVFl0td|1*>$ zkMG*_J$eBf0g4&}p>S#;0DMe|S4Yb5bSoJC`}6~gerVH6^fJ?w;X2N23iJvs8*7`u zPpxf9{$`pwEO0%h#z#Mf5t>_hyq{jBpIG!$n|?;GL5B=C488mMAyFrl4E0rp^0zp=I+vVYJ}+uADr_pfdG4gD526?j_S6NtscQSpM%l_1pX^m~i`VACJP z0*@Nh4z+{vvOA039D+1>8qNK2YymnY7=YRRQ*yJe0C-z{^cTSQYDa+Z(_8dcQMGM; zdV}7PufH?ROY33?$n3FZikdT@zH-_(nQC)tR$=b$fl3!5aJ%JR#4?G_Jsdo zu^wOW4Q88_1Y0?qd-`KrrN*>5N7r=qL}EdUt)x!Kv}JzIy z5ePTYSU*qTi53^xJc%bKqe8bER0+&!7%olN@y(egm1IInx7GN03Lk6nRGW)=T2ikJ z>4qs_!`H@w%L8zKV&bN+2SPD+hRrh>!PQ7?raqh^fPbj3w3hcY)L1-wi24Hc>ca8p zE;F8H0x zcEuf1%-OIkk5A(UiyLij;%264Da+9X2M44BM+L&&foS(~r;KqqYui?KBC?#+Fr>5F zsYY1)bU|4Q)H*ghe9t-S^0|%ITD;EYb_q8|W`72IKvpPL*V`B0CH*>VUe6m~?4!Zn z$c~^S7V5L;ZTJOzrp;%G8!=iGbRZlFhq?kiq6sWUur(q*-Eo4+E&HBr?o6<@XaK@l5B$ue}_md{`3hb(^B=0{|GBQg?DAR8=@ ztp8D)ALGa2z63?#=%z6l-kqeY1lC@g2Y4SkLUBa{*uKZX)*b8Jdh|ZPPgwk<%}>dK z3Wj#UDz^q=qL!uaH*EeUe+yd)qkm#>M#4p&#ox|IRW%0sW@;6g&rkC+Ha{x>a>3|8 zzj$R}$?sy*8G(&p=>?l#@t>L2Cn3j*FL>r z@$P*}VMm$u6|RzY+D&lD#+e&E@pZe(wds@m(>!A3vsIqtzQ?SnZ+~rTsb99X4Sqyx z=ZgB4JQ}I;ZDlLCrbaLd$sLzckZZ8Mq~B9Oxo|AiXf?)C1-2>_Ygm}2BP731NByPfcVhT^WGF?k_!O1?na8k{k@wI;`r1gU`F$0 zMQ<=3=nljKl3JBnj(@S$6yb*aq(H2V_P|LJKao|jO%XLM9S;nZ&!q31J-4G~*lMO^ zYbG_;wbgd6sKp~GS?Mt3Vl~TFvqc-4n?vDlshDG{QdI_3u_YSm?;GO4q*Oht3R_hQ z%ZgzX3no#b)E{rFxl%6-;VPeGa{=PJ3w-JX5Up{=0>4_QPJgu2Nwzv!RVQ8CSg@-f zPUxH_xcZW3$8P)*U?|&;evX7|E>EnwOldltr-)gIn zmiS12ynuX;WcS#rSHwC;3ovS!{i;uGw^Y_H-0|4KTWW``&Q&`dS3CuGT1hq#!f(l;mO3vPT4+XTh=jM~Tzts+ z=T{f0i+?Tk30qyFKAFtI3~oc>kjc!nl}$R zoXwKiN+lNZL{r=dx&|d{UqF5--@-IU__R_SiGO4s$>r0OKOw1yo*i-w{l5CFt!`7d z%fS~I*iC62cLWRPB!MjTxr{U2^pRj5zozc8)!hoxYqoW)sRO@eORTATY;~{tqLV_< z2Qkt9F70N{&p4fQlTMzRXmGR4Rpl8}<5TxRXdHEv+Gq5+jM5(R!4s;zni2WmKkEI^9)nn@MB(Ds& z9Vm1NURt5gKFoP-M&zvassT&wv(#1^C?McS9JCH)T?0k3Z1mARzJ1X&(v$;Uv^8z=6^89 z=j$!?iwr`oiALZO#FCDy`nmd*O_us~)|2#g(*9dp{Z73O1`ma|24VN=n?1SyEHGw8|NA-q8u@X{=Ba>wSdcLLpWT`*f>M!c;j4;OS0Ro*H2tm_D^#OCep!ILIdPh=X zW1^0x@rom>f7t4ulCKz}$?8oFh<^|Ao~_=OGy74FjrX+Wsejw*KidBHZtD(3HL(BM z>O=LBlfBR~+ZTv$T^)#O&t=Gc21!8);SI74mNiU_MZ2(qWHL79U5a7YhH2zLo)Nih z3WbAh5pOz1^T&oE1Q~jTqQ|go!)N4yKIcS2VR!7zp|s562O0T>Z5bnMV}GPE%4L$B zZX&%6PtagTs9PMVagYe-wvR-M%Okygut3o?8ze`0TWj)-F-C!96xzmEW85I{nPA2X zcsG$KwyiM`hU6`{bEa3mHFb;*{3VNBxPCbU8-AC@(lm;o#~p)AESsW{ih z1lyP>bRU^=qV)k@zA?#|Y=0TY*v1s&SP8+jYYPxSR&>TJz{1JDo2r z9UOuUuh@OYN-V!(MSn?U+0r?SODap}z{@mN*+#vjbKF}rSoZ@e2Y#_2{2hITnkXeCqs=zf8ta@8RW{%p3$zTMCC>yg zY(qBnZk%Bo9maath?twWn4Dn-oZ6~X`eTH#(KgOB&Vn6;lYiW^E4{x#*w&*r!0Y2Kv(J#9^QfzfzfJvu$h{;(~_-T?6hA(AAjvR2Lj%2ENudqwhHuOEOF{^9W)n@QZ0T_Lw z&)9+BZfz_Wt$(Q95)2~_9R)v`rx?3z<2>VhnB|xpes1p%#ynS2v!&3po#Y}wH!ie| zi;RoGudC|L=v+~MYJFR4XG3#)U5nh1TrLT>96`+|ZR1h{!CIk{;ae5lxgxYB6n7I3 zQ-)5Ml%aY!b;cDCL4Ch=Yos^mGd>0FAu$!a5aViiV}Hi^vXX0U<2uQ|*>a4xwzaNB zQg1%vdWjH0AfIsqgm+Og1L~&8mQ*LJXsB??PZBU+v8Iepxy1nlJ z-NDVG;l5-W_Zjy?#l$1xOX%ya&H?FiDBX-}P}s*%)S^@JCZJaO=+xTW zR4c)2DlORRGah7G^#76qmsD+Yds9Pm?Fz8$@_*VkeQ##ckh;{IE^mpHHPtpEkRI#3 zW|*!XDb>r?*5kRVwsn=yc+_!?oY1LqYaq52740pxYu12E*R<5FtUtqNB%I`A^1=x= zo$jG8uhrMJqD!(8_Q74i;Ja;1#e*)rW!dJj86&fF7?)~nsawVeX7(GHS(ReGG!BLY_y_|s}_jSvY>&CAYWxJAOM;xexbL_<<`E6w=UP)v^R zhs#I`#9n(rp{R`1fzgccJf#&)V2{-u?YEDd+r3V)u& zHYbmk(-rC0o2-Xr5^79Ic@|l2snp0763@MxiNjsok(8fvD`xN-lDBCDMPYqQ&lgQy zGa8whG4`GaWv(J;lVtua`R#$HOS6{%w)r5&*sn; zrkZRW77g{8hSn@Wj0i`3G|X0@zbD?=WW`lXR+g>Jd`gP<2jTyR+9#-cA}mG3^Sy%$DiuxGabWC(GbrQ?}?o zc5q&NQK`t@^uw>(>107K>3>UG<_vfMp2!~>IU4QniwDy6x`I0 zqOgcjeNL3zxyg~4O#BTBq4iO>o7ybQk`ZN^lWm$|6qLU^l?+Jg>!E3a8o76#&Q^5x zheO&}Wy_Svd3ZVl!8C0cn5le|Y$%en$fLc}#C2Ar^ypJB&?JpmS$nQ-4g;DXKMpOm6-S&e;svH+a-B7oDCA*yKS~;=ZNrb-~b9xwh<7 zx-%bl7@74>p6gsp0a7>NKagNTPoQ^GcVK2_o_Xe6rsI$NE5ytWFpFtm8HW`!j|V{) zb@jME`t_%0!baLtKL^+W%RYKp1d(JMb&kG|`OJ+Ve^q8o&3`(GHqT-@W^hZ!1tarp z_qJW~w>|7Lv2lwlwM6<%*cw%Z%FU3*<&plL?(pn*vD}3zPI{Kbvw619+?sLi#|a&Z zy-q-Jik!t<=`+uPpUIVQFnp#M>*QT7V6D2Ciz_QDi+!ftUr)nKx*^3vQ4OPyschKx z;_m*SRM%HE7k`IhvHl11|sG=FR4~9Ubzm zg31(rYKTO(_4j4rq2UIKubid(5e{x$5X%ESJ*}a5uzvX@1Hwud>an&1)c| zLwYx8rp2^@&B+br_j*e&{QuwH(Kk9%9)9fMPy&fd|3*b$v)4cGF|W_KjN2&L+#L7U z38MxXO3S<{=^GviC6;+hhF_GeE4bF_Ow$Oa@=^AfZ`VUFw-+A-3ID2-c6-@$tXQQc^w7$ z12keU6+TYmQJ&PXmyUUyrj+vIG!5mMD9?JFW~V>PNs?9yLy~s>ZfBAko zpC~~WN!6vvsw+}eR}SrU_26DbCSYE-n?_Ze2k54bB6Ba@a_|u>at20SL^qJ3H-9`2 zs3Pj4V`w{CV&Kj=EuwyErX942&c)YG^p_F4=o54vT}>Biq$~l7=1`0AV<5mpi{E&~ zcvb6^Yf^~1CWWYL97JK3i18ED8OBeAJfsc*uxSxnlxI;pp7MD^eg;N=mcpn7dpn9;~-W+qcuYaZ=lP7%Ii`HZlXf1m-6X$^!OYE`A+cTU9=E7 zyq-RfG52EB7pRTyp|j{q)J0#Tt@IFGKo0{F_@5pJv`0aX#{glkCPE7Ya3Y;(yrzlJ zmLkIS?pF>V%r$w^S+Sdn1Df5vW_D1Sth54$?2$Slf9 zu&>C}WU8eI?ciL9{{?h0-VT|np&^M5V9ig^IC>He#6k4@2CbrRf<)hcX zZ{U-24~cU1)}l@~_<#PBp^%mQR@qhkXMo}|>3FUBe>b{vbX9`$_wz{M_74XelNYeT z7d-}Gd}^uV_3~MN{YHI$(0m`$A!j~y3+hC>4hZ?m_wy*s!=sxjo~1D&5~vwV5S?)c zSyN#=NRVSB_!uF>bVwY}>L}mKCDplQMY#!{bAT&E0=cT%Du1#{AEN~cp4YL^hXsr& zlcF)sm*9oF5B;Gm!PP}pf*0?mqH3S}Wmo4F`HJ#{z`lb;<})-C!p=)}(=pXKyJ&1*^P{xqc7L{42oz zBW8LNbG?n(-h$k}4d{QwY;R(|w=v^ekn_Jm>A#~Xv=IV$CaCdS<9FbT)9DoBb>sK& zcjnMm;}6CkLHASWbmI-Q$@nuUK7(#CI*h-NsTuKk zvOlC^izgg{gXYtW_lAf#Pq28Y#ZxSvWpM@3hcpFVaQ!&FTurPf#anaIr9JA=iRa6TG|uytK0M034U{ zJ-m7^uYYMOdxk7jE~$995uc;WG{59Em4ktOz-nk~pO{)#OfLI))q#J(J~ z=9A%+lSs_Tkj+z}s2sH$bGLhT**C02 zKz|rP?L0DN@n*t@e#Q73@R<+m_Kvs_nAb4=uD=?wf2XyXEVr&*kNAhydS3VBMdP1v zzurx`(^B&uYJ?K=3D}XfH&oRKqH&+{!qx0cL+3h$kQf|?QW3sK7yHlLWCVB ze>H?tfEPoBjZbhaM|;VIyrZ?lEaaWqS%2p97-l}Ho^z!?7kd2sVt3I>E-|@q*SK(J zxo~q`xEH!`J8}y7;$fjr@IarHg3kXF^h<_?J~^k%0j*>!Pm4qrEAOdcflPA{ME zd$&`ARQF{-ynW2kH*)3@a3adXru9g@n6y3d}fkK@b!{rl4-oi_)zp( zN^?2=KXNU3Bl$n1rBF}PK7Xc}mhmz3?0-|vhh$rP;1K)-$8u}uoex<2wC+MwatLf~ zdfSLT$aMYW$E>b3JsApCq;QnWkB*^ubuhc1;StzTuATFm=ePL#u23z4NQhAQ$_n{6 z3I5%KgCK462#zl$I6fCAN`Cb0LfVa`iRGJD$bXRZ2fuMUS%v(kMt@mq!QHTKuQpY{ z6@)?G4Hmkca>@}}px<8}PWgAo!nYzmn@kRn&6{X6chh7J!tQUTGTxeU^)X9oE%V&9 zm{e&T(!SPYnqU&XoTzFPfo!9J-4AIZo>;W}Y}Z}%{aCa_{#CNzzri5?Lk#k}@S6+y zJ)q+b$}cj-o&OgCPk(ITzwP45ew<#h_CL4>eAJ88hQY%Tnhx7LhogG6Cph3!tF3ZZ zi!YP)YIA9hvsxNWQ%z+WEQpGI`8nHW(Hle0gn|suBot_ZAmr%#uPX3}CGoebf+lDDHULg(+ zN~$7NQ6&{Q0Drnc#zMolCV`h?@A&`Z{c0Y9FlUb3LN$LtEs*%C$Q)2L3AMB+7x9x? zKA=`6)M}_xfKiR@vVz8TiIXf1_YNv7Ei%(U6RHJWq<&&)QI1nz<i}dNHu&D)$+|$$G6Z1zLkRfS?cB6 zD9(2xw!4dN<$Iv3@1=wMC3=?cqnG%8`YrFKH~7o+Hh-1g;Rom+{1AP>53`^5U^S0n zJ$v~$et(>2^8ud6PjD?irTOPF8UgMt)V?NT7lzAHlpkyuVc)sZqy)Rtla^cCG??S2JJTp&oVJ#b`pXP#FFQl`ynNlX@s*?H zb1vnd4wtm>RPC1{Vru`0szt$kOgnYl>21mMnwpNqNLu^A z9<`->zdA>_c^keHDl9Bj4kl`X(gd$Wga_a1DBDYKJKWkY&OniwH&&gWP#2zoL51p4 zjFz^`B}&hAzicp+a2%ra+=CkS6}zdSNejx=5EOir4XA7PtIudzsyOI0-QaDy$q_R* z4}Vv2u-fMULfkJAeI?w>7DPvF)Il3rqOz^DU42Twuf>*0=hcX|(vuB{~pG9Qy9Qf;bM0wu@9bTZ-{30MfM_Zw6!u&JZ4(k==AJF;yL%Nz@qHFnO zx{iMYKKn7<$FI=W_*HrcefOg8ets<#$$u}Papnkfq+V;aIm#Rj&X`P%<`^B9&!iP* zfmsLwMQM`pia8c_*U@x0ssVXYI_rSW*@@0Npr+_Vz3{^Z@=5kCH=U+KU~G=F=&e*} zZVheA2+ECAJJBjjeM-1y6B_*)obyidxP>1fOPiOMS)~0w%Ez0g-B0EtQZ7_CCx6tf z4P~RPC+YPLqaY7{vOIF+0hM$|Ylo$upyQpb9iwyQl~7-3go6AMRPE~tb$?U2j5a$A z@wqWxRG`eE_3i^ua8w9@P`qCSNbyGjQ#?Ze#jA2aeN6!4bDn%A)Wfi>MJ9klGbNzt zCN)Sv3x)cW#I#O9z9dsP2GIAbCx7(&+01a3e+gszYbdAJ=@|Y!HSr&4J^ztz<2PwH z-VgFyApT!L{6EnF{xe4Zg`VTLp?LnLnPC<1b_{*aoS;50f6tjh=0sBh*7bCzImw(1 zaz9A<<}v0J;QRpDV1{GS?>RS|6~e#lI#utw)=@(3A4yG${Paz@j?=zq(WdZGc5 zY96dxg!{nzVluCCP3G)!H&;+tsJ>Nh>{H)Xq^*Kq5{l~C2leZ_52l=EeVWAoq#}M7 z;r#m^!#X>~q_fRwE|bpI0k`r5+_QDS?X1uwRg|mw%LfQInbYY8C!RKEg4do;E%sxy zicqhY)3Uwl#U^-27bn#B+keX|2GkEK3e}IKApTrTe-x@$GApo!pR^xPKZk>*ekqYi zLj6X(DfN3tm%aI5N-5~WBmOV>7@ixvpmBVNroaW6r4&^vgHBXAv{+ems`62z%A+>r zPdWBjVG0N9Q#e@f-~fAUF^@B6VK1jrp*ht*f8 zD8Y~iKQAQlWBeLC1xJMMhA{lK+{yN|9D**ajT0VB6MXTb1_(r4y<#%Pmt&Ng9;-)9sls`ec)rgrQ#rd8(& zl?sjNdNz)MIz<>cbAK-_tM+3s{E)mNKO=rKW?NL9UzESkC_@Zr%)Ns)7Ud<36I_mL zb_&LcOx1Rg?M9Td;B9?Jt{;W0&hoX>MOmyhQYxf<%%k*Paq7Kl2EOf`n&4`z%}V`-uqM^n`Vnyrec zLQSHDYBDWT$54}+LY-agnWR7iVwQZ7*E$i*1G&OA{LqTt+ZH%~&HNu9jZJbxMHEr+_f+N?Hf5acvdv$+U! zSbPah(emSiqvyy^o|Yfctu6fjXLH%sEj4_rm$ues#1HGy(qudRkD?Wt#DmK+O+#sSRZI(y78S`v# z2cP{6R(}9~`ST2JX#PXAiHE(gREtYvxhpIs<&LaSJ5;7omoQGfoyL?^IO1Kt&sYuK zKlDmEBQjkg9<`J#bqbAEwKPdBqnTeN&mJc%Zn%XRFCc{M5J-$HYR zWLQCnDzna9>8k$XRIm3^z1~apI@L7?euJ0nk)QJ6Z7I+%Gp^3=_BD64t+v$L-K^n@S9=FPYGL(hRni$)3 z%73jjSulDN{9I#sw!B+aw!GWeGVy|nawU=PfYr&jAG#AZmL-h7RPt?sn|!0ZYO}n^ z++%EKAWEaC$lPzly*Ls*w)@a?7&|MR^Gj;)kSxqf=j2EZn4ck^K7U~> z%6Zr+j&%%Dw#8dPS!_Ag0gifPh(vwt+P&t6AC>~*GGg-5^9AUFrB22;+E zebO}2#bUZ4rG-3EK%V?|*v-7G6n`I1q^fj}alz!#qb@o@(p7_woz=NCLhbZqb4IF= zY3Q|&G*35v2dH`SH_%*|kGkGoP3g0g!w*YdY_IW&hSJ9Jrx`%kE-c~#w}2>kJ6Qe#%J}%)rH3G`s2%m#^?0M z_Cn(>{c&lb@p=96r9$JLgz?2kjSGYs*mL3NL@ESkXVA$Ihfb8vrc)?D^@zq>s0)#7 zH(Z-I8Ri*UNIT5+BxmoV&5Mc64f=Vees=0-KtH?mGpL_i^fRQN+gtRrS3e{Axm`bF z=H-~7-`rvDa=*^Qm$Y1HUQ5m`zwg6+xsLMqY4g+OXL9q5a$}5nLvEgVqj|G=D;518 zP)i30a`WO**)jkC&}skxP)h>@6aWYa2mnrw$df8MDUwaMKQVv3 z_y2$HOzvcIvyhOGVKXd3RyNs81Op*~U;-G{0E&}jfPrKt&P)Jtsa9O;UaLZ@w!Tta zXhpOkKn0gpUv2Bt_PxGtw)M5IwRW?+D}29m?wvb#mIVC1_OtcQJ?EbDKj-}Z`#C4R za_ZO#BATb|^O7JQW5MnyQ_hw^Ocq;$Q4m;N-lC`m!>Uc)2D8|Q zwo@a4ErDHASNLPGKqNH8m-Q8nPm*k%PI*it25Fx|1vE^jLW7EEI8$D7UnYM&7G4mE z_^)6pFSiDDthuftL!C|~Od|)Mp-!btMTxJ9z8uXpKP7=y;rIZTEV5a1Pz zE(%64N;qG=a(0t>#=@o;0nMu}CnqrA{_H*Pux>nJFKzFX)JdyZd4R zOlvFnQ(lqYB^zBT4639mrtE)cpw}PqV_>Gj^rnRnk{W}i&{SaE{UD68FONCJ=_L{^+v6u9$2)&!G8qAutc2A{9Sd5*8#WiaCEZsTmChEuu!K z%;sP>$TKx(Si=8}_?rT;*q|kn&pPL(?js|xJlSYEkrxhrp zsYJ3l!#ccFPi+RRq*aiE&TtO|A+Rbu2=0pN8iUr-I#Bg@bxFvZGpNoQ*>JsVxFLm9 zyoFlJB?et8Ig%BON*#ajQZ8L)ke@oRydHn7bE|~!JZJZYt^UZ$z~y~`P-md7A`Plm zvlCX;MFE{Q8?;5zPqPrMapKl6QJsQJ;}hdFcXtQ2_`4TGw)FJ`Lb1kOoq^t1FdXvG zb}T3w?u&E=$~yg_$+5DIKv}4-yL*b4w$gMDh44M*j{x$t@1uXH*PzSQf&;st&KMPn zQ{yn7f%rHMOWGKTgd_F@3W=#tD&r2ONtt+*Nu44zT}tK^2JNORAts&SUYMA3QcQAk z$u#p<8*~kQg2~$z=nljJrllHIp4zk!4x~>m@RJ5zuNK&|y(<`rW`o2H2Hi+E!7NVn zN27s=THT^x)Zc&69f17sdYx`zDoxCKLA;e(xR-90hSNj08Fagxd~Q#8N5D3e^2?nD z-6g+xhG^3VfJqr!c$!5VmJ zAAMG*&l&U}JruY2fTKA<5-{TjD|DA{SSU5;^YjIs9x;FD-{_05De)f59fP3l&Iqg- z#1eg)n=97n^d%?tgm+55)X9;*9OsI~X6H=3bda8uL_Z;6eoD&KVWuewxo`lHkSiwzC0_^W8H2tm zLk@RmcQ}6vjXe@yZt{e@)K5nZI!4DK0I)kN`+9pL0SF54EiE5p35DdMKAld)_1{{D zV`^S{mY$T4X9}^FzCy~P7o~1}ooVh_xw8z~=AoA`C(}Ye;L;@P-|^M759wdM^a_1T zr*BKU{hc@xA*ZO}CrZLGMBqnQu(O_)3k}NO1PT$q( zdj|a{{a4x?WMj<1wbS1XL%6&=(;ypKh8!TtY@1R#)sl%q(&@hq`T_kA7R28vWu585 zK{;XD9|ytBeW6Y{%2XMez;;XT|6}@zPH!0WQ~FtwFGw03O1Bwy*58SUsjPfRic+*Z z^rC-G|HCxaVZEC}p+Kae8)nYdQ!l+qzclE7rN{Py=dBQ0|CWHP{=zH|OP9GTbA$`O&&X$@^IQeKG2FCb9UH(W{gIR{$xmT}h+B6royCto$)u>J` z`82W;WsG2l~Npsgl}Z&-gx8IRL>yulNABI3x*%`gNwv^pAS@XIhw%J%w- zH6ES>5kzgIX2BM$&dcRop>w6dRZ`IklukB;BY`!6NK{dgx@Q#%$t%}U##0QQ%F~b! zV1zaqQ$}MeB3MBrhTv%O+1dX!lF$r;&*Pa`J_bpO0Bn6u(F|x3&o+1t&rN@5l9JMj zAvGyEsPk~GBvF^}2pRqE8H2-mo@elUM!uu(@OSqGmTyjpEaM@2rpz!$1zNmN&ZL29 zX2y{6j8pJ%qa@IjAYci?*%El0ml)j4OOZv#!nU=M(o(Tup`_npa4RoEiX+jM4IoOs zLBQUyu#gPu^YFzGOG|%J-8g@*gm8C3VuB&Rl+!dvevnrq)Z;Z){3nAQUT1K-3U)Sk z_eHlBBHQWHd1E{wwJ=*NBS6@Z4KgyR=S>D*CR4kt?m%cuY%A)yLlW+k(v=Q{3>syd zb&|j{9)?U6Nhh41i*V53Z7NhZgJYe$llDj!`C|buZlUAcbSE!Tb2LSbikX z+wJcRNI)AJGHD2ijxMBOGR7@bnHqoI;4j4Y5oFjVJ=b*UUN(Qp$9{vqBtwa8*v1x9 z^3dl|gCCRFc_2+nP7A3>Qaeb~3u(Cd_Ju+!mcx|D#|XtH8D5u~hT<86zbaE#xjDGd z9}UPI3=bpfA0eewmeM4(o{t)Qj1l?gAhd#k?F#IYHcCc0&GPfJ2A|-Qa;|+HQOl5) zlxOmy%G5k>@C$!(3I?XoxC_c1RdHH9e_hh~M%qS+!%)6#@V`sUU}RdtI}z()1zvuI zzoqlH4gL3|5;n2Ea|$iwuDIhX((Me++*G?D6*|lAA#~3>Bb{@EJ#65eak!J7GiA@NXKlh!HKHpK;(s+rdYcRDNmj|MIV3PNFJ8L5f~J zcn1%^1vT+{`ECBK&c8GG_Y8R+mDb$iQaA!8>D$7=kdmL-XSL~+N^+B3(YiA`)V!4MPW zZgYPYWH=34El#bfLVXWma(ql-$2bz*8u{84CM%quEL%N8|aiY}%a zVw#xFRF!P1fode!0lk^JA{-6wlJr&tB0a&Vm4_@}yR5NoQ(NPLMUcgokI}bI4!&Lv zKGP7hZqs!`fhM2Di znbkI-dP7~Ebx<5l+plr=;O_1Y0Rlk-BnyGXJrB;}Zi~AwZj0L@!8Je<++lG|(4fIx z4$nDN=X>9;ySl2U@88^acUS*0)pPX>w?^2QFM1)GJhxz^Npnd(sPtpyFhQ*4H}kob zl5E_1?ZBZ%8NH@oCkn9)2K|DS3ct56I3I}Fd<;Ky44Ip_)Z4)ORpqORVCEInqJWdm zOo>ci5N6JB3!g2Z{|qw-TuXB3KJ6HFWg)-nR^B2gpVku8UYL<|s%{9wE^i6LlXoBSR>fDMvh*&9mGy_unfS@K-C((GaT_`i z8hQ{4_lefiB#5==ebcvSjhu6|H=1rJC?xzUR%bNVR<7-s%V?{9`MI`jfB;Icz)80b zhf$l2|MH(S)0W-@Lon{Rvy-D|^iKr(aA)*Mxs9jNH@U9TaKx>|W^ig^>8fgz zm)exV?B@RA$u3Y?$nN*hsb6RO+6D^ePS=mGu?U`9x7}5dJLseF8-MKV| zMrX)Wd)KySudAgqw%~EM3Vi^CA#DV8KR4TyZ8BOuZ!N%B(D4$*v)@$g1x$-pH3L&kS#nl%$|V72S*MvlySldGNw*hDg5%1pqi5&Aa@s;e8eO>etj7sm z#`VKe(v#ryosSGXt2;yKm@j4HBS_vrs`lxi5*Yi>Xzc9`hy9qapY`GlhwBkvWUfmI zE;GG7FRF)T1Cm^nN;$=LIBVAhaM%3Q*~@NSmE>7Pu*I?2dzHgko{Ar#Xm%^f5r6{W5;p^rF4J zdwnOc{?)~CLefB@#Z;C**PYqWLQGAvYpP!@`qcd^GJq>PtXaFrjA)&>nLSb6E<-`O z{w3E_9O@bs!w;O+QEUA0kRr)e$EQn6^wyDbCsTcC78X+1kY0%2RKnAOFLvfgXBpx= zaz6pCXG^|&M4y4`mH3FJaF{3gJ0|%>1>2ZNQ zcTDZiuZ!p%EmkUhz>GV=^h>gW+QF3~a$Y9iyhq>6gnJ;V<%3y<5`jZ zvDDuq5tM|IE{7ISYKX*uX}@_NPyK#hrzI35A*i)HONHrxhqU3)4zmoFsP`w}hIkCF z*^5GRmZi4r1XGe8Ow=^<+FGim(?20V}^{rtj0{lZqW{-(zw ziMc20+VPppDIzdVg7j+n!DhNlrL7!j*&II1#>Ry_bK2oME7p3%U<@k`ZpH>jDPhCy zYnF0%tnz2OP;GyL{V92c>~bI!uQVn4mu#_FlG?^U@1)#3lAA|azJGGa-+#M#BOpcC z+0eAI0iWK1W?J~MpU8U2xwsRE5s?myk z9Dnk~dA>J%Z!Hu`Ks4udR&WFBaBsI4G_Kqu?xs+TF*8y&@9_Q(()SAAV^0-jJ9pH@bCxp$LNnX9t=O0>1( zH}das4$|5}iSsy)Z~27!of^uF-gCujuV$Q&R4zx8SQc_xC zeyK>HJ9@9hg>7qFGQZ*CW{TxI15j`arwa#D8i*D*_bng1V7Sd}y98^@lLo%%ol>-n z@^SkJ2Mt93&DYRPYb#EW-<1hop-%Smo^kC@;(Uf+{KRapfsla_+DGRWjivWlJ!4X) z8I9WGk|js8W-6HvZV)gjdP@DRrEu6PUOvbwd&hzDBud8Il>AEs~5-QGIE(+>}c>%e2-x(R)E_^=fsXl?#{Pl)Zh2i!bg5J9qDJ^@CZ^HWxKjaW_k6>TOu zM*>Y0%RZ>f@$$5-edEl&Ye#dA(~fh^019EnPM$!h<`rgyXILwGb?q)4ugG0Z>J}oK z3#`zVG(%Q637q}W0W-4o<_ho0OZ@}Q4xU5AZq{=bcb-CMPp2Qtr8@6EUY%#TXGZNB z$mYfd`ssd!80Hb{%1u7sBhg)uOKZKq@^ZhE_oVDLRQQ00iU~tspwK_3*#GT_ zm-vWRk$*<9zu3r)_y|<#&P4f6h<#&^eIxN4IpKUgRM5D z@&NR1JxpXKV^#&dI@$Bfz`-`GLG>qrGKcAuo3_z0ci-SF^_Ld$0q({@?w^^7RevqX zFEr!MGO0~}v-LZ!8cvh`4Vgn#Fq%j+Ey~>zE_%Ya!_)6+t{n-aY|mKl1?bo01e`owR!th`?2JkZ z7%o`(#Yp$xGr6y30FSaXa{_Xenu~Y(erlhL$|%h#DBBp+EbP@(&GR2GQ=3j`z9%-Z z2j9jO3rE`W9j7~y@e|b4jngz{VEMNL=a8G6>C&jhpWYDIr}Vj!)Gr%BVbE;rJ=?~M z*w;*3I4q;<68NsUsFkl3${QGUZW-@y8W7ZQvwaZ^f2WZbb0GtekjZ$Q>AvpW2b`S! zf)^nR)5trls-?M>7>KcI9Js+Sk4nKr!d|f5s&e0}cIIo|@Fx*>y!;HLo{y<&G_q}w z0S&T`1qi^`#a_VEl;2WhMP&?FDKwCF7YqMm(vjP(BH$Zx{|D9-YEqVWNqJoKx9}Bl zNC}kFopzFY!Y??}?MV1E&9%&<1}R+lqm}kV@R$prC;NC8otK{an2fx!B=<`J_ zF`UwIeuH{A8om9{?58Wju={lt-%Ul0HcI>;j57TNB)_2k>x$uAo|2Xra#YsbAb zeqwTW!FjPJc=yqbU2ID%?*Ir62>#?2EmQKLV(2BRA&adWaB^d_Xp8e!Twkmm(k-|C zuEb4lD`18PB#!qFsb;b5kvHy;j|Mnr7OmA&BWDu$Fs$WaLFZ$1fj_lcWsouHVbNlk zlLyQN9tDQ6%Kd7vnmv$tVxc^NGbrcWSGv_LN%;Xt`;Hot8hcNrVQ zEKBXMJ!!r9@(<+?y*=M5mXu2`CEBvk_x*jNNN0ZPP43wW92o4YHD%L=k4d9R_~ptV zVzwvXy|<$+HQeW5k-IRLFZ)Ruh&!*LJbFvTPcZqOR^?ki&oC&R_#gPyW>_jx|Aye# zU-Bd73moUFB|b>iBOILIrj6HQ(kd;s<0p|v7#`yY3jSK0c?<#4 z!zPrTeBOA(eWkko%}<|x3n+5<1-)QMlXU|mEARj1u#2{Tsqo^!{+!xZ;Kwk|8afan zm-3=p#?Kzl`@Q4SE^Zw?pTQ+d;au2XKR$Q zzz;7;`Prm-5Y?t98Rys`)2Nc;j@t}HBzsI>8y7BwyX!}24M&?O{3L4gc2ASZy&r%3F=u5U-19f1oBU(}<8aPhU7Z{F`klqtPi+)ynKCG?s6Afp^H0PP zr!;yp+6tNXiFy85^6{mpnJ@scdltfNYztWaL%_&p zCA)VaDSg;CRwapS)k4+&#$$$boxh2yULY2Gwc&s=NVgcJhPa@Ttau)zRDvwCFw77{ zV~cE$wT&&>=9sP2_y3+))Z1#KiKdA!F+Y!5K^#jBR)`$#l>~E4TKq@* zbh7a0@u$SjE)EdB=@@&&bpzZ}1DXGT5rCz#FK*brKwO(bM2E}H4G(=tu(dfmrDm|E#$nrH{~*=D}iTsC3@ksn+oFEB)7GyQf5ls*l_Xga4DN=JqoI1pPxJ446!B8o&^av# zBRAGubB&Lc#bG3}jWXak@5~5Y-S4`M_4Cz|&i6NSPex`xO!~rIR$Qc-6`3WVRj3d$* z5E1VYd)w|U6zuVxgL9_;<IxK{g7n> zv6Q(s(0T4?(n}5aO7`Uc$%7F3wilAfa8ejpi}DlsJ&rILavT`#{$~*CUn?&H zMD`E-9M4HS{5}SoA2g0&>Wp(1+I+%Y6})1E+qodCHuo28SpiIQJB}{@-pmWRxpHI9 zJHp|5a?p#&N7jNImn{emmy5I}&T8j=E8lL)0iEr~zNnI=VJn?=29BlE2*-~tj z&~9`i%UhHsa-)b8Cr`Q5LI&vo+qTQ5;KMBs8MY19x;6Nh7i+gzwBpbT<*|1qvFS(a zZ;RhMJXiEv-|C6IkrUI#nz$}vzA^mk-cuf&%MTN(-x14NY+z60fqh;)*TFJ0@X1oN z&a%u_{)eCJsY|?{Hx@5wc86ZZg1vKb$RB)qV{@L~J@x zz7v+lms$r7pHpq637JYMSt|SPDc5SnKES7eSWg^e@aH^mwz<+&`H`McPm5022VK~Q zjl3H>+aHy@JIC(K4{-#vscOJc+mK~~%*G+2E9{|uxq(>iE-C`o#V1l%_KadCjz}>8#P+uZf?n?}PeKek zA*==d`E68Hu8GG&s)V2qB>cj2BO~g|_rUvs*<1OAs6EleomTAe2jUO zZ%@-%ZKMcYpMzLTKB^gQ0p(fE&jF%5msQ-C;FerM>2-w5TcUz;#2&SWC47v|Q>WfA zjpuxpFgFB~cbhOY_Si6I)Km_NAH_kZP4Bxf=KS+@qRDI; zZ#$5G3~$n$u_3gMApRyjL$@FFRFe$*QqooVB)mPGAT?h_DVg{!LdKj1eIRs=2t6!^ z2mGbg17yL(4T!Ma1Xdr3aFW)&jkAmP=^zlRLj5%bO(x0S&d^gfU`o93L}`>J3wE#( zS4I={yR$xGf#D#kX04wmiDAXCSs<w*5-)z<0g-ttpcJ{U=Gqad}&C2&Tcv0_(-5#^YhI z7UcV0c?nM28$oAs=vtZ8p)Ymd|Ix zB6$CoY|bM4t1*sWa_*bWJbwkky{L`v-yUgCc4(?d!E!D4Y}>W3j}ZjhR%c#%!C?9s z-we^18yko>9ojjv_-}k$*lkoxtQN*M0DOlM4$M~aYvS(s;5N;ZokKedmJ%+ogvVxQ zbeHZ--H3z+R_)BxHA(sEQlSBihr$goGi;gKbhvg{vJ-V}n0)d?V_I#$NEGG$^lNhQ z&k@b1n_<29V!%Q-J95WmfC`?Say0N|E)x7lBEvme2 z(_AE*!xqydsab7I&)I|xR%~w3P={0Y`xt~~mhup(HL;d<)zL3zeo`DsH^0Wv+cxCY zlNj@T$a=aCe8lC5o=XsAEPQ_J>@_9(Tj>^E^VsE0cV{aK z+IzE!>>)_Gxi!MDGqoc{FQYJF7o|UMv^wL^w`JVL(TU}l7MmCZ?n0PkJ-g~PEhc%) zUv}c3lyWMa@z-1P_rs5=o4-@qS&js&NN{RrgYtY0=t|#it&G2Zp)T7PzpBCve1_h% zeuG$Zb!SlOLt7blxp})KOtP|K?qX3Q`r{fOfK}TaGdn2UJj$bHlI=KLX&VIn^hyzu zXcsg~9C_Pj(`3AWS!iQ#$175N?wQfg0u{ST8_ZPS;g3;0>7VP^6+hhB^8lj@l}0Z0 zJBj6umBJ0s@0vbQ7JE!9fMT~&elkl{Y4g6Lwn#)l$?~gZ-6l=U#$z=)B_!ED2V^zg zg*O_XyH%SUhh9$n7tLk2m>4lj?+e8QM0jvu&OVPJ<|9fGQAsd zrk6IAW6q?zZaJ+Y4gUJ`p!n(Yk8AVfK$z~Z&|vg#Knyg;+8h|YLI~L|tn{R7Z+aLm zKJNFu4vq#xOVN(qW~-!CxHL?Pr5%)oakqiL4lu@Hg!D31NX;Gw>8z92ST@nOm9k+) zCzL8U+FXmR-Y|#Gxge4ob>>!O&H}@Qu5**1T@k=wM9u={dhyx0yZRc^l&cv9&=d18 zYD#XjQ4HfG^#S7+lthbA-6{KA6>s{CZ@=X=D*%256cs-r%MISLogeQZC7SY+oYkS< ziYebEo{wk*FuH1@&oApDj6t-^Xo^&iIkKy0$|RQIO&WePE@o>5J6!OsLdhE0wfPvX zi$Ha^OdXq#7erjbDi+;#I;Kk1#cZFp37j~E2-#?Pr91@e z8wLTL*=5}$61E8vX%!N-wr-TLUH1f$a=+>>p9*XT3ad!oy|zVxPC-9U+l^$;e+)naQXAeV%5cI3fRpjzS8Oy`qkz-?2;qM}GWgS?yEwCs`qo0*? zKy{cAlT8gwn_()#Q)}PIGPU7X)u7#$Hv6>f&!#i)3wngygkRMof^se;^Gg|)^Zj+| zzwJ5c7W6BqMMN&-DKN*Lg0j~mUBRV{B8YZknr|0I%p(oa_G`C_ik_k>>?opTPqM$I zB9FsP$b{w-sFfBBb}qEr3)VR&L}M*=&ioto%t-k7V`*XDg`5XEwuPMSHJ^()+pA}Y z^j$Lp(`Gx$k_JW6RE^;kt0H;3ZB`nPLn(vf><`AZ`ou2dW%kByfAAKJBEh2Tr5}mJ zIPAR|MfJJ7Y>HoxiR&YXo3z8(InOUn0gjHf;o2;@uRARuiESU!&r1iyc-NAabkog4 z0`8uV6I8vtDZ1Rmm6WlwjIr8sJDM(pKQnnET}EYH!b2?(?*W>`*xWHo%d_51y%~k^ zmkx4{9G91|Bxz3;AMLM3!@!r$h=TYV4V3LpdhkhjDJ9NnH7WFv#m8LTlIP3LNl%y1 zZUY{2gTG_e6wd7`8-9|#{+!zRNb=$$qma=z6^9gt2(;*$Am$rnii@!YS;?M}^*B9t zzK{;lBxexwPY(`~c3$L{N8y1vM9_W-mM&RSX(+EJD7ef4jW2Ze1iY-2(cxPGCn@5o z9i_2O($Xg2^;(_K^^2O3L8;-g3~8}}YcE<%u`IivrIWN6DJ)qnmR$_Nr?gvR!Va}= z-dwPA?Sy_ie&NNWAcqWU{YvwC=6N1(l?v5eO5n^)AfB+@aC4r3<;Fjv3qNbYyOUQ0idjKDdPOKGmJ3aLrOqNb0xjS_6qE45Qh4q(L!D1_NEI(ZT5)Ul;YUyH? zaGYq}1hUFC96-D@??gwoRw^_9%JMpsjc);%Sij|vo=ea6L+k63coc@L%M2kl-M38X zj86dBye|-6Ew;IXW9DuwjPC|Dc%~nzB-4{Z=M0fTiT{YO(9~6q?FXn7D|hyGPj{q3K+Kt>=P4(;IctAwil^aS#`!y z8()Mee@oh59kgpmlT}(ne0en|OAnTc))Ll7n@E;bfhINi_H&KK(qa{REC=l$q@NC! zD)SMqR*UlGu2yUFr4J}{CP(Lls`3Nuy7HEJk5#WcMVdY1J@bG!ACA$EO-L}mUQ-+g zh8=akApeV!4?;!8fAGAbO(On_kT(LH1dtS8D|!h3k+5Iu@6{Ddbre5q zeE@tCnr)mFLV1PJ(J}aJkL}T4t*Ea>Lk$s$7~%i_1OhVQB9Hg4r~d)iA#|=X^#3*~ z4&!HuAt4|*pdcV{{6`=JgfbxrqBIxe#TDoO3jedml>a3Z7KJ3fqvrl!LG_qphjLsH z5fDOOy$k)<4Kn{g;y@yhd$<4R*@eniZu3=`i;RH4{9i%>D~O2`>%T(zfBX8ML;QCl d{wFEe{MWQ-sG*|$Yeav|G_T>qUd;#y{|8s#O921? diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 80d6f54..3037315 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -2,7 +2,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.1 -bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.0 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.2 bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= -bld.version=1.9.1 +bld.version=2.0.0-SNAPSHOT diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 5e687e0..f8d441e 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -24,8 +24,7 @@ import rife.bld.publish.PublishScm; import java.util.List; -import static rife.bld.dependencies.Repository.MAVEN_CENTRAL; -import static rife.bld.dependencies.Repository.RIFE2_RELEASES; +import static rife.bld.dependencies.Repository.*; import static rife.bld.dependencies.Scope.compile; import static rife.bld.dependencies.Scope.test; import static rife.bld.operations.JavadocOptions.DocLinkOption.NO_MISSING; @@ -39,15 +38,15 @@ public class DetektOperationBuild extends Project { javaRelease = 17; downloadSources = true; autoDownloadPurge = true; - repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES); + repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS); scope(compile) - .include(dependency("com.uwyn.rife2", "bld", version(1, 9, 1))) + .include(dependency("com.uwyn.rife2", "bld", version(2, 0, 0, "SNAPSHOT"))) .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 6))); scope(test) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 2))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 2))) - .include(dependency("org.assertj", "assertj-core", version(3, 26, 0))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 3))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3))) + .include(dependency("org.assertj", "assertj-core", version(3, 26, 3))); javadocOperation() .javadocOptions() .author() @@ -89,7 +88,7 @@ public class DetektOperationBuild extends Project { } @BuildCommand(summary = "Checks source code with PMD") - public void pmd() { + public void pmd() throws Exception { new PmdOperation() .fromProject(this) .ruleSets("config/pmd.xml") From 8b02e1e45a264b04273af5d294fc446314d2b936 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 22 Jul 2024 16:30:11 -0700 Subject: [PATCH 25/65] Ensured exit status is set on failure --- README.md | 4 + .../rife/bld/extension/DetektOperation.java | 263 +++++++++--------- .../bld/extension/DetektOperationTest.java | 15 +- 3 files changed, 147 insertions(+), 135 deletions(-) diff --git a/README.md b/README.md index c983fff..3798237 100755 --- a/README.md +++ b/README.md @@ -45,3 +45,7 @@ public void detektBaseline() throws ExitStatusException, IOException, Interrupte - [View Examples Project](https://github.com/rife2/bld-detekt/tree/main/examples) Please check the [DetektOperation documentation](https://rife2.github.io/bld-detekt/rife/bld/extension/DetektOperation.html#method-summary) for all available configuration options. + +## Template Project + +There is also a [Kotlin Template Project](https://github.com/rife2/kotlin-bld-example) with support for [Dokka](https://github.com/rife2/bld-dokka) and the Detekt extensions. diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index b1d1bf1..97aecc5 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -21,7 +21,6 @@ import rife.bld.extension.detekt.Report; import rife.bld.extension.detekt.ReportId; import rife.bld.operations.AbstractProcessOperation; import rife.bld.operations.exceptions.ExitStatusException; -import rife.tools.exceptions.FileUtilsErrorException; import java.io.File; import java.io.IOException; @@ -60,6 +59,7 @@ public class DetektOperation extends AbstractProcessOperation { private final Collection classpath_ = new ArrayList<>(); private final Collection config_ = new ArrayList<>(); private final Collection excludes_ = new ArrayList<>(); + private final Collection includes_ = new ArrayList<>(); private final Collection input_ = new ArrayList<>(); private final Collection plugins_ = new ArrayList<>(); private final Collection report_ = new ArrayList<>(); @@ -73,7 +73,6 @@ public class DetektOperation extends AbstractProcessOperation { private boolean debug_; private boolean disableDefaultRuleSets_; private boolean generateConfig_; - private final Collection includes_ = new ArrayList<>(); private String jdkHome_; private String jvmTarget_; private String languageVersion_; @@ -348,20 +347,26 @@ public class DetektOperation extends AbstractProcessOperation { /** * Performs the operation. * - * @throws InterruptedException when the operation was interrupted - * @throws IOException when an exception occurred during the execution of the process - * @throws FileUtilsErrorException when an exception occurred during the retrieval of the operation output - * @throws ExitStatusException when the exit status was changed during the operation + * @throws InterruptedException when the operation was interrupted + * @throws IOException when an exception occurred during the execution of the process + * @throws ExitStatusException when the exit status was changed during the operation */ @Override - public void execute() throws IOException, FileUtilsErrorException, InterruptedException, ExitStatusException { - super.execute(); - if (successful_ && LOGGER.isLoggable(Level.INFO)) { - if (createBaseline_) { - LOGGER.info("Detekt baseline generated successfully: " - + "file://" + new File(baseline_).toURI().getPath()); - } else { - LOGGER.info("Detekt operation finished successfully."); + public void execute() throws IOException, InterruptedException, ExitStatusException { + if (project_ == null) { + if (LOGGER.isLoggable(Level.SEVERE) && !silent()) { + LOGGER.severe("A project must be specified."); + } + throw new ExitStatusException(ExitStatusException.EXIT_FAILURE); + } else { + super.execute(); + if (successful_ && LOGGER.isLoggable(Level.INFO) && !silent()){ + if (createBaseline_) { + LOGGER.info("Detekt baseline generated successfully: " + + "file://" + new File(baseline_).toURI().getPath()); + } else { + LOGGER.info("Detekt operation finished successfully."); + } } } } @@ -372,144 +377,142 @@ public class DetektOperation extends AbstractProcessOperation { */ @Override protected List executeConstructProcessCommandList() { - if (project_ == null) { - LOGGER.severe("A project must be specified."); - } - final List args = new ArrayList<>(); - args.add(javaTool()); - args.add("-cp"); - args.add(getDetektJarList(project_.libBldDirectory())); - args.add("io.gitlab.arturbosch.detekt.cli.Main"); + if (project_ != null) { + args.add(javaTool()); + args.add("-cp"); + args.add(getDetektJarList(project_.libBldDirectory())); + args.add("io.gitlab.arturbosch.detekt.cli.Main"); - // all-rules - if (allRules_) { - args.add("--all-rules"); - } + // all-rules + if (allRules_) { + args.add("--all-rules"); + } - // auto-correct - if (autoCorrect_) { - args.add("--auto-correct"); - } + // auto-correct + if (autoCorrect_) { + args.add("--auto-correct"); + } - // base-path - if (isNotBlank(basePath_)) { - args.add("--base-path"); - args.add(basePath_); - } + // base-path + if (isNotBlank(basePath_)) { + args.add("--base-path"); + args.add(basePath_); + } - // baseline - if (isNotBlank(baseline_)) { - args.add("--baseline"); - args.add(baseline_); - } + // baseline + if (isNotBlank(baseline_)) { + args.add("--baseline"); + args.add(baseline_); + } - // build-upon-default-config - if (buildUponDefaultConfig_) { - args.add("--build-upon-default-config"); - } + // build-upon-default-config + if (buildUponDefaultConfig_) { + args.add("--build-upon-default-config"); + } - // classpath - if (!classpath_.isEmpty()) { - args.add("--classpath"); - args.add(String.join(File.pathSeparator, classpath_.stream().map(File::getAbsolutePath).toList())); - } + // classpath + if (!classpath_.isEmpty()) { + args.add("--classpath"); + args.add(String.join(File.pathSeparator, classpath_.stream().map(File::getAbsolutePath).toList())); + } - // config - if (!config_.isEmpty()) { - args.add("-config"); - args.add(String.join(";", config_.stream().map(File::getAbsolutePath).toList())); - } + // config + if (!config_.isEmpty()) { + args.add("-config"); + args.add(String.join(";", config_.stream().map(File::getAbsolutePath).toList())); + } - // config-resource - if (isNotBlank(configResource_)) { - args.add("--config-resource"); - args.add(configResource_); - } + // config-resource + if (isNotBlank(configResource_)) { + args.add("--config-resource"); + args.add(configResource_); + } - // create-baseline - if (createBaseline_) { - args.add("--create-baseline"); - } + // create-baseline + if (createBaseline_) { + args.add("--create-baseline"); + } - // debug - if (debug_) { - args.add("--debug"); - } + // debug + if (debug_) { + args.add("--debug"); + } - // disable-default-rulesets - if (disableDefaultRuleSets_) { - args.add("--disable-default-rulesets"); - } + // disable-default-rulesets + if (disableDefaultRuleSets_) { + args.add("--disable-default-rulesets"); + } - // excludes - if (!excludes_.isEmpty()) { - args.add("--excludes"); - args.add(String.join(",", excludes_)); - } + // excludes + if (!excludes_.isEmpty()) { + args.add("--excludes"); + args.add(String.join(",", excludes_)); + } - // generate-config - if (generateConfig_) { - args.add("--generate-config"); - } + // generate-config + if (generateConfig_) { + args.add("--generate-config"); + } - // includes - if (!includes_.isEmpty()) { - args.add("--includes"); - args.add(String.join(",", includes_)); - } + // includes + if (!includes_.isEmpty()) { + args.add("--includes"); + args.add(String.join(",", includes_)); + } - // input - if (!input_.isEmpty()) { - args.add("--input"); - args.add(String.join(",", input_.stream().map(File::getAbsolutePath).toList())); - } + // input + if (!input_.isEmpty()) { + args.add("--input"); + args.add(String.join(",", input_.stream().map(File::getAbsolutePath).toList())); + } - // jdk-home - if (isNotBlank(jdkHome_)) { - args.add("--jdk-home"); - args.add(jdkHome_); - } + // jdk-home + if (isNotBlank(jdkHome_)) { + args.add("--jdk-home"); + args.add(jdkHome_); + } - // jvm-target - if (isNotBlank(jvmTarget_)) { - args.add("--jvm-target"); - args.add(jvmTarget_); - } + // jvm-target + if (isNotBlank(jvmTarget_)) { + args.add("--jvm-target"); + args.add(jvmTarget_); + } - // language-version - if (isNotBlank(languageVersion_)) { - args.add("--language-version"); - args.add(languageVersion_); - } + // language-version + if (isNotBlank(languageVersion_)) { + args.add("--language-version"); + args.add(languageVersion_); + } - // max-issues - if (maxIssues_ > 0) { - args.add("--max-issues"); - args.add(String.valueOf(maxIssues_)); - } + // max-issues + if (maxIssues_ > 0) { + args.add("--max-issues"); + args.add(String.valueOf(maxIssues_)); + } - // parallel - if (parallel_) { - args.add("--parallel"); - } + // parallel + if (parallel_) { + args.add("--parallel"); + } - // plugins - if (!plugins_.isEmpty()) { - args.add("--plugins"); - args.add(String.join(",", plugins_.stream().map(File::getAbsolutePath).toList())); - } + // plugins + if (!plugins_.isEmpty()) { + args.add("--plugins"); + args.add(String.join(",", plugins_.stream().map(File::getAbsolutePath).toList())); + } - // report - if (!report_.isEmpty()) { - report_.forEach(it -> { - args.add("--report"); - args.add(it.id().name().toLowerCase() + ":" + it.path()); - }); - } + // report + if (!report_.isEmpty()) { + report_.forEach(it -> { + args.add("--report"); + args.add(it.id().name().toLowerCase() + ":" + it.path()); + }); + } - if (LOGGER.isLoggable(Level.FINE)) { - LOGGER.fine(String.join(" ", args.stream().filter(this::isNotBlank).toList())); + if (LOGGER.isLoggable(Level.FINE) && !silent()) { + LOGGER.fine(String.join(" ", args.stream().filter(this::isNotBlank).toList())); + } } return args; @@ -551,9 +554,7 @@ public class DetektOperation extends AbstractProcessOperation { return this; } - /* - * Retrieves the matching JARs files from the given directory. - */ + // Retrieves the matching JARs files from the given directory. private String getDetektJarList(File directory) { var jars = new ArrayList(); diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index 760d824..c45b3fa 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -61,6 +61,7 @@ class DetektOperationTest { } @Test + @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops") void testCheckAllParameters() throws IOException { var args = Files.readAllLines(Paths.get("src", "test", "resources", "detekt-args.txt")); @@ -108,10 +109,10 @@ class DetektOperationTest { for (var i = 1; i < 6; i++) { assertThat(op.classPath()).as("classPath[" + i + ']').hasSize(5).contains(new File("path" + i)); - assertThat(op.config()).as("config[" + i + ']').hasSize(5).contains(new File("config" + i)); - assertThat(op.includes()).as("includes[" + i + ']').hasSize(5).contains("includes" + i); - assertThat(op.input()).as("input[" + i + ']').hasSize(5).contains(new File("input" + i)); - assertThat(op.plugins()).as("plugins[" + i + ']').hasSize(5).contains(new File("jar" + i)); + assertThat(op.config()).as("config[" + i + ']').hasSize(5).contains(new File("config" + i)); + assertThat(op.includes()).as("includes[" + i + ']').hasSize(5).contains("includes" + i); + assertThat(op.input()).as("input[" + i + ']').hasSize(5).contains(new File("input" + i)); + assertThat(op.plugins()).as("plugins[" + i + ']').hasSize(5).contains(new File("jar" + i)); } var params = op.executeConstructProcessCommandList(); @@ -190,4 +191,10 @@ class DetektOperationTest { .debug(true); assertThatThrownBy(op::execute).isInstanceOf(ExitStatusException.class); } + + @Test + void testExecuteNoProject() { + var op = new DetektOperation(); + assertThatCode(op::execute).isInstanceOf(ExitStatusException.class); + } } From e4ccacab603f593efdfd8e97ac7a6957ab73c43d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 29 Jul 2024 16:05:08 -0700 Subject: [PATCH 26/65] Bumped bld to version 2.0.1 --- .idea/bld.xml | 6 ++++++ .idea/libraries/bld.xml | 4 ++-- .vscode/settings.json | 2 +- README.md | 2 +- examples/.idea/libraries/bld.xml | 4 ++-- examples/.vscode/settings.json | 2 +- examples/lib/bld/bld-wrapper.jar | Bin 29519 -> 29577 bytes examples/lib/bld/bld-wrapper.properties | 4 ++-- lib/bld/bld-wrapper.jar | Bin 29769 -> 29577 bytes lib/bld/bld-wrapper.properties | 6 +++--- .../bld/extension/DetektOperationBuild.java | 2 +- 11 files changed, 19 insertions(+), 13 deletions(-) create mode 100644 .idea/bld.xml diff --git a/.idea/bld.xml b/.idea/bld.xml new file mode 100644 index 0000000..6600cee --- /dev/null +++ b/.idea/bld.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/libraries/bld.xml b/.idea/libraries/bld.xml index 2fb5ff0..4dd96bf 100644 --- a/.idea/libraries/bld.xml +++ b/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/.vscode/settings.json b/.vscode/settings.json index 33a9922..5b2667b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,7 @@ ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-2.0.0-SNAPSHOT.jar", + "${HOME}/.bld/dist/bld-2.0.1.jar", "lib/**/*.jar" ] } diff --git a/README.md b/README.md index 3798237..46e298b 100755 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Java](https://img.shields.io/badge/java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) -[![bld](https://img.shields.io/badge/1.9.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) +[![bld](https://img.shields.io/badge/2.0.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) [![Release](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/releases/com/uwyn/rife2/bld-detekt/maven-metadata.xml?color=blue)](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-detekt) [![Snapshot](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/snapshots/com/uwyn/rife2/bld-detekt/maven-metadata.xml?label=snapshot)](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-detekt) [![GitHub CI](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml/badge.svg)](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml) diff --git a/examples/.idea/libraries/bld.xml b/examples/.idea/libraries/bld.xml index 2fb5ff0..4dd96bf 100644 --- a/examples/.idea/libraries/bld.xml +++ b/examples/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index 33a9922..5b2667b 100644 --- a/examples/.vscode/settings.json +++ b/examples/.vscode/settings.json @@ -9,7 +9,7 @@ ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-2.0.0-SNAPSHOT.jar", + "${HOME}/.bld/dist/bld-2.0.1.jar", "lib/**/*.jar" ] } diff --git a/examples/lib/bld/bld-wrapper.jar b/examples/lib/bld/bld-wrapper.jar index 3f131d137922e617f602bce7e977bc7bae387351..32bac6a95c10a898fbdf48f8337e4aca5fce84a3 100644 GIT binary patch delta 27394 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 delta 27444 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 diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index c865830..626d67b 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -2,7 +2,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.5-SNAPSHOT -bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.0-SNAPSHOT +bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.0 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= -bld.version=2.0.0-SNAPSHOT +bld.version=2.0.1 diff --git a/lib/bld/bld-wrapper.jar b/lib/bld/bld-wrapper.jar index 725cdf3fb47c05b431e01978e7bcd820f25cf3e9..f8367702094b7f427b8edca2074e69dd736e49a2 100644 GIT binary patch delta 27511 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

      S9bPTvT?%WYeajTqnu`dj`IpM))Vc6SaJT!Cg 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 Date: Mon, 29 Jul 2024 16:14:29 -0700 Subject: [PATCH 27/65] Version 0.9.5 --- examples/lib/bld/bld-wrapper.properties | 2 +- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 626d67b..765309b 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,7 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.5-SNAPSHOT +bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.5 bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.0 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 5de5b0d..e4e17fb 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -33,7 +33,7 @@ public class DetektOperationBuild extends Project { public DetektOperationBuild() { pkg = "rife.bld.extension"; name = "DetektOperation"; - version = version(0, 9, 5, "SNAPSHOT"); + version = version(0, 9, 5); javaRelease = 17; downloadSources = true; From cf385a58cb338ef1c98a6a4d4378ecd270ba9090 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 9 Aug 2024 17:59:02 -0700 Subject: [PATCH 28/65] Bumped Kotlin to version 2.0.10 --- examples/src/bld/java/com/example/ExampleBuild.java | 2 +- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index b877e17..e781ab2 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -31,7 +31,7 @@ public class ExampleBuild extends Project { repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES); - final var kotlin = version(2, 0, 0); + final var kotlin = version(2, 0, 10); scope(compile) .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin)); scope(test) diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index e4e17fb..db49fbe 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -33,7 +33,7 @@ public class DetektOperationBuild extends Project { public DetektOperationBuild() { pkg = "rife.bld.extension"; name = "DetektOperation"; - version = version(0, 9, 5); + version = version(0, 9, 6, "SNAPSHOT"); javaRelease = 17; downloadSources = true; From 0a989544ae7664d5c72bb11383ef408f9353368c Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 28 Aug 2024 00:12:18 -0700 Subject: [PATCH 29/65] Bumped JUnit to version 5.11.0 --- examples/src/bld/java/com/example/ExampleBuild.java | 4 ++-- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index e781ab2..7b763b8 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -36,8 +36,8 @@ public class ExampleBuild extends Project { .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin)); scope(test) .include(dependency("org.jetbrains.kotlin", "kotlin-test-junit5", kotlin)) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 3))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 0))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 0))); // Include the Kotlin source directory when creating or publishing sources Java Archives jarSourcesOperation().sourceDirectories(new File(srcMainDirectory(), "kotlin")); diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index db49fbe..549abd4 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -44,8 +44,8 @@ public class DetektOperationBuild extends Project { .include(dependency("com.uwyn.rife2", "bld", version(2, 0, 1))) .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 6))); scope(test) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 3))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3))) + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 0))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 0))) .include(dependency("org.assertj", "assertj-core", version(3, 26, 3))); javadocOperation() .javadocOptions() From c6307577aae470e3dce6a9da824c38133924a160 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 28 Aug 2024 00:12:35 -0700 Subject: [PATCH 30/65] Bumped Kotlin to version 2.0.20 --- examples/src/bld/java/com/example/ExampleBuild.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index 7b763b8..483f73f 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -31,7 +31,7 @@ public class ExampleBuild extends Project { repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES); - final var kotlin = version(2, 0, 10); + final var kotlin = version(2, 0, 20); scope(compile) .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin)); scope(test) From 324fc48c409de800aaed646c3b7e6e3da21ca513 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 28 Aug 2024 00:12:55 -0700 Subject: [PATCH 31/65] Cleaned up API to match bld operations and options APIs --- examples/lib/bld/bld-wrapper.properties | 4 +- .../rife/bld/extension/DetektOperation.java | 234 ++++++++++++++++-- .../bld/extension/DetektOperationTest.java | 165 ++++++++++++ 3 files changed, 374 insertions(+), 29 deletions(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 765309b..d6daa69 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,8 +1,8 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.5 -bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.0 +bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.6-SNAPSHOT +bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.1-SNAPSHOT bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=2.0.1 diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index 97aecc5..e0b6f21 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -24,8 +24,8 @@ import rife.bld.operations.exceptions.ExitStatusException; import java.io.File; import java.io.IOException; +import java.nio.file.Path; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.logging.Level; @@ -55,7 +55,7 @@ public class DetektOperation extends AbstractProcessOperation { "sarif4k-jvm-", "snakeyaml-engine-", "trove4j-"); - private static final Logger LOGGER = Logger.getLogger(Report.class.getName()); + private static final Logger LOGGER = Logger.getLogger(DetektOperation.class.getName()); private final Collection classpath_ = new ArrayList<>(); private final Collection config_ = new ArrayList<>(); private final Collection excludes_ = new ArrayList<>(); @@ -128,8 +128,28 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation basePath(File path) { - basePath_ = path.getAbsolutePath(); - return this; + return basePath(path.getAbsolutePath()); + } + + /** + * Retrieves the base path. + * + * @return the directory path + */ + public String basePath() { + return basePath_; + } + + /** + * Specifies a directory as the base path. Currently, it impacts all file + * paths in the formatted reports. File paths in console output and txt + * report are not affected and remain as absolute paths. + * + * @param path the directory path + * @return this operation instance + */ + public DetektOperation basePath(Path path) { + return basePath(path.toFile()); } /** @@ -152,8 +172,27 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation baseline(File baseline) { - baseline_ = baseline.getAbsolutePath(); - return this; + return baseline(baseline.getAbsolutePath()); + } + + /** + * If a baseline xml file is passed in, only new code smells not in the + * baseline are printed in the console. + * + * @param baseline the baseline xml file + * @return this operation instance + */ + public DetektOperation baseline(Path baseline) { + return baseline(baseline.toFile()); + } + + /** + * Retrieves the baseline xml file. + * + * @return the baseline xml file + */ + public String baseline() { + return baseline_; } /** @@ -177,8 +216,18 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation classPath(File... paths) { - classpath_.addAll(List.of(paths)); - return this; + return classPath(List.of(paths)); + } + + /** + * EXPERIMENTAL: Paths where to find user class files and jar dependencies. + * Used for type resolution. + * + * @param paths one or more files + * @return this operation instance + */ + public DetektOperation classPath(Path... paths) { + return classPathPaths(List.of(paths)); } /** @@ -189,8 +238,7 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation classPath(String... paths) { - classpath_.addAll(Arrays.stream(paths).map(File::new).toList()); - return this; + return classPathStrings(List.of(paths)); } @@ -216,13 +264,26 @@ public class DetektOperation extends AbstractProcessOperation { } /** - * Paths to the config files ({@code path/to/config.yml}). + * EXPERIMENTAL: Paths where to find user class files and jar dependencies. + * Used for type resolution. * - * @param configs one or more config files + * @param paths the paths * @return this operation instance */ - public DetektOperation config(File... configs) { - config_.addAll(List.of(configs)); + public DetektOperation classPathPaths(Collection paths) { + classpath_.addAll(paths.stream().map(Path::toFile).toList()); + return this; + } + + /** + * EXPERIMENTAL: Paths where to find user class files and jar dependencies. + * Used for type resolution. + * + * @param paths the paths + * @return this operation instance + */ + public DetektOperation classPathStrings(Collection paths) { + classpath_.addAll(paths.stream().map(File::new).toList()); return this; } @@ -232,11 +293,31 @@ public class DetektOperation extends AbstractProcessOperation { * @param configs one or more config files * @return this operation instance */ - public DetektOperation config(String... configs) { - config_.addAll(Arrays.stream(configs).map(File::new).toList()); - return this; + public DetektOperation config(File... configs) { + return config(List.of(configs)); } + /** + * Paths to the config files ({@code path/to/config.yml}). + * + * @param configs one or more config files + * @return this operation instance + */ + public DetektOperation config(Path... configs) { + return configPaths(List.of(configs)); + } + + /** + * Paths to the config files ({@code path/to/config.yml}). + * + * @param configs one or more config files + * @return this operation instance + */ + public DetektOperation config(String... configs) { + return configStrings(List.of(configs)); + } + + /** * Paths to the config files ({@code path/to/config.yml}). * @@ -257,6 +338,17 @@ public class DetektOperation extends AbstractProcessOperation { return config_; } + /** + * Paths to the config files ({@code path/to/config.yml}). + * + * @param configs the config files + * @return this operation instance + */ + public DetektOperation configPaths(Collection configs) { + config_.addAll(configs.stream().map(Path::toFile).toList()); + return this; + } + /** * Path to the config resource on detekt's classpath ({@code path/to/config.yml}). * @@ -275,7 +367,36 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation configResource(File resource) { - configResource_ = resource.getAbsolutePath(); + return configResource(resource.getAbsolutePath()); + } + + /** + * Path to the config resource on detekt's classpath ({@code path/to/config.yml}). + * + * @param resource the config resource path + * @return this operation instance + */ + public DetektOperation configResource(Path resource) { + return configResource(resource.toFile()); + } + + /** + * Retrieves the path of the config resource. + * + * @return the config resource path + */ + public String configResource() { + return configResource_; + } + + /** + * Paths to the config files ({@code path/to/config.yml}). + * + * @param configs the config files + * @return this operation instance + */ + public DetektOperation configStrings(Collection configs) { + config_.addAll(configs.stream().map(File::new).toList()); return this; } @@ -360,7 +481,7 @@ public class DetektOperation extends AbstractProcessOperation { throw new ExitStatusException(ExitStatusException.EXIT_FAILURE); } else { super.execute(); - if (successful_ && LOGGER.isLoggable(Level.INFO) && !silent()){ + if (successful_ && LOGGER.isLoggable(Level.INFO) && !silent()) { if (createBaseline_) { LOGGER.info("Detekt baseline generated successfully: " + "file://" + new File(baseline_).toURI().getPath()); @@ -627,8 +748,7 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation input(String... paths) { - input_.addAll(Arrays.stream(paths).map(File::new).toList()); - return this; + return inputStrings(List.of(paths)); } /** @@ -638,10 +758,18 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation input(File... paths) { - input_.addAll(List.of(paths)); - return this; + return input(List.of(paths)); } + /** + * Input paths to analyze. If not specified the current working directory is used. + * + * @param paths one or more paths + * @return this operation instance + */ + public DetektOperation input(Path... paths) { + return inputPaths(List.of(paths)); + } /** * Returns the input paths to analyze. @@ -652,6 +780,28 @@ public class DetektOperation extends AbstractProcessOperation { return input_; } + /** + * Input paths to analyze. If not specified the current working directory is used. + * + * @param paths the paths + * @return this operation instance + */ + public DetektOperation inputPaths(Collection paths) { + input_.addAll(paths.stream().map(Path::toFile).toList()); + return this; + } + + /** + * Input paths to analyze. If not specified the current working directory is used. + * + * @param paths the paths + * @return this operation instance + */ + public DetektOperation inputStrings(Collection paths) { + input_.addAll(paths.stream().map(File::new).toList()); + return this; + } + /* * Determines if a string is not blank. */ @@ -731,8 +881,7 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation plugins(String... jars) { - plugins_.addAll(Arrays.stream(jars).map(File::new).toList()); - return this; + return pluginsStrings(List.of(jars)); } /** @@ -742,8 +891,17 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation plugins(File... jars) { - plugins_.addAll(List.of(jars)); - return this; + return plugins(List.of(jars)); + } + + /** + * Extra paths to plugin jars. + * + * @param jars one or more jars + * @return this operation instance + */ + public DetektOperation plugins(Path... jars) { + return pluginsPaths(List.of(jars)); } /** @@ -766,6 +924,28 @@ public class DetektOperation extends AbstractProcessOperation { return plugins_; } + /** + * Extra paths to plugin jars. + * + * @param jars the jars paths + * @return this operation instance + */ + public DetektOperation pluginsPaths(Collection jars) { + plugins_.addAll(jars.stream().map(Path::toFile).toList()); + return this; + } + + /** + * Extra paths to plugin jars. + * + * @param jars the jars paths + * @return this operation instance + */ + public DetektOperation pluginsStrings(Collection jars) { + plugins_.addAll(jars.stream().map(File::new).toList()); + return this; + } + /** * Generates a report for given {@link ReportId report-id} and stores it on given 'path'. * diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index c45b3fa..24e20ae 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -60,6 +60,36 @@ class DetektOperationTest { } } + @Test + void testBasePath() { + var foo = new File("foo"); + var bar = new File("bar"); + + var op = new DetektOperation().basePath(foo); + assertThat(op.basePath()).as("as file").isEqualTo(foo.getAbsolutePath()); + + op = op.basePath(bar.toPath()); + assertThat(op.basePath()).as("as path").isEqualTo(bar.getAbsolutePath()); + + op = new DetektOperation().basePath("foo"); + assertThat(op.basePath()).as("as string").isEqualTo("foo"); + } + + @Test + void testBaseline() { + var foo = new File("foo"); + var bar = new File("bar"); + + var op = new DetektOperation().baseline(foo); + assertThat(op.baseline()).as("as file").isEqualTo(foo.getAbsolutePath()); + + op = op.baseline(bar.toPath()); + assertThat(op.baseline()).as("as path").isEqualTo(bar.getAbsolutePath()); + + op = new DetektOperation().baseline("foo"); + assertThat(op.baseline()).as("as string").isEqualTo("foo"); + } + @Test @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops") void testCheckAllParameters() throws IOException { @@ -129,6 +159,81 @@ class DetektOperationTest { } } + @Test + void testClassPath() { + var foo = new File("foo"); + var bar = new File("bar"); + + var op = new DetektOperation().classPath("foo", "bar"); + assertThat(op.classPath()).as("String...").contains(foo, bar); + op.classPath().clear(); + + op = op.classPath(foo, bar); + assertThat(op.classPath()).as("File...").contains(foo, bar); + op.classPath().clear(); + + op = op.classPath(foo.toPath(), bar.toPath()); + assertThat(op.classPath()).as("Path...").contains(foo, bar); + op.classPath().clear(); + + op = op.classPathStrings(List.of("foo", "bar")); + assertThat(op.classPath()).as("List(String...)").contains(foo, bar); + op.classPath().clear(); + + op = op.classPath(List.of(foo, bar)); + assertThat(op.classPath()).as("File...").contains(foo, bar); + op.classPath().clear(); + + op = op.classPathPaths(List.of(foo.toPath(), bar.toPath())); + assertThat(op.classPath()).as("Path...").contains(foo, bar); + op.classPath().clear(); + } + + @Test + void testConfig() { + var foo = new File("foo"); + var bar = new File("bar"); + + var op = new DetektOperation().config("foo", "bar"); + assertThat(op.config()).as("String...").contains(foo, bar); + op.config().clear(); + + op = op.config(foo, bar); + assertThat(op.config()).as("File...").contains(foo, bar); + op.config().clear(); + + op = op.config(foo.toPath(), bar.toPath()); + assertThat(op.config()).as("Path...").contains(foo, bar); + op.config().clear(); + + op = op.configStrings(List.of("foo", "bar")); + assertThat(op.config()).as("List(String...)").contains(foo, bar); + op.config().clear(); + + op = op.config(List.of(foo, bar)); + assertThat(op.config()).as("File...").contains(foo, bar); + op.config().clear(); + + op = op.configPaths(List.of(foo.toPath(), bar.toPath())); + assertThat(op.config()).as("Path...").contains(foo, bar); + op.config().clear(); + } + + @Test + void testConfigResource() { + var foo = new File("foo"); + var bar = new File("bar"); + + var op = new DetektOperation().configResource(foo); + assertThat(op.configResource()).as("as file").isEqualTo(foo.getAbsolutePath()); + + op = op.configResource(bar.toPath()); + assertThat(op.configResource()).as("as path").isEqualTo(bar.getAbsolutePath()); + + op = new DetektOperation().configResource("foo"); + assertThat(op.configResource()).as("as string").isEqualTo("foo"); + } + @Test void testExampleBaseline() throws IOException, ExitStatusException, InterruptedException { var tmpDir = Files.createTempDirectory("bld-detekt-").toFile(); @@ -197,4 +302,64 @@ class DetektOperationTest { var op = new DetektOperation(); assertThatCode(op::execute).isInstanceOf(ExitStatusException.class); } + + @Test + void testInput() { + var foo = new File("foo"); + var bar = new File("bar"); + + var op = new DetektOperation().input("foo", "bar"); + assertThat(op.input()).as("String...").contains(foo, bar); + op.input().clear(); + + op = op.input(foo, bar); + assertThat(op.input()).as("File...").contains(foo, bar); + op.input().clear(); + + op = op.input(foo.toPath(), bar.toPath()); + assertThat(op.input()).as("Path...").contains(foo, bar); + op.input().clear(); + + op = op.inputStrings(List.of("foo", "bar")); + assertThat(op.input()).as("List(String...)").contains(foo, bar); + op.input().clear(); + + op = op.input(List.of(foo, bar)); + assertThat(op.input()).as("File...").contains(foo, bar); + op.input().clear(); + + op = op.inputPaths(List.of(foo.toPath(), bar.toPath())); + assertThat(op.input()).as("Path...").contains(foo, bar); + op.input().clear(); + } + + @Test + void testPlugins() { + var foo = new File("foo"); + var bar = new File("bar"); + + var op = new DetektOperation().plugins("foo", "bar"); + assertThat(op.plugins()).as("String...").contains(foo, bar); + op.plugins().clear(); + + op = op.plugins(foo, bar); + assertThat(op.plugins()).as("File...").contains(foo, bar); + op.plugins().clear(); + + op = op.plugins(foo.toPath(), bar.toPath()); + assertThat(op.plugins()).as("Path...").contains(foo, bar); + op.plugins().clear(); + + op = op.pluginsStrings(List.of("foo", "bar")); + assertThat(op.plugins()).as("List(String...)").contains(foo, bar); + op.plugins().clear(); + + op = op.plugins(List.of(foo, bar)); + assertThat(op.plugins()).as("File...").contains(foo, bar); + op.plugins().clear(); + + op = op.pluginsPaths(List.of(foo.toPath(), bar.toPath())); + assertThat(op.plugins()).as("Path...").contains(foo, bar); + op.plugins().clear(); + } } From 158167bebd0c0c74bc3850b214391313047c3489 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 29 Aug 2024 21:54:21 -0700 Subject: [PATCH 32/65] Bumped bld to version 2.1.0 --- .idea/libraries/bld.xml | 4 ++-- .idea/libraries/compile.xml | 4 ++-- .idea/libraries/runtime.xml | 4 ++-- .idea/libraries/test.xml | 4 ++-- .vscode/settings.json | 2 +- README.md | 2 +- examples/.idea/libraries/bld.xml | 4 ++-- examples/.idea/libraries/compile.xml | 4 ++-- examples/.idea/libraries/runtime.xml | 4 ++-- examples/.idea/libraries/test.xml | 4 ++-- examples/.vscode/settings.json | 2 +- examples/lib/bld/bld-wrapper.jar | Bin 29577 -> 30440 bytes examples/lib/bld/bld-wrapper.properties | 2 +- lib/bld/bld-wrapper.jar | Bin 29577 -> 30440 bytes lib/bld/bld-wrapper.properties | 6 +++--- .../bld/extension/DetektOperationBuild.java | 2 +- 16 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.idea/libraries/bld.xml b/.idea/libraries/bld.xml index 4dd96bf..5c4010c 100644 --- a/.idea/libraries/bld.xml +++ b/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/.idea/libraries/compile.xml b/.idea/libraries/compile.xml index 9bd86aa..99cc0c0 100644 --- a/.idea/libraries/compile.xml +++ b/.idea/libraries/compile.xml @@ -7,7 +7,7 @@ - - + + \ No newline at end of file diff --git a/.idea/libraries/runtime.xml b/.idea/libraries/runtime.xml index 2ae5c4b..d4069f2 100644 --- a/.idea/libraries/runtime.xml +++ b/.idea/libraries/runtime.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/.idea/libraries/test.xml b/.idea/libraries/test.xml index b80486a..57ed5ef 100644 --- a/.idea/libraries/test.xml +++ b/.idea/libraries/test.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 5b2667b..4c33beb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,7 @@ ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-2.0.1.jar", + "${HOME}/.bld/dist/bld-2.1.0.jar", "lib/**/*.jar" ] } diff --git a/README.md b/README.md index 46e298b..e7170d4 100755 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Java](https://img.shields.io/badge/java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) -[![bld](https://img.shields.io/badge/2.0.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) +[![bld](https://img.shields.io/badge/2.1.0-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) [![Release](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/releases/com/uwyn/rife2/bld-detekt/maven-metadata.xml?color=blue)](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-detekt) [![Snapshot](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/snapshots/com/uwyn/rife2/bld-detekt/maven-metadata.xml?label=snapshot)](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-detekt) [![GitHub CI](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml/badge.svg)](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml) diff --git a/examples/.idea/libraries/bld.xml b/examples/.idea/libraries/bld.xml index 4dd96bf..5c4010c 100644 --- a/examples/.idea/libraries/bld.xml +++ b/examples/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/examples/.idea/libraries/compile.xml b/examples/.idea/libraries/compile.xml index 9bd86aa..99cc0c0 100644 --- a/examples/.idea/libraries/compile.xml +++ b/examples/.idea/libraries/compile.xml @@ -7,7 +7,7 @@ - - + + \ No newline at end of file diff --git a/examples/.idea/libraries/runtime.xml b/examples/.idea/libraries/runtime.xml index 2ae5c4b..d4069f2 100644 --- a/examples/.idea/libraries/runtime.xml +++ b/examples/.idea/libraries/runtime.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/examples/.idea/libraries/test.xml b/examples/.idea/libraries/test.xml index b80486a..57ed5ef 100644 --- a/examples/.idea/libraries/test.xml +++ b/examples/.idea/libraries/test.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index 5b2667b..4c33beb 100644 --- a/examples/.vscode/settings.json +++ b/examples/.vscode/settings.json @@ -9,7 +9,7 @@ ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-2.0.1.jar", + "${HOME}/.bld/dist/bld-2.1.0.jar", "lib/**/*.jar" ] } diff --git a/examples/lib/bld/bld-wrapper.jar b/examples/lib/bld/bld-wrapper.jar index 32bac6a95c10a898fbdf48f8337e4aca5fce84a3..e617d5bb50f57abf688eb5c4724770577e69c4c6 100644 GIT binary patch delta 15855 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 A4FCWD delta 15009 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

      s$*rls@!sHBO;ZCZI;P{yKGwD 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 A%>V!Z delta 15009 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

      s$*rls@!sHBO;ZCZI;P{yKGwD zr+ydZ11ibk3|<{!W2?KyUimE|>R~zud`_X2=pLhxyGB~{k5atW(ZVz?)CzCfV5-V7 zzmt@jsuNskPkC<40M}q+Wt+5{A<>-N570PeqlgJYT4$RCUz^SF-p9;>cTbBF z%~cGoK99|`o%)VxLB%p$p{7!eW~m;>1kGfcTX&Aa!t-?z z@4?gX!aR=1p7d3H(k_wQs~M<`LWE_BgO02Yix~K?{esz z0$PF6#H`M$Zq+qL4h`nd(iJTt@GBas!;lAU2fZh^J8YoKz^*l75KFb70i?c ze$C=3AqQiwU7ED?SFRy@D%t1$4UR5t8;C{8(csV9ZaS_kVkYh_Gacm_OL}0F=a^Al z{bA-zO~9CUjHjyv01-KNiiF?bex(_V@AC-zKc|$fYy{&k6L3^&Y69ac6o;M z*3}!q&!gZ<|3n62Yk2+#sjV1WHHO5(F=S9wfwxHkVnNBAh)F^n4jy`Oo#8rtDbOBI z!7B{eL}`TZcyiB!7vxtjo>Ru`QboZ?xyBlg<2Fz?#7*Is99B3PU`Nf|Al*RP#(Y3{ znBHhP;p~F=^$lV@HGFdlWqv&{X|;2PH`A^yrQR0Ln6G!y>sFHa#aPcN<_YJuMeV@6 zZ+zVc*F`Bd7pV$E#^ynnpwW!#~6s11cMVj05 z`vc06D;|{WF$W}a-W_BpoHHck>0RK3HzaJD<}+&4W2a>w?W1BK(D3yWj!mjM6n_%KR05d-%b%hs5ok#B6`?z7gba%ZN$?Ncm*Ac4RJnUE8l zR@eg4`;MqN+Ip;XXVOk`PRiY3>V{1&jV`FM>f**Buc4PzCxYE!_$c_gllI*CE+but zF+l}P?469`r*br@+sE#U=gK?$BT-RS26>_O0i$T6eH^)*Ie8U-#ZYV(w5fh*CKPEO zG9CO_Q-ouc+Q^};&y{6ffzgqh#ssy4d#Gh$XOfxc zF`;_JAu8s>Ht}x`(z5Qs;1S}Uj%x`Th(6TjeGZrNcf2ZFjP(~TpXT>UP(;ei;AxHI z#K%!a#piT*$JoJ?S5gHfYjGvn(bO?bE$zN(KN|R$ih5V<%8>e$a=^KfMx}sI{ushf zh>?+^rX$#SzlcrQ9}jAmg-2T-vC|PUi?}8~;b5`hhrW!=fm?%!KGL0+==ZyCu4wm` z3Nr=@sO4S05PbV%Kpn$1VYmZxrX!#vcVGQ-I z12WFyJ1h%MRf|Dn?C^IIp9ODWKbl$%H!HlRyT2JjwzS*60sLe95rBv>|HR<;l9mKG zu8TLYXld0#Q-Gj&@7K^O!#2dWlM*Xo^542`CxLNJw5VhUmJ+YKPM!s|yrdWXNf-UY zR#|<|uiP+{Xy}*@6&eS(GztT@FTcNvfKr@?f|dNf{ihM{BAEN65^@0ph4I#2W!?mBXH zRf$LR#Sr~koi~#c)V-mu{I%J*RB_9AOHypy&XB(GMhH)kdW89&`$b0;%C{kcp)AL( zWTgrxEZ~r7Fo{inJV9e)Z$zaynNq!hBbyi1b1SRoE*m0y`Iz`rSn~2*>q`8$-L&Jk zG;J3>i8N?Swuyb=SCVf|bj8p5@2ghjUd7s`xKC-PstML|jceRaH2fgYS(B9>wZdZG z)|8L981#5rKBleTXoKlKT@>YU_uU$tFb(CEtO5O6Pa%E9BZyF}l(l$+dP#9&1ZW^` z0!kjL^GBC#u`guDGfi}oV8IEK?!oQRb%K5g+5uj8L%$|&$_V7tY`fI!ng0}|F{3#S z5;hV~avt%ljavS4xmZmozD*p)GO)23mBUGBGbMl9>*t4sBZFyz40Qz2cQ`eHYss*;VtBWV#3dpusikcz?+%hPX zy6QAGPl{1!|71ZM(0K9n!ov4tlWjxheF~B8=UB!2BI#ZWWYK(qF}~C^NPk9iCeo`7yD-?n4ISG&!J8K*A<$;%n zR_B3H@Se2rQIt32XvuT-J~XqBiT$jsqb|QGXX91J!AyyuQ?8wA8*IY6zDMea_hUJZ zCipb-^=e~rmkpquSGB^wHDpZ)xIOK)FMQnabn4MboaS|&Dsg_il3(mwu!;F2UY&sC zN7a;y`OC2$2&dB{wJ66?wjeq;06C_64{X;gQ2l4&Y@Ym1`<~R|qKU%&D4?=x`ZP*u zY$|56wq}H|`te^BRsCmZ`1%G)sAxx=iMP!39rctXJ_`L*6`Ey!rvGl1_@dsF`e_a| zTj~?n2&hgz@!4ZZa#>VjO2$nb72NUr_OTM~sE{xG1>^aZOg1&y5U70Z3aBBPmF=); zAIy0sNt#(hWQBPYjmeqf4vS7+m*MekH)3H;c{)Fw z^(ss6Z)ur>tsl>)ie}k%c@tr)TG40a+aadLwBn7E_P4Xx;w$0 z9W#S%D#;q3CIy=S_bE?e0?2fifjoe3xb(wQ-{8PSotA+bO zj~2ho8~hu!Lj1j})HAP-_W=LTAA$x8(?n-S3J-S}AMa`YpSpqu%hQ|>cl3LrOoug5 z26){rUH&=GuR%9mmvn`SvQJWcO^4 zyvPo|1QliQp3_5dbgqPCGprE*$e>{ysWM5SK|nwt|5Zg9P%w0m|4qY8uy++f{7)X{ z|9(M2m#e^k>EhjR!L+#(W?XR-uJ};s{{N=pqey9-U?3p25FjAb|ET}BknsK2DB6wS zzdQ-m|A=Y?62{!9i2pMbS>#BD6DSBs&_83=|F!xjwb~}IIkG3Dxg-1+=!EAjy!#KB z2@V26_J4qp_6bnV6#oH={)h4ZJ45*Y1MGGL0TGcEGf)>-R*_PWSCoN-`i~yw-{bmk L_^*Fz5Rm@|QL83O diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 79b2f59..5d0bba4 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -1,8 +1,8 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.2 -bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.4 +bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.3 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.5 bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= -bld.version=2.0.1 +bld.version=2.1.0 diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 549abd4..081277e 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -41,7 +41,7 @@ public class DetektOperationBuild extends Project { repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS); scope(compile) - .include(dependency("com.uwyn.rife2", "bld", version(2, 0, 1))) + .include(dependency("com.uwyn.rife2", "bld", version(2, 1, 0))) .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 6))); scope(test) .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 0))) From e9f3079911d1cf1cbf5622588c19aacb0fba765d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 30 Aug 2024 16:59:02 -0700 Subject: [PATCH 33/65] More API cleanups --- .../rife/bld/extension/DetektOperation.java | 57 ++++++++++++------- .../bld/extension/DetektOperationTest.java | 4 +- 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index e0b6f21..ec3ebae 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -149,7 +149,7 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation basePath(Path path) { - return basePath(path.toFile()); + return basePath(path.toFile().getAbsolutePath()); } /** @@ -183,7 +183,7 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation baseline(Path baseline) { - return baseline(baseline.toFile()); + return baseline(baseline.toFile().getAbsolutePath()); } /** @@ -214,6 +214,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param paths one or more files * @return this operation instance + * @see #classPath(Collection) */ public DetektOperation classPath(File... paths) { return classPath(List.of(paths)); @@ -225,6 +226,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param paths one or more files * @return this operation instance + * @see #classPathPaths(Collection) */ public DetektOperation classPath(Path... paths) { return classPathPaths(List.of(paths)); @@ -236,6 +238,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param paths one or more files * @return this operation instance + * @see #classPathStrings(Collection) */ public DetektOperation classPath(String... paths) { return classPathStrings(List.of(paths)); @@ -248,6 +251,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param paths the paths * @return this operation instance + * @see #classPath(File...) */ public DetektOperation classPath(Collection paths) { classpath_.addAll(paths); @@ -269,10 +273,10 @@ public class DetektOperation extends AbstractProcessOperation { * * @param paths the paths * @return this operation instance + * @see #classPath(Path...) */ public DetektOperation classPathPaths(Collection paths) { - classpath_.addAll(paths.stream().map(Path::toFile).toList()); - return this; + return classPath(paths.stream().map(Path::toFile).toList()); } /** @@ -281,10 +285,10 @@ public class DetektOperation extends AbstractProcessOperation { * * @param paths the paths * @return this operation instance + * @see #classPath(String...) */ public DetektOperation classPathStrings(Collection paths) { - classpath_.addAll(paths.stream().map(File::new).toList()); - return this; + return classPath(paths.stream().map(File::new).toList()); } /** @@ -292,6 +296,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param configs one or more config files * @return this operation instance + * @see #config(Collection) */ public DetektOperation config(File... configs) { return config(List.of(configs)); @@ -302,6 +307,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param configs one or more config files * @return this operation instance + * @see #configPaths(Collection) */ public DetektOperation config(Path... configs) { return configPaths(List.of(configs)); @@ -312,6 +318,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param configs one or more config files * @return this operation instance + * @see #configStrings(Collection) */ public DetektOperation config(String... configs) { return configStrings(List.of(configs)); @@ -323,6 +330,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param configs the config files * @return this operation instance + * @see #config(File...) */ public DetektOperation config(Collection configs) { config_.addAll(configs); @@ -343,10 +351,10 @@ public class DetektOperation extends AbstractProcessOperation { * * @param configs the config files * @return this operation instance + * @see #config(Path...) */ public DetektOperation configPaths(Collection configs) { - config_.addAll(configs.stream().map(Path::toFile).toList()); - return this; + return config(configs.stream().map(Path::toFile).toList()); } /** @@ -377,7 +385,7 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation configResource(Path resource) { - return configResource(resource.toFile()); + return configResource(resource.toFile().getAbsolutePath()); } /** @@ -394,6 +402,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param configs the config files * @return this operation instance + * @see #config(String...) */ public DetektOperation configStrings(Collection configs) { config_.addAll(configs.stream().map(File::new).toList()); @@ -441,8 +450,7 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation excludes(String... patterns) { - excludes_.addAll(List.of(patterns)); - return this; + return excludes(List.of(patterns)); } /** @@ -705,8 +713,7 @@ public class DetektOperation extends AbstractProcessOperation { * @return this operation instance */ public DetektOperation includes(String... patterns) { - includes_.addAll(List.of(patterns)); - return this; + return includes(List.of(patterns)); } /** @@ -735,6 +742,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param paths the paths * @return this operation instance + * @see #input(Collection) */ public DetektOperation input(Collection paths) { input_.addAll(paths); @@ -746,6 +754,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param paths one or more paths * @return this operation instance + * @see #inputStrings(Collection) */ public DetektOperation input(String... paths) { return inputStrings(List.of(paths)); @@ -756,6 +765,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param paths one or more paths * @return this operation instance + * @see #input(Collection) */ public DetektOperation input(File... paths) { return input(List.of(paths)); @@ -766,6 +776,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param paths one or more paths * @return this operation instance + * @see #inputPaths(Collection) */ public DetektOperation input(Path... paths) { return inputPaths(List.of(paths)); @@ -785,10 +796,10 @@ public class DetektOperation extends AbstractProcessOperation { * * @param paths the paths * @return this operation instance + * @see #input(Path...) */ public DetektOperation inputPaths(Collection paths) { - input_.addAll(paths.stream().map(Path::toFile).toList()); - return this; + return input(paths.stream().map(Path::toFile).toList()); } /** @@ -796,10 +807,10 @@ public class DetektOperation extends AbstractProcessOperation { * * @param paths the paths * @return this operation instance + * @see #input(String...) */ public DetektOperation inputStrings(Collection paths) { - input_.addAll(paths.stream().map(File::new).toList()); - return this; + return input(paths.stream().map(File::new).toList()); } /* @@ -879,6 +890,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param jars one or more jars * @return this operation instance + * @see #pluginsStrings(Collection) */ public DetektOperation plugins(String... jars) { return pluginsStrings(List.of(jars)); @@ -889,6 +901,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param jars one or more jars * @return this operation instance + * @see #plugins(Collection) */ public DetektOperation plugins(File... jars) { return plugins(List.of(jars)); @@ -899,6 +912,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param jars one or more jars * @return this operation instance + * @see #pluginsPaths(Collection) */ public DetektOperation plugins(Path... jars) { return pluginsPaths(List.of(jars)); @@ -909,6 +923,7 @@ public class DetektOperation extends AbstractProcessOperation { * * @param jars the jars paths * @return this operation instance + * @see #input(File...) */ public DetektOperation plugins(Collection jars) { plugins_.addAll(jars); @@ -929,10 +944,10 @@ public class DetektOperation extends AbstractProcessOperation { * * @param jars the jars paths * @return this operation instance + * @see #plugins(Path...) */ public DetektOperation pluginsPaths(Collection jars) { - plugins_.addAll(jars.stream().map(Path::toFile).toList()); - return this; + return plugins(jars.stream().map(Path::toFile).toList()); } /** @@ -940,10 +955,10 @@ public class DetektOperation extends AbstractProcessOperation { * * @param jars the jars paths * @return this operation instance + * @see #plugins(String...) */ public DetektOperation pluginsStrings(Collection jars) { - plugins_.addAll(jars.stream().map(File::new).toList()); - return this; + return plugins(jars.stream().map(File::new).toList()); } /** diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index 24e20ae..3a9ec3f 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -71,7 +71,7 @@ class DetektOperationTest { op = op.basePath(bar.toPath()); assertThat(op.basePath()).as("as path").isEqualTo(bar.getAbsolutePath()); - op = new DetektOperation().basePath("foo"); + op = op.basePath("foo"); assertThat(op.basePath()).as("as string").isEqualTo("foo"); } @@ -86,7 +86,7 @@ class DetektOperationTest { op = op.baseline(bar.toPath()); assertThat(op.baseline()).as("as path").isEqualTo(bar.getAbsolutePath()); - op = new DetektOperation().baseline("foo"); + op = op.baseline("foo"); assertThat(op.baseline()).as("as string").isEqualTo("foo"); } From 21bd30166df17dff78376fa49f040de1e2481163 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 30 Aug 2024 16:59:15 -0700 Subject: [PATCH 34/65] Version 0.9.6 --- examples/lib/bld/bld-wrapper.properties | 4 ++-- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 6a3d37b..ef08e20 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,8 +1,8 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.6-SNAPSHOT -bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.1-SNAPSHOT +bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.6 +bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.1 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=2.1.0 diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 081277e..ba94b28 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -33,7 +33,7 @@ public class DetektOperationBuild extends Project { public DetektOperationBuild() { pkg = "rife.bld.extension"; name = "DetektOperation"; - version = version(0, 9, 6, "SNAPSHOT"); + version = version(0, 9, 6); javaRelease = 17; downloadSources = true; From a1eb4cea1da56d867af8223dd59e452d18c37196 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 8 Sep 2024 18:35:57 -0700 Subject: [PATCH 35/65] Bumped bld to version 1.23.7 --- examples/lib/bld/bld-wrapper.properties | 2 +- .../bld/extension/DetektOperationBuild.java | 34 +++++++++---------- .../bld/extension/DetektOperationTest.java | 17 ++++++---- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index ef08e20..32d0f90 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,7 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.6 +bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.7 bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.1 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index ba94b28..34d3529 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -33,16 +33,18 @@ public class DetektOperationBuild extends Project { public DetektOperationBuild() { pkg = "rife.bld.extension"; name = "DetektOperation"; - version = version(0, 9, 6); + version = version(0, 9, 7); javaRelease = 17; + downloadSources = true; autoDownloadPurge = true; + repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS); scope(compile) .include(dependency("com.uwyn.rife2", "bld", version(2, 1, 0))) - .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 6))); + .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 7))); scope(test) .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 0))) .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 0))) @@ -56,28 +58,26 @@ public class DetektOperationBuild extends Project { publishOperation() .repository(version.isSnapshot() ? repository("rife2-snapshot") : repository("rife2")) + .repository(repository("github")) .info() .groupId("com.uwyn.rife2") .artifactId("bld-detekt") .description("bld Detekt Extension") .url("https://github.com/rife2/bld-detekt") - .developer( - new PublishDeveloper() - .id("ethauvin") - .name("Erik C. Thauvin") - .email("erik@thauvin.net") - .url("https://erik.thauvin.net/") + .developer(new PublishDeveloper() + .id("ethauvin") + .name("Erik C. Thauvin") + .email("erik@thauvin.net") + .url("https://erik.thauvin.net/") ) - .license( - new PublishLicense() - .name("The Apache License, Version 2.0") - .url("https://www.apache.org/licenses/LICENSE-2.0.txt") + .license(new PublishLicense() + .name("The Apache License, Version 2.0") + .url("https://www.apache.org/licenses/LICENSE-2.0.txt") ) - .scm( - new PublishScm() - .connection("scm:git:https://github.com/rife2/bld-detekt.git") - .developerConnection("scm:git:git@github.com:rife2/bld-detekt.git") - .url("https://github.com/rife2/bld-detekt") + .scm(new PublishScm() + .connection("scm:git:https://github.com/rife2/bld-detekt.git") + .developerConnection("scm:git:git@github.com:rife2/bld-detekt.git") + .url("https://github.com/rife2/bld-detekt") ) .signKey(property("sign.key")) .signPassphrase(property("sign.passphrase")); diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index 3a9ec3f..85b1b76 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -16,6 +16,7 @@ package rife.bld.extension; +import org.assertj.core.api.AutoCloseableSoftAssertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import rife.bld.BaseProject; @@ -147,15 +148,17 @@ class DetektOperationTest { var params = op.executeConstructProcessCommandList(); - for (var p : args) { - var found = false; - for (var a : params) { - if (a.startsWith(p)) { - found = true; - break; + try (var softly = new AutoCloseableSoftAssertions()) { + for (var p : args) { + var found = false; + for (var a : params) { + if (a.startsWith(p)) { + found = true; + break; + } } + softly.assertThat(found).as(p + " not found.").isTrue(); } - assertThat(found).as(p + " not found.").isTrue(); } } From e04f46287b006aa61c668e920ee2777301f80626 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 27 Oct 2024 17:03:26 -0700 Subject: [PATCH 36/65] Updated dependencies Bumped JUnit version to 5.11.3 Bumped PMD extension version to 1.1.7 Bumped JDK to version 23 (GitHub CI Workflow) Bumped Kotlin to version 2.0.21 Bumped Kotlin extension to version 1.0.2 --- .github/workflows/bld.yml | 2 +- config/pmd.xml | 4 ++-- examples/lib/bld/bld-wrapper.properties | 2 +- examples/src/bld/java/com/example/ExampleBuild.java | 6 +++--- lib/bld/bld-wrapper.properties | 2 +- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index 2d50ee7..6020ea2 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: - java-version: [17, 21, 22] + java-version: [17, 21, 23] steps: - name: Checkout source repository diff --git a/config/pmd.xml b/config/pmd.xml index 3d3203c..2641880 100644 --- a/config/pmd.xml +++ b/config/pmd.xml @@ -7,9 +7,9 @@ - - + + diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 32d0f90..ea90a9b 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -2,7 +2,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.7 -bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.1 +bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.2 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=2.1.0 diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index 483f73f..8e68e4a 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -31,13 +31,13 @@ public class ExampleBuild extends Project { repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES); - final var kotlin = version(2, 0, 20); + final var kotlin = version(2, 0, 21); scope(compile) .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin)); scope(test) .include(dependency("org.jetbrains.kotlin", "kotlin-test-junit5", kotlin)) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 0))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 0))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 3))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 3))); // Include the Kotlin source directory when creating or publishing sources Java Archives jarSourcesOperation().sourceDirectories(new File(srcMainDirectory(), "kotlin")); diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 5d0bba4..196e2c9 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -2,7 +2,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.3 -bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.5 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.7 bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=2.1.0 diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 34d3529..6cb7b8e 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -46,8 +46,8 @@ public class DetektOperationBuild extends Project { .include(dependency("com.uwyn.rife2", "bld", version(2, 1, 0))) .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 7))); scope(test) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 0))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 0))) + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 3))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 3))) .include(dependency("org.assertj", "assertj-core", version(3, 26, 3))); javadocOperation() .javadocOptions() From 5b6181825dbf7f9ec98af13a9a2b26cb105cf4a5 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 28 Dec 2024 17:43:40 -0800 Subject: [PATCH 37/65] Bumped JUnit to version 5.11.4 --- examples/src/bld/java/com/example/ExampleBuild.java | 4 ++-- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index 8e68e4a..ee6e176 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -36,8 +36,8 @@ public class ExampleBuild extends Project { .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin)); scope(test) .include(dependency("org.jetbrains.kotlin", "kotlin-test-junit5", kotlin)) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 3))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 3))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 4))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 4))); // Include the Kotlin source directory when creating or publishing sources Java Archives jarSourcesOperation().sourceDirectories(new File(srcMainDirectory(), "kotlin")); diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 6cb7b8e..f622fee 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -46,9 +46,9 @@ public class DetektOperationBuild extends Project { .include(dependency("com.uwyn.rife2", "bld", version(2, 1, 0))) .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 7))); scope(test) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 3))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 3))) .include(dependency("org.assertj", "assertj-core", version(3, 26, 3))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 4))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 4))) javadocOperation() .javadocOptions() .author() From c993a3ab141ae97629bed6012d1d549bfa458e96 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 28 Dec 2024 17:44:36 -0800 Subject: [PATCH 38/65] Bumped AssertJ to version 3.27.0 --- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index f622fee..b41434d 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -46,9 +46,9 @@ public class DetektOperationBuild extends Project { .include(dependency("com.uwyn.rife2", "bld", version(2, 1, 0))) .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 7))); scope(test) - .include(dependency("org.assertj", "assertj-core", version(3, 26, 3))); .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 4))) .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 4))) + .include(dependency("org.assertj", "assertj-core", version(3, 27, 0))); javadocOperation() .javadocOptions() .author() From cbe95f7cc25a2481d2f75622c0ec9a4a3e415c8f Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 28 Dec 2024 17:45:36 -0800 Subject: [PATCH 39/65] Bumped Kotlin to version 2.1.0 --- examples/src/bld/java/com/example/ExampleBuild.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index ee6e176..d413e22 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -31,7 +31,7 @@ public class ExampleBuild extends Project { repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES); - final var kotlin = version(2, 0, 21); + final var kotlin = version(2, 1, 0); scope(compile) .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin)); scope(test) From 33774b8a93c3a52cfc2c399bc1d86a1208621785 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 28 Dec 2024 17:46:39 -0800 Subject: [PATCH 40/65] Updated extensions Bumped Kotlin extension to version 1.0.3 Bumped PMD extension to version 1.1.9 --- examples/lib/bld/bld-wrapper.properties | 2 +- lib/bld/bld-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index ea90a9b..d7e1f15 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -2,7 +2,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.7 -bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.2 +bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.3 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=2.1.0 diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 196e2c9..f1493b7 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -2,7 +2,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.3 -bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.7 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.9 bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=2.1.0 From d1f4a614feae109f33720d5892dae0ca07edccf6 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 14 Jan 2025 00:03:46 -0800 Subject: [PATCH 41/65] Bumped Kotlin extension to version 1.0.4 --- examples/lib/bld/bld-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index d7e1f15..442e9f5 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -2,7 +2,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.7 -bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.3 +bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.4 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=2.1.0 From 1bef03ec7961f41e29535e4388e422eb6814003e Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 14 Jan 2025 00:04:14 -0800 Subject: [PATCH 42/65] Bumped AssertJ to version 3.27.2 --- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index b41434d..81581eb 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -48,7 +48,7 @@ public class DetektOperationBuild extends Project { scope(test) .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 4))) .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 4))) - .include(dependency("org.assertj", "assertj-core", version(3, 27, 0))); + .include(dependency("org.assertj", "assertj-core", version(3, 27, 2))); javadocOperation() .javadocOptions() .author() From 93d963398b3c6af2a71edd99acec50b962eb479b Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 14 Jan 2025 00:04:44 -0800 Subject: [PATCH 43/65] Bumped bld to version 2.2.0 --- .idea/libraries/bld.xml | 4 ++-- .vscode/settings.json | 2 +- README.md | 2 +- examples/.idea/libraries/bld.xml | 4 ++-- examples/.vscode/settings.json | 2 +- examples/lib/bld/bld-wrapper.jar | Bin 30440 -> 30440 bytes examples/lib/bld/bld-wrapper.properties | 2 +- lib/bld/bld-wrapper.jar | Bin 30440 -> 30440 bytes lib/bld/bld-wrapper.properties | 6 +++--- .../bld/extension/DetektOperationBuild.java | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.idea/libraries/bld.xml b/.idea/libraries/bld.xml index 5c4010c..553c281 100644 --- a/.idea/libraries/bld.xml +++ b/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/.vscode/settings.json b/.vscode/settings.json index 4c33beb..a3f4fd0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,7 @@ ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-2.1.0.jar", + "${HOME}/.bld/dist/bld-2.2.0.jar", "lib/**/*.jar" ] } diff --git a/README.md b/README.md index e7170d4..3bde731 100755 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Java](https://img.shields.io/badge/java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) -[![bld](https://img.shields.io/badge/2.1.0-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) +[![bld](https://img.shields.io/badge/2.2.0-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) [![Release](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/releases/com/uwyn/rife2/bld-detekt/maven-metadata.xml?color=blue)](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-detekt) [![Snapshot](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/snapshots/com/uwyn/rife2/bld-detekt/maven-metadata.xml?label=snapshot)](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-detekt) [![GitHub CI](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml/badge.svg)](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml) diff --git a/examples/.idea/libraries/bld.xml b/examples/.idea/libraries/bld.xml index 5c4010c..553c281 100644 --- a/examples/.idea/libraries/bld.xml +++ b/examples/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index 4c33beb..a3f4fd0 100644 --- a/examples/.vscode/settings.json +++ b/examples/.vscode/settings.json @@ -9,7 +9,7 @@ ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-2.1.0.jar", + "${HOME}/.bld/dist/bld-2.2.0.jar", "lib/**/*.jar" ] } diff --git a/examples/lib/bld/bld-wrapper.jar b/examples/lib/bld/bld-wrapper.jar index e617d5bb50f57abf688eb5c4724770577e69c4c6..209385ae77ad04edabb30557baab3c645b38244a 100644 GIT binary patch delta 203 zcmaFymhr_~M!o=VW)=|!4h{~6M-#Q9Ci2y?fas0=CN^NkqnshM0T=HiJZzMV+Mu*Z+4E3GxFi=3=9mcKpf!B$Rxsmuy1l+ qi4(-0EhQdc#-!3l3x3Ci2y?fas0=CN^NkqnshM0T=HiJZzMV+Mu*Z+4E3GxFi=3=9mcKpf!B$Rxsmuy1l+ qi4(-0EhQdc#-!3m46ZvXcK=j6b6B{sNa-Y4%=Jz(UnZUfwefC{Y zmW&gd9z;y7;2a}_^`p=LB0E{9L{8<3F#|(@H#^70qR3Eo1_lOJAP(?mWD;RO*f%+^ q#0g^0mJ$yzV^V1_L?9f-SXb%-5&2dc3zaJK;{dr5Wb)*-W!3=tEjt$g diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index f1493b7..9e371e3 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -1,8 +1,8 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.3 -bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.9 +bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.4 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.10 bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= -bld.version=2.1.0 +bld.version=2.2.0 diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 81581eb..32f7a7a 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -43,7 +43,7 @@ public class DetektOperationBuild extends Project { repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS); scope(compile) - .include(dependency("com.uwyn.rife2", "bld", version(2, 1, 0))) + .include(dependency("com.uwyn.rife2", "bld", version(2, 2, 0))) .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 7))); scope(test) .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 4))) From 48952f505f1f81bfb876750b755a87ee7b7bbb90 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 14 Jan 2025 00:05:55 -0800 Subject: [PATCH 44/65] Updated copyright for 2025 --- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 2 +- src/main/java/rife/bld/extension/DetektOperation.java | 2 +- src/main/java/rife/bld/extension/detekt/Report.java | 2 +- src/main/java/rife/bld/extension/detekt/ReportId.java | 2 +- src/test/java/rife/bld/extension/DetektOperationTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 32f7a7a..8e60c7e 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index ec3ebae..67a50f2 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/rife/bld/extension/detekt/Report.java b/src/main/java/rife/bld/extension/detekt/Report.java index 32dcc60..ffa4a45 100644 --- a/src/main/java/rife/bld/extension/detekt/Report.java +++ b/src/main/java/rife/bld/extension/detekt/Report.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/rife/bld/extension/detekt/ReportId.java b/src/main/java/rife/bld/extension/detekt/ReportId.java index ef53bc9..c087243 100644 --- a/src/main/java/rife/bld/extension/detekt/ReportId.java +++ b/src/main/java/rife/bld/extension/detekt/ReportId.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index 85b1b76..a56a64a 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 99691fb2e9212808e8794950a23b6746d2d4c229 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 14 Jan 2025 00:08:10 -0800 Subject: [PATCH 45/65] Fixed BaseProjectBlueprint init in tests --- src/test/java/rife/bld/extension/DetektOperationTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index a56a64a..ecc510a 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -245,7 +245,7 @@ class DetektOperationTest { var op = new DetektOperation() .fromProject(new BaseProjectBlueprint(new File("examples"), "com.example", - "Example")) + "example", "Example")) .baseline(baseline) .createBaseline(true); op.execute(); @@ -260,7 +260,7 @@ class DetektOperationTest { void testExampleMaxIssues() { var op = new DetektOperation() .fromProject(new BaseProjectBlueprint(new File("examples"), "com.example", - "Example")) + "example", "Example")) .maxIssues(8); assertThatNoException().isThrownBy(op::execute); } @@ -277,7 +277,7 @@ class DetektOperationTest { var op = new DetektOperation() .fromProject(new BaseProjectBlueprint(new File("examples"), "com.example", - "Example")) + "example", "Example")) .report(new Report(ReportId.HTML, html.getAbsolutePath())) .report(new Report(ReportId.XML, xml.getAbsolutePath())) .report(new Report(ReportId.TXT, txt.getAbsolutePath())) @@ -295,7 +295,7 @@ class DetektOperationTest { void testExamplesExecute() { var op = new DetektOperation() .fromProject(new BaseProjectBlueprint(new File("examples"), "com.example", - "Example")) + "example", "Example")) .debug(true); assertThatThrownBy(op::execute).isInstanceOf(ExitStatusException.class); } From d6f424972a37e7bd1d2e62cb73382a8eb0aba6f3 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 14 Jan 2025 12:09:51 -0800 Subject: [PATCH 46/65] Version 0.9.8 --- .idea/icon.svg | 13 +++++++++++++ examples/lib/bld/bld-wrapper.properties | 2 +- .../rife/bld/extension/DetektOperationBuild.java | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 .idea/icon.svg diff --git a/.idea/icon.svg b/.idea/icon.svg new file mode 100644 index 0000000..81220b4 --- /dev/null +++ b/.idea/icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 7697410..010e6a6 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,7 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.7 +bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.8 bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.4 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 8e60c7e..9b7e73d 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -33,7 +33,7 @@ public class DetektOperationBuild extends Project { public DetektOperationBuild() { pkg = "rife.bld.extension"; name = "DetektOperation"; - version = version(0, 9, 7); + version = version(0, 9, 8); javaRelease = 17; From 1115acaad481e35205750f6c24447607c9fedcd9 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 23 Feb 2025 15:42:57 -0800 Subject: [PATCH 47/65] Update pages actions to the latest versions --- .github/workflows/pages.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index e191f6d..88c2cd6 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -47,11 +47,11 @@ jobs: uses: actions/configure-pages@v3 - name: Upload artifact - uses: actions/upload-pages-artifact@v1 + uses: actions/upload-pages-artifact@v3 with: # Upload generated Javadocs repository path: "build/javadoc/" - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v1 + uses: actions/deploy-pages@v4 From 7ad511a40c5d3434021851df4f1c955883dce992 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 23 Feb 2025 15:43:47 -0800 Subject: [PATCH 48/65] Bump JUnit to version 5.12.0 --- examples/src/bld/java/com/example/ExampleBuild.java | 4 ++-- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index d413e22..d99ea96 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -36,8 +36,8 @@ public class ExampleBuild extends Project { .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin)); scope(test) .include(dependency("org.jetbrains.kotlin", "kotlin-test-junit5", kotlin)) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 4))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 4))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 0))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 0))); // Include the Kotlin source directory when creating or publishing sources Java Archives jarSourcesOperation().sourceDirectories(new File(srcMainDirectory(), "kotlin")); diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 9b7e73d..c58bbed 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -46,9 +46,9 @@ public class DetektOperationBuild extends Project { .include(dependency("com.uwyn.rife2", "bld", version(2, 2, 0))) .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 7))); scope(test) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 11, 4))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 11, 4))) - .include(dependency("org.assertj", "assertj-core", version(3, 27, 2))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 0))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 0))) + .include(dependency("org.assertj", "assertj-core", version(3, 27, 3))); javadocOperation() .javadocOptions() .author() From ae53af2ba6929f038b5cd21fd26c30db049e174c Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 23 Feb 2025 15:44:13 -0800 Subject: [PATCH 49/65] Bump PMD extension to version 1.2.0 --- lib/bld/bld-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 9e371e3..4f5f791 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -2,7 +2,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.4 -bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.10 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.2.0 bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=2.2.0 From 95971222f9cf7aa8666adacf575d54db2052679b Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 23 Feb 2025 15:45:08 -0800 Subject: [PATCH 50/65] Bump Detekt to version 1.23.8 --- examples/src/bld/java/com/example/ExampleBuild.java | 2 +- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 2 +- src/main/java/rife/bld/extension/DetektOperation.java | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index d99ea96..d096fe9 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -31,7 +31,7 @@ public class ExampleBuild extends Project { repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES); - final var kotlin = version(2, 1, 0); + final var kotlin = version(2, 1, 10); scope(compile) .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin)); scope(test) diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index c58bbed..af8177e 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -44,7 +44,7 @@ public class DetektOperationBuild extends Project { scope(compile) .include(dependency("com.uwyn.rife2", "bld", version(2, 2, 0))) - .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 7))); + .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 8))); scope(test) .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 0))) .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 0))) diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index 67a50f2..4bfe7f7 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -48,8 +48,7 @@ public class DetektOperation extends AbstractProcessOperation { "kotlin-reflect-", "kotlin-script-runtime-", "kotlin-stdlib-", - "kotlin-stdlib-jdk7-", - "kotlin-stdlib-jdk8-", + "kotlinx-coroutines-", "kotlinx-html-jvm-", "kotlinx-serialization-", "sarif4k-jvm-", From 7386332361044a4adae649a767beebdd699ac704 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 23 Feb 2025 16:32:20 -0800 Subject: [PATCH 51/65] Version 0.9.9 --- examples/lib/bld/bld-wrapper.properties | 2 +- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 010e6a6..e770087 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,7 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.8 +bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.9 bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.4 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index af8177e..f70a050 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -33,13 +33,13 @@ public class DetektOperationBuild extends Project { public DetektOperationBuild() { pkg = "rife.bld.extension"; name = "DetektOperation"; - version = version(0, 9, 8); + version = version(0, 9, 9); javaRelease = 17; downloadSources = true; autoDownloadPurge = true; - + repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS); scope(compile) From 41d6667dcaa7f85cf92bcc4240c1b12ff07881cc Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 24 Feb 2025 22:47:25 -0800 Subject: [PATCH 52/65] Bump bld to version 2.2.1 --- .idea/libraries/bld.xml | 4 ++-- .vscode/settings.json | 2 +- README.md | 2 +- examples/.idea/libraries/bld.xml | 4 ++-- examples/.vscode/settings.json | 2 +- examples/lib/bld/bld-wrapper.jar | Bin 30440 -> 30440 bytes examples/lib/bld/bld-wrapper.properties | 2 +- lib/bld/bld-wrapper.jar | Bin 30440 -> 30440 bytes lib/bld/bld-wrapper.properties | 2 +- .../bld/extension/DetektOperationBuild.java | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.idea/libraries/bld.xml b/.idea/libraries/bld.xml index 553c281..153a060 100644 --- a/.idea/libraries/bld.xml +++ b/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/.vscode/settings.json b/.vscode/settings.json index a3f4fd0..ba429d0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,7 @@ ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-2.2.0.jar", + "${HOME}/.bld/dist/bld-2.2.1.jar", "lib/**/*.jar" ] } diff --git a/README.md b/README.md index 3bde731..6b544a6 100755 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Java](https://img.shields.io/badge/java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) -[![bld](https://img.shields.io/badge/2.2.0-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) +[![bld](https://img.shields.io/badge/2.2.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) [![Release](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/releases/com/uwyn/rife2/bld-detekt/maven-metadata.xml?color=blue)](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-detekt) [![Snapshot](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/snapshots/com/uwyn/rife2/bld-detekt/maven-metadata.xml?label=snapshot)](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-detekt) [![GitHub CI](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml/badge.svg)](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml) diff --git a/examples/.idea/libraries/bld.xml b/examples/.idea/libraries/bld.xml index 553c281..153a060 100644 --- a/examples/.idea/libraries/bld.xml +++ b/examples/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index a3f4fd0..ba429d0 100644 --- a/examples/.vscode/settings.json +++ b/examples/.vscode/settings.json @@ -9,7 +9,7 @@ ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-2.2.0.jar", + "${HOME}/.bld/dist/bld-2.2.1.jar", "lib/**/*.jar" ] } diff --git a/examples/lib/bld/bld-wrapper.jar b/examples/lib/bld/bld-wrapper.jar index 209385ae77ad04edabb30557baab3c645b38244a..20412e6d4f74d458a32a22bc557b641e0d04341c 100644 GIT binary patch delta 187 zcmaFymhr_~M&1B#W)=|!4h{~6pPM2k^42i}sf~T6HXwR(uf68x_cpVcK%C9J_T3PM zv=h4?SVXnpJR_L#z0eRWHCekvQIUlqz?+>z?vI25I|Bm)D-Z{GGct)Vz-^hFTjC5h peshT@nEqc90;a=CA@tf(S1|u;X&gkn%%213f+&!glh>A60{{uJNihHb delta 187 zcmaFymhr_~M&1B#W)=|!4h{~6M-#Ot^42i}sf~T6HXwR(uf68x_cpVcK%C9J_T3PM zv=h4?SVXnpJR_L#z0eRWHCekvQIUZmz?+?;A60{{v!L(KpH diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index e770087..705e9e2 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -5,4 +5,4 @@ bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.9 bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.4 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= -bld.version=2.2.0 +bld.version=2.2.1 diff --git a/lib/bld/bld-wrapper.jar b/lib/bld/bld-wrapper.jar index 6dda5dbbbf2b0191cd595a86525abf8999e29532..ab362ae64115ef1238756fb43c9092a58f775dda 100644 GIT binary patch delta 187 zcmaFymhr_~M&1B#W)=|!4h{~6Z<`_}^42i}sf~T6HXwR(uf68x_cpVcK%C9J_T3PM zv=h4?SVXnpJR_L#z0eRWHCekvQIUlqz?+>z?vI25I|Bm)D-Z{GGct)Vz-^hFTjC5h peshT@nEqc90;a=CA@tf(S1|u;X&gkn%%213f+&!glh>A60|5BuNdW)= delta 187 zcmaFymhr_~M&1B#W)=|!4h{~6>l3vn^42i}sf~T6HXwR(uf68x_cpVcK%C9J_T3PM zv=h4?SVXnpJR_L#z0eRWHCekvQIUZmz?+?;A60|3m%LmdDB diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 4f5f791..6d3e0c7 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -5,4 +5,4 @@ bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.4 bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.2.0 bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= -bld.version=2.2.0 +bld.version=2.2.1 diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index f70a050..52efc9c 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -33,7 +33,7 @@ public class DetektOperationBuild extends Project { public DetektOperationBuild() { pkg = "rife.bld.extension"; name = "DetektOperation"; - version = version(0, 9, 9); + version = version(0, 9, 10, "SNAPSHOT"); javaRelease = 17; @@ -43,7 +43,7 @@ public class DetektOperationBuild extends Project { repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS); scope(compile) - .include(dependency("com.uwyn.rife2", "bld", version(2, 2, 0))) + .include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1))) .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 8))); scope(test) .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 0))) From e39302bf8b61699944e0bc565db1c2ec815e7bd0 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 18 Mar 2025 13:06:07 -0700 Subject: [PATCH 53/65] Bump JUnit to version 5.12.1 --- examples/src/bld/java/com/example/ExampleBuild.java | 5 +++-- src/bld/java/rife/bld/extension/DetektOperationBuild.java | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index d096fe9..5c86248 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -36,8 +36,9 @@ public class ExampleBuild extends Project { .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin)); scope(test) .include(dependency("org.jetbrains.kotlin", "kotlin-test-junit5", kotlin)) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 0))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 0))); + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1))) + .include(dependency("org.junit.platform", "junit-platform-launcher", version(1, 12, 1))); // Include the Kotlin source directory when creating or publishing sources Java Archives jarSourcesOperation().sourceDirectories(new File(srcMainDirectory(), "kotlin")); diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 52efc9c..515bb9e 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -46,8 +46,8 @@ public class DetektOperationBuild extends Project { .include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1))) .include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 8))); scope(test) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 0))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 0))) + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1))) .include(dependency("org.assertj", "assertj-core", version(3, 27, 3))); javadocOperation() .javadocOptions() From 012cd14067f63baecce2f3d3b3c4b0de12727a35 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 18 Mar 2025 13:06:22 -0700 Subject: [PATCH 54/65] Bump PMD extension to version 1.2.1 --- lib/bld/bld-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 6d3e0c7..c5da09f 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -2,7 +2,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.4 -bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.2.0 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.2.1 bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=2.2.1 From 3df50c2e792f961f082483b75db1598ca778791b Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 18 Mar 2025 13:07:29 -0700 Subject: [PATCH 55/65] Add generic installation instructions --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6b544a6..cdcb0a0 100755 --- a/README.md +++ b/README.md @@ -8,7 +8,15 @@ [![Snapshot](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/snapshots/com/uwyn/rife2/bld-detekt/maven-metadata.xml?label=snapshot)](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-detekt) [![GitHub CI](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml/badge.svg)](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml) -To install, please refer to the [extensions documentation](https://github.com/rife2/bld/wiki/Extensions). +To install the latest version, add the following to the `lib/bld/bld-wrapper.properties` file: + +```properties +bld.extension-detekt=com.uwyn.rife2:bld-detekt +``` + +For more information, please refer to the [extensions](https://github.com/rife2/bld/wiki/Extensions) documentation. + +## Check Source Code with Detekt To check all Kotlin source code located in the project, add the following to your build file: ```java From 0efd5ab2fe1a51ef8700b94bca9024f322769460 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 18 Mar 2025 23:34:19 -0700 Subject: [PATCH 56/65] JDK 24 --- .github/workflows/bld.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index 6020ea2..15f647d 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: - java-version: [17, 21, 23] + java-version: [17, 21, 24] steps: - name: Checkout source repository From 8d4643d99aa57ee35efe193046d4b3db18b34fd4 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 24 Mar 2025 01:38:50 -0700 Subject: [PATCH 57/65] Bump Kotlin to version 2.1.20 --- examples/.idea/bld.xml | 6 ++++++ examples/src/bld/java/com/example/ExampleBuild.java | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 examples/.idea/bld.xml diff --git a/examples/.idea/bld.xml b/examples/.idea/bld.xml new file mode 100644 index 0000000..6600cee --- /dev/null +++ b/examples/.idea/bld.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index 5c86248..99a2972 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -31,7 +31,7 @@ public class ExampleBuild extends Project { repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES); - final var kotlin = version(2, 1, 10); + final var kotlin = version(2, 1, 20); scope(compile) .include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin)); scope(test) From 30f92d12623dcd35bf220ad14878f39cfe080bde Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 24 Mar 2025 01:39:53 -0700 Subject: [PATCH 58/65] Bump Kotlin extension to version 1.1.0-SNAPSHOT --- examples/lib/bld/bld-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 705e9e2..e693951 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -2,7 +2,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.9 -bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.4 +bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.1.0-SNAPSHOT bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=2.2.1 From 7d5b50641c69be0a0e805a4972e7a3e77ebd86af Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 24 Mar 2025 01:44:39 -0700 Subject: [PATCH 59/65] Add OS matrix to test the project and examples on Ubuntu, Windows and macOS --- .github/workflows/bld.yml | 22 ++++++++++++------- .../bld/extension/DetektOperationBuild.java | 12 ++++++---- .../bld/extension/DetektOperationTest.java | 3 +++ 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index 15f647d..cfed82f 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -1,14 +1,16 @@ name: bld-ci -on: [push, pull_request, workflow_dispatch] +on: [ push, pull_request, workflow_dispatch ] jobs: build-bld-project: - runs-on: ubuntu-latest - strategy: matrix: - java-version: [17, 21, 24] + java-version: [ 17, 21, 24 ] + kotlin-version: [ 1.9.25, 2.0.21, 2.1.20 ] + os: [ ubuntu-latest, windows-latest, macos-latest ] + + runs-on: ${{ matrix.os }} steps: - name: Checkout source repository @@ -22,12 +24,16 @@ jobs: distribution: "zulu" java-version: ${{ matrix.java-version }} - - name: Download dependencies - run: ./bld download - - name: Download dependencies [examples] working-directory: examples run: ./bld download - - name: Run tests + - name: Run tests [examples] + working-directory: examples run: ./bld compile test + + - name: Download dependencies + run: ./bld download + + - name: Run tests + run: ./bld compile test \ No newline at end of file diff --git a/src/bld/java/rife/bld/extension/DetektOperationBuild.java b/src/bld/java/rife/bld/extension/DetektOperationBuild.java index 515bb9e..78f1a3e 100644 --- a/src/bld/java/rife/bld/extension/DetektOperationBuild.java +++ b/src/bld/java/rife/bld/extension/DetektOperationBuild.java @@ -23,6 +23,7 @@ import rife.bld.publish.PublishLicense; import rife.bld.publish.PublishScm; import java.util.List; +import java.util.Locale; import static rife.bld.dependencies.Repository.*; import static rife.bld.dependencies.Scope.compile; @@ -97,10 +98,13 @@ public class DetektOperationBuild extends Project { @Override public void test() throws Exception { - new ExecOperation() - .fromProject(this) - .command("scripts/cliargs.sh") - .execute(); + var os = System.getProperty("os.name"); + if (os != null && os.toLowerCase(Locale.US).contains("linux")) { + new ExecOperation() + .fromProject(this) + .command("scripts/cliargs.sh") + .execute(); + } super.test(); } diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index ecc510a..16e6345 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -19,6 +19,8 @@ package rife.bld.extension; import org.assertj.core.api.AutoCloseableSoftAssertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; import rife.bld.BaseProject; import rife.bld.blueprints.BaseProjectBlueprint; import rife.bld.extension.detekt.Report; @@ -92,6 +94,7 @@ class DetektOperationTest { } @Test + @EnabledOnOs(OS.LINUX) @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops") void testCheckAllParameters() throws IOException { var args = Files.readAllLines(Paths.get("src", "test", "resources", "detekt-args.txt")); From e6d5c6c38fad73a2b3a90c59d97e3d07d0371ec9 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 24 Mar 2025 10:06:41 -0700 Subject: [PATCH 60/65] Quote and clean path in the process command list --- .../rife/bld/extension/DetektOperation.java | 51 ++++++++++++++----- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index 4bfe7f7..fd191f4 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -28,6 +28,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; @@ -55,6 +56,8 @@ public class DetektOperation extends AbstractProcessOperation { "snakeyaml-engine-", "trove4j-"); private static final Logger LOGGER = Logger.getLogger(DetektOperation.class.getName()); + private static final String OS_NAME = + System.getProperty("os.name") != null ? System.getProperty("os.name").toLowerCase(Locale.US) : null; private final Collection classpath_ = new ArrayList<>(); private final Collection config_ = new ArrayList<>(); private final Collection excludes_ = new ArrayList<>(); @@ -290,6 +293,17 @@ public class DetektOperation extends AbstractProcessOperation { return classPath(paths.stream().map(File::new).toList()); } + private String cleanPath(File path) { + return cleanPath(path.getAbsolutePath()); + } + + private String cleanPath(String path) { + if (isWindows()) { + return path.replaceAll("\\\\", "\\\\\\\\"); + } + return path; + } + /** * Paths to the config files ({@code path/to/config.yml}). * @@ -323,7 +337,6 @@ public class DetektOperation extends AbstractProcessOperation { return configStrings(List.of(configs)); } - /** * Paths to the config files ({@code path/to/config.yml}). * @@ -509,7 +522,7 @@ public class DetektOperation extends AbstractProcessOperation { if (project_ != null) { args.add(javaTool()); args.add("-cp"); - args.add(getDetektJarList(project_.libBldDirectory())); + args.add('"' + getDetektJarList(project_.libBldDirectory()) + '"'); args.add("io.gitlab.arturbosch.detekt.cli.Main"); // all-rules @@ -525,13 +538,13 @@ public class DetektOperation extends AbstractProcessOperation { // base-path if (isNotBlank(basePath_)) { args.add("--base-path"); - args.add(basePath_); + args.add('"' + cleanPath(basePath_) + '"'); } // baseline if (isNotBlank(baseline_)) { args.add("--baseline"); - args.add(baseline_); + args.add('"' + cleanPath(baseline_) + '"'); } // build-upon-default-config @@ -542,19 +555,20 @@ public class DetektOperation extends AbstractProcessOperation { // classpath if (!classpath_.isEmpty()) { args.add("--classpath"); - args.add(String.join(File.pathSeparator, classpath_.stream().map(File::getAbsolutePath).toList())); + args.add('"' + String.join(':' + File.pathSeparator, classpath_.stream().map(this::cleanPath).toList()) + + '"'); } // config if (!config_.isEmpty()) { args.add("-config"); - args.add(String.join(";", config_.stream().map(File::getAbsolutePath).toList())); + args.add('"' + String.join(";", config_.stream().map(this::cleanPath).toList()) + '"'); } // config-resource if (isNotBlank(configResource_)) { args.add("--config-resource"); - args.add(configResource_); + args.add('"' + cleanPath(configResource_) + '"'); } // create-baseline @@ -575,7 +589,7 @@ public class DetektOperation extends AbstractProcessOperation { // excludes if (!excludes_.isEmpty()) { args.add("--excludes"); - args.add(String.join(",", excludes_)); + args.add('"' + String.join(",", excludes_.stream().map(this::cleanPath).toList()) + '"'); } // generate-config @@ -586,19 +600,19 @@ public class DetektOperation extends AbstractProcessOperation { // includes if (!includes_.isEmpty()) { args.add("--includes"); - args.add(String.join(",", includes_)); + args.add('"' + String.join(",", includes_.stream().map(this::cleanPath).toList()) + '"'); } // input if (!input_.isEmpty()) { args.add("--input"); - args.add(String.join(",", input_.stream().map(File::getAbsolutePath).toList())); + args.add('"' + String.join(",", input_.stream().map(this::cleanPath).toList()) + '"'); } // jdk-home if (isNotBlank(jdkHome_)) { args.add("--jdk-home"); - args.add(jdkHome_); + args.add('"' + cleanPath(jdkHome_) + '"'); } // jvm-target @@ -627,14 +641,14 @@ public class DetektOperation extends AbstractProcessOperation { // plugins if (!plugins_.isEmpty()) { args.add("--plugins"); - args.add(String.join(",", plugins_.stream().map(File::getAbsolutePath).toList())); + args.add('"' + String.join(",", plugins_.stream().map(this::cleanPath).toList()) + '"'); } // report if (!report_.isEmpty()) { report_.forEach(it -> { args.add("--report"); - args.add(it.id().name().toLowerCase() + ":" + it.path()); + args.add(it.id().name().toLowerCase() + ":\"" + cleanPath(it.path()) + '"'); }); } @@ -693,7 +707,7 @@ public class DetektOperation extends AbstractProcessOperation { if (!f.getName().endsWith("-sources.jar") && !f.getName().endsWith("-javadoc.jar")) { for (var m : DETEKT_JARS) { if (f.getName().startsWith(m)) { - jars.add(f.getAbsolutePath()); + jars.add(cleanPath(f)); break; } } @@ -819,6 +833,15 @@ public class DetektOperation extends AbstractProcessOperation { return s != null && !s.isBlank(); } + /** + * Determines if the current operating system is Windows. + * + * @return true if the operating system is Windows, false otherwise. + */ + private boolean isWindows() { + return OS_NAME != null && OS_NAME.contains("win"); + } + /** * EXPERIMENTAL: Use a custom JDK home directory to include into the * classpath. From 432e5ffed14d8bc7ddd55b88733901bd60f45a39 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 24 Mar 2025 16:09:45 -0700 Subject: [PATCH 61/65] Enable extension logging in examples --- .../src/bld/java/com/example/ExampleBuild.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index 99a2972..a4511d5 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -46,14 +46,14 @@ public class ExampleBuild extends Project { public static void main(String[] args) { // Enable detailed logging -// var level = Level.ALL; -// var logger = Logger.getLogger("rife.bld.extension"); -// var consoleHandler = new ConsoleHandler(); -// -// consoleHandler.setLevel(level); -// logger.addHandler(consoleHandler); -// logger.setLevel(level); -// logger.setUseParentHandlers(false); + var level = Level.ALL; + var logger = Logger.getLogger("rife.bld.extension"); + var consoleHandler = new ConsoleHandler(); + + consoleHandler.setLevel(level); + logger.addHandler(consoleHandler); + logger.setLevel(level); + logger.setUseParentHandlers(false); new ExampleBuild().start(args); } From 3e350e617a2b4a1998f0e9b58c11da8857b22567 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 24 Mar 2025 16:11:11 -0700 Subject: [PATCH 62/65] Bump detekt extension to version 0.9.10-SNAPSHOT --- examples/lib/bld/bld-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index e693951..67eaf60 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,7 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.9 +bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.10-SNAPSHOT bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.1.0-SNAPSHOT bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= From 5a2824507f7866f664d4de909cb3fca8b8ab7a15 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 24 Mar 2025 16:12:15 -0700 Subject: [PATCH 63/65] Removed paths quoting --- .../rife/bld/extension/DetektOperation.java | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index fd191f4..8e3213e 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -522,7 +522,7 @@ public class DetektOperation extends AbstractProcessOperation { if (project_ != null) { args.add(javaTool()); args.add("-cp"); - args.add('"' + getDetektJarList(project_.libBldDirectory()) + '"'); + args.add(getDetektJarList(project_.libBldDirectory())); args.add("io.gitlab.arturbosch.detekt.cli.Main"); // all-rules @@ -538,13 +538,13 @@ public class DetektOperation extends AbstractProcessOperation { // base-path if (isNotBlank(basePath_)) { args.add("--base-path"); - args.add('"' + cleanPath(basePath_) + '"'); + args.add(cleanPath(basePath_)); } // baseline if (isNotBlank(baseline_)) { args.add("--baseline"); - args.add('"' + cleanPath(baseline_) + '"'); + args.add(cleanPath(baseline_)); } // build-upon-default-config @@ -555,20 +555,19 @@ public class DetektOperation extends AbstractProcessOperation { // classpath if (!classpath_.isEmpty()) { args.add("--classpath"); - args.add('"' + String.join(':' + File.pathSeparator, classpath_.stream().map(this::cleanPath).toList()) - + '"'); + args.add(String.join(File.pathSeparator, classpath_.stream().map(this::cleanPath).toList())); } // config if (!config_.isEmpty()) { args.add("-config"); - args.add('"' + String.join(";", config_.stream().map(this::cleanPath).toList()) + '"'); + args.add(String.join(";", config_.stream().map(this::cleanPath).toList())); } // config-resource if (isNotBlank(configResource_)) { args.add("--config-resource"); - args.add('"' + cleanPath(configResource_) + '"'); + args.add(cleanPath(configResource_)); } // create-baseline @@ -589,7 +588,7 @@ public class DetektOperation extends AbstractProcessOperation { // excludes if (!excludes_.isEmpty()) { args.add("--excludes"); - args.add('"' + String.join(",", excludes_.stream().map(this::cleanPath).toList()) + '"'); + args.add(String.join(",", excludes_.stream().map(this::cleanPath).toList())); } // generate-config @@ -600,19 +599,19 @@ public class DetektOperation extends AbstractProcessOperation { // includes if (!includes_.isEmpty()) { args.add("--includes"); - args.add('"' + String.join(",", includes_.stream().map(this::cleanPath).toList()) + '"'); + args.add(String.join(",", includes_.stream().map(this::cleanPath).toList())); } // input if (!input_.isEmpty()) { args.add("--input"); - args.add('"' + String.join(",", input_.stream().map(this::cleanPath).toList()) + '"'); + args.add(String.join(",", input_.stream().map(this::cleanPath).toList())); } // jdk-home if (isNotBlank(jdkHome_)) { args.add("--jdk-home"); - args.add('"' + cleanPath(jdkHome_) + '"'); + args.add(cleanPath(jdkHome_)); } // jvm-target @@ -641,14 +640,14 @@ public class DetektOperation extends AbstractProcessOperation { // plugins if (!plugins_.isEmpty()) { args.add("--plugins"); - args.add('"' + String.join(",", plugins_.stream().map(this::cleanPath).toList()) + '"'); + args.add(String.join(",", plugins_.stream().map(this::cleanPath).toList())); } // report if (!report_.isEmpty()) { report_.forEach(it -> { args.add("--report"); - args.add(it.id().name().toLowerCase() + ":\"" + cleanPath(it.path()) + '"'); + args.add(it.id().name().toLowerCase() + ":" + cleanPath(it.path())); }); } From 69a9eac4143bb74e34ea25469bb6b0e522f30053 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 24 Mar 2025 16:13:07 -0700 Subject: [PATCH 64/65] Add baseline file for testing --- .github/workflows/bld.yml | 4 ++-- examples/src/bld/java/com/example/ExampleBuild.java | 9 +++++++++ examples/src/test/resources/detekt-baseline.xml | 12 ++++++++++++ .../java/rife/bld/extension/DetektOperationTest.java | 2 +- 4 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 examples/src/test/resources/detekt-baseline.xml diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index cfed82f..bacdbae 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -28,9 +28,9 @@ jobs: working-directory: examples run: ./bld download - - name: Run tests [examples] + - name: Run Detekt [examples] working-directory: examples - run: ./bld compile test + run: ./bld compile test-ci - name: Download dependencies run: ./bld download diff --git a/examples/src/bld/java/com/example/ExampleBuild.java b/examples/src/bld/java/com/example/ExampleBuild.java index a4511d5..9a9a49c 100644 --- a/examples/src/bld/java/com/example/ExampleBuild.java +++ b/examples/src/bld/java/com/example/ExampleBuild.java @@ -101,4 +101,13 @@ public class ExampleBuild extends Project { .input("src/test/kotlin") .execute(); } + + @BuildCommand(value = "test-ci", summary = "Run detek with a test baseline") + public void testCi() throws ExitStatusException, IOException, InterruptedException { + // Run detek with the test basline (for CI testing) + new DetektOperation() + .fromProject(this) + .baseline("src/test/resources/detekt-baseline.xml") + .execute(); + } } diff --git a/examples/src/test/resources/detekt-baseline.xml b/examples/src/test/resources/detekt-baseline.xml new file mode 100644 index 0000000..1bf5c16 --- /dev/null +++ b/examples/src/test/resources/detekt-baseline.xml @@ -0,0 +1,12 @@ + + + + + EmptyIfBlock:Example.kt$Example.Companion${ } + MagicNumber:Example.kt$Example$5 + NewLineAtEndOfFile:ExampleTest.kt$com.example.ExampleTest.kt + ThrowingExceptionsWithoutMessageOrCause:Example.kt$Example.Companion$IllegalStateException() + UseCheckOrError:Example.kt$Example.Companion$throw IllegalStateException() + VariableNaming:Example.kt$Example$// https://detekt.dev/docs/rules/naming#variablenaming val Message: String get() = "Hello World!" + + diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index 16e6345..04db107 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -244,7 +244,7 @@ class DetektOperationTest { void testExampleBaseline() throws IOException, ExitStatusException, InterruptedException { var tmpDir = Files.createTempDirectory("bld-detekt-").toFile(); - var baseline = new File(tmpDir, "detekt-baseline.xml"); + var baseline = new File(tmpDir, "examples/src/test/resources/detekt-baseline.xml"); var op = new DetektOperation() .fromProject(new BaseProjectBlueprint(new File("examples"), "com.example", From ea10fd012f8e1788f72f0554d758d9571d7241b8 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 24 Mar 2025 17:42:46 -0700 Subject: [PATCH 65/65] Disable cleanPath() for testing --- .../rife/bld/extension/DetektOperation.java | 50 ++++++------------- 1 file changed, 14 insertions(+), 36 deletions(-) diff --git a/src/main/java/rife/bld/extension/DetektOperation.java b/src/main/java/rife/bld/extension/DetektOperation.java index 8e3213e..2bb17a1 100644 --- a/src/main/java/rife/bld/extension/DetektOperation.java +++ b/src/main/java/rife/bld/extension/DetektOperation.java @@ -28,7 +28,6 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; @@ -52,12 +51,11 @@ public class DetektOperation extends AbstractProcessOperation { "kotlinx-coroutines-", "kotlinx-html-jvm-", "kotlinx-serialization-", + "poko-annotations-jvm-", "sarif4k-jvm-", "snakeyaml-engine-", "trove4j-"); private static final Logger LOGGER = Logger.getLogger(DetektOperation.class.getName()); - private static final String OS_NAME = - System.getProperty("os.name") != null ? System.getProperty("os.name").toLowerCase(Locale.US) : null; private final Collection classpath_ = new ArrayList<>(); private final Collection config_ = new ArrayList<>(); private final Collection excludes_ = new ArrayList<>(); @@ -293,17 +291,6 @@ public class DetektOperation extends AbstractProcessOperation { return classPath(paths.stream().map(File::new).toList()); } - private String cleanPath(File path) { - return cleanPath(path.getAbsolutePath()); - } - - private String cleanPath(String path) { - if (isWindows()) { - return path.replaceAll("\\\\", "\\\\\\\\"); - } - return path; - } - /** * Paths to the config files ({@code path/to/config.yml}). * @@ -538,13 +525,13 @@ public class DetektOperation extends AbstractProcessOperation { // base-path if (isNotBlank(basePath_)) { args.add("--base-path"); - args.add(cleanPath(basePath_)); + args.add(basePath_); } // baseline if (isNotBlank(baseline_)) { args.add("--baseline"); - args.add(cleanPath(baseline_)); + args.add(baseline_); } // build-upon-default-config @@ -555,19 +542,19 @@ public class DetektOperation extends AbstractProcessOperation { // classpath if (!classpath_.isEmpty()) { args.add("--classpath"); - args.add(String.join(File.pathSeparator, classpath_.stream().map(this::cleanPath).toList())); + args.add(String.join(File.pathSeparator, classpath_.stream().map(File::getAbsolutePath).toList())); } // config if (!config_.isEmpty()) { args.add("-config"); - args.add(String.join(";", config_.stream().map(this::cleanPath).toList())); + args.add(String.join(";", config_.stream().map(File::getAbsolutePath).toList())); } // config-resource if (isNotBlank(configResource_)) { args.add("--config-resource"); - args.add(cleanPath(configResource_)); + args.add(configResource_); } // create-baseline @@ -588,7 +575,7 @@ public class DetektOperation extends AbstractProcessOperation { // excludes if (!excludes_.isEmpty()) { args.add("--excludes"); - args.add(String.join(",", excludes_.stream().map(this::cleanPath).toList())); + args.add(String.join(",", excludes_)); } // generate-config @@ -599,19 +586,19 @@ public class DetektOperation extends AbstractProcessOperation { // includes if (!includes_.isEmpty()) { args.add("--includes"); - args.add(String.join(",", includes_.stream().map(this::cleanPath).toList())); + args.add(String.join(",", includes_)); } // input if (!input_.isEmpty()) { args.add("--input"); - args.add(String.join(",", input_.stream().map(this::cleanPath).toList())); + args.add(String.join(",", input_.stream().map(File::getAbsolutePath).toList())); } // jdk-home if (isNotBlank(jdkHome_)) { args.add("--jdk-home"); - args.add(cleanPath(jdkHome_)); + args.add(jdkHome_); } // jvm-target @@ -640,14 +627,14 @@ public class DetektOperation extends AbstractProcessOperation { // plugins if (!plugins_.isEmpty()) { args.add("--plugins"); - args.add(String.join(",", plugins_.stream().map(this::cleanPath).toList())); + args.add(String.join(",", plugins_.stream().map(File::getAbsolutePath).toList())); } // report if (!report_.isEmpty()) { report_.forEach(it -> { args.add("--report"); - args.add(it.id().name().toLowerCase() + ":" + cleanPath(it.path())); + args.add(it.id().name().toLowerCase() + ":" + it.path()); }); } @@ -706,7 +693,7 @@ public class DetektOperation extends AbstractProcessOperation { if (!f.getName().endsWith("-sources.jar") && !f.getName().endsWith("-javadoc.jar")) { for (var m : DETEKT_JARS) { if (f.getName().startsWith(m)) { - jars.add(cleanPath(f)); + jars.add(f.getAbsolutePath()); break; } } @@ -714,7 +701,7 @@ public class DetektOperation extends AbstractProcessOperation { } } } - return String.join(":", jars); + return String.join(File.pathSeparator, jars); } /** @@ -832,15 +819,6 @@ public class DetektOperation extends AbstractProcessOperation { return s != null && !s.isBlank(); } - /** - * Determines if the current operating system is Windows. - * - * @return true if the operating system is Windows, false otherwise. - */ - private boolean isWindows() { - return OS_NAME != null && OS_NAME.contains("win"); - } - /** * EXPERIMENTAL: Use a custom JDK home directory to include into the * classpath.