From e6d5c6c38fad73a2b3a90c59d97e3d07d0371ec9 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 24 Mar 2025 10:06:41 -0700 Subject: [PATCH 1/5] 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 2/5] 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 3/5] 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 4/5] 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 5526cfdcf4e3124139aa8c85c74a91e2ea142234 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 24 Mar 2025 16:13:07 -0700 Subject: [PATCH 5/5] Add baseline file for testing --- .github/workflows/bld.yml | 4 ++-- src/test/java/rife/bld/extension/DetektOperationTest.java | 3 +++ src/test/resources/detekt-baseline.xml | 6 ++++++ 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/detekt-baseline.xml diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index cfed82f..c97ab73 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 detekt - name: Download dependencies run: ./bld download diff --git a/src/test/java/rife/bld/extension/DetektOperationTest.java b/src/test/java/rife/bld/extension/DetektOperationTest.java index 16e6345..7fb2ce8 100644 --- a/src/test/java/rife/bld/extension/DetektOperationTest.java +++ b/src/test/java/rife/bld/extension/DetektOperationTest.java @@ -264,6 +264,7 @@ class DetektOperationTest { var op = new DetektOperation() .fromProject(new BaseProjectBlueprint(new File("examples"), "com.example", "example", "Example")) + .baseline("src/test/resources/detekt-baseline.xml") .maxIssues(8); assertThatNoException().isThrownBy(op::execute); } @@ -281,6 +282,7 @@ class DetektOperationTest { var op = new DetektOperation() .fromProject(new BaseProjectBlueprint(new File("examples"), "com.example", "example", "Example")) + .baseline("src/test/resources/detekt-baseline.xml") .report(new Report(ReportId.HTML, html.getAbsolutePath())) .report(new Report(ReportId.XML, xml.getAbsolutePath())) .report(new Report(ReportId.TXT, txt.getAbsolutePath())) @@ -299,6 +301,7 @@ class DetektOperationTest { var op = new DetektOperation() .fromProject(new BaseProjectBlueprint(new File("examples"), "com.example", "example", "Example")) + .baseline("src/test/resources/detekt-baseline.xml") .debug(true); assertThatThrownBy(op::execute).isInstanceOf(ExitStatusException.class); } diff --git a/src/test/resources/detekt-baseline.xml b/src/test/resources/detekt-baseline.xml new file mode 100644 index 0000000..4d1a6d7 --- /dev/null +++ b/src/test/resources/detekt-baseline.xml @@ -0,0 +1,6 @@ + + + + + +