From a055936e816407b26c25fcd7b92141fa43a08763 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Sun, 19 Oct 2025 12:15:22 +0200 Subject: [PATCH 1/5] Migrate build to shared convention plugins setup --- .github/workflows/ci-build.yml | 6 ++ build.gradle.kts | 75 +++++++------------ gradle/checkstyle/checkstyle.xml | 8 -- gradle/checkstyle/header.txt | 15 ---- settings.gradle.kts | 20 +---- .../testing/test/samples/SamplesTest.java | 3 + .../org/gradlex/testing/NoCrossVersion.java | 4 + 7 files changed, 40 insertions(+), 91 deletions(-) delete mode 100644 gradle/checkstyle/checkstyle.xml delete mode 100644 gradle/checkstyle/header.txt create mode 100644 src/test/java/org/gradlex/testing/NoCrossVersion.java diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index f188622..9f0ffbe 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -12,6 +12,12 @@ jobs: steps: - name: git clone uses: actions/checkout@v5 + - name: git clone gradlex-build-conventions + uses: actions/checkout@v5 + with: + repository: gradlex-org/plugin-publish-conventions + path: build/plugin-publish-conventions + ref: new-convention-plugins - name: Set up JDK uses: actions/setup-java@v5 with: diff --git a/build.gradle.kts b/build.gradle.kts index dc76484..3ed2f9c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,50 +1,25 @@ -plugins { - id("groovy") - id("org.gradlex.internal.plugin-publish-conventions") version "0.6" -} - -group = "org.gradlex" -version = "1.7" - -tasks.withType().configureEach { options.release = 8 } - -dependencies { - testImplementation("org.spockframework:spock-core:2.3-groovy-4.0") - testImplementation("org.gradle.exemplar:samples-check:1.0.3") - testRuntimeOnly("org.junit.vintage:junit-vintage-engine") -} - -pluginPublishConventions { - id("${project.group}.${project.name}") - implementationClass("org.gradlex.javamodule.testing.JavaModuleTestingPlugin") - displayName("Java Module Testing Gradle Plugin") - description("A plugin to test Java Modules (whitebox and blackbox) without the hassle.") - tags("gradlex", "java", "modularity", "jigsaw", "jpms", "testing") - gitHub("https://github.com/gradlex-org/java-module-testing") - developer { - id.set("jjohannes") - name.set("Jendrik Johannes") - email.set("jendrik@gradlex.org") - } -} - -testing.suites.named("test") { - useJUnitJupiter() - listOf("7.4", "7.6.5", "8.0.2", "8.14.2").forEach { gradleVersionUnderTest -> - targets.register("test${gradleVersionUnderTest}") { - testTask { - group = LifecycleBasePlugin.VERIFICATION_GROUP - description = "Runs tests against Gradle $gradleVersionUnderTest" - systemProperty("gradleVersionUnderTest", gradleVersionUnderTest) - exclude("**/*SamplesTest.class") // Not yet cross-version ready - } - } - } - targets.all { - testTask { - maxParallelForks = 4 - inputs.dir(layout.projectDirectory.dir("samples")) - inputs.dir("samples") - } - } -} +version = "1.7" + +pluginPublishConventions { + id("${project.group}.${project.name}") + implementationClass("org.gradlex.javamodule.testing.JavaModuleTestingPlugin") + displayName("Java Module Testing Gradle Plugin") + description("A plugin to test Java Modules (whitebox and blackbox) without the hassle.") + tags("gradlex", "java", "modularity", "jigsaw", "jpms", "testing") + gitHub("https://github.com/gradlex-org/java-module-testing") + developer { + id.set("jjohannes") + name.set("Jendrik Johannes") + email.set("jendrik@gradlex.org") + } +} + +testingConventions { testGradleVersions("7.4", "7.6.5", "8.0.2", "8.14.2") } + +// === the following custom configuration should be removed once tests are migrated to Java +apply(plugin = "groovy") + +tasks.named("compileTestGroovy") { targetCompatibility = "11" } // allow tests to run against 6.x + +dependencies { testImplementation("org.spockframework:spock-core:2.3-groovy-4.0") } // +// ==================================================================================== diff --git a/gradle/checkstyle/checkstyle.xml b/gradle/checkstyle/checkstyle.xml deleted file mode 100644 index 987e06d..0000000 --- a/gradle/checkstyle/checkstyle.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/gradle/checkstyle/header.txt b/gradle/checkstyle/header.txt deleted file mode 100644 index 4fe8a00..0000000 --- a/gradle/checkstyle/header.txt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index c22596d..5b0e3c5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,21 +1,5 @@ -plugins { - id("com.gradle.develocity") version "4.2.2" -} +pluginManagement { includeBuild("../plugin-publish-conventions") } -dependencyResolutionManagement { - repositories.mavenCentral() -} +plugins { id("org.gradlex.internal.gradlex-build-conventions") version "0.7" } rootProject.name = "java-module-testing" - -develocity { - buildScan { - val isCi = providers.environmentVariable("CI").getOrElse("false").toBoolean() - if (isCi) { - termsOfUseUrl = "https://gradle.com/help/legal-terms-of-use" - termsOfUseAgree = "yes" - } else { - publishing.onlyIf { false } - } - } -} diff --git a/src/test/java/org/gradlex/javamodule/testing/test/samples/SamplesTest.java b/src/test/java/org/gradlex/javamodule/testing/test/samples/SamplesTest.java index 2e9979c..2371fd4 100644 --- a/src/test/java/org/gradlex/javamodule/testing/test/samples/SamplesTest.java +++ b/src/test/java/org/gradlex/javamodule/testing/test/samples/SamplesTest.java @@ -19,11 +19,14 @@ import org.gradle.exemplar.test.runner.SampleModifiers; import org.gradle.exemplar.test.runner.SamplesRoot; import org.gradle.exemplar.test.runner.SamplesRunner; +import org.gradlex.testing.NoCrossVersion; +import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; @RunWith(SamplesRunner.class) @SamplesRoot("samples") @SampleModifiers(PluginBuildLocationSampleModifier.class) +@Category(NoCrossVersion.class) public class SamplesTest { } diff --git a/src/test/java/org/gradlex/testing/NoCrossVersion.java b/src/test/java/org/gradlex/testing/NoCrossVersion.java new file mode 100644 index 0000000..6cf2735 --- /dev/null +++ b/src/test/java/org/gradlex/testing/NoCrossVersion.java @@ -0,0 +1,4 @@ +package org.gradlex.testing; + +public @interface NoCrossVersion { +} From 3820a469d3c8ee3cad09a9914255f7e1d7162cf7 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Sun, 19 Oct 2025 12:18:34 +0200 Subject: [PATCH 2/5] Format code --- .../testing/JavaModuleTestingExtension.java | 231 +++++++++++------- .../testing/JavaModuleTestingPlugin.java | 22 +- .../javamodule/testing/TaskLockService.java | 17 +- .../testing/WhiteboxJvmTestSuite.java | 17 +- .../testing/internal/ModuleInfoParser.java | 37 +-- .../internal/ModuleInfoRequiresParser.java | 25 +- .../JavaCompileSetModulePathAction.java | 28 +-- .../bridges/JavaModuleDependenciesBridge.java | 33 +-- .../WhiteboxTestCompileArgumentProvider.java | 40 +-- .../WhiteboxTestRuntimeArgumentProvider.java | 41 ++-- .../PluginBuildLocationSampleModifier.java | 37 ++- .../testing/test/samples/SamplesTest.java | 21 +- .../org/gradlex/testing/NoCrossVersion.java | 4 +- 13 files changed, 231 insertions(+), 322 deletions(-) diff --git a/src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingExtension.java b/src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingExtension.java index 6b0e19f..75fbaf5 100644 --- a/src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingExtension.java +++ b/src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingExtension.java @@ -1,21 +1,11 @@ -/* - * Copyright the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.javamodule.testing; +import java.io.File; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import javax.inject.Inject; import org.gradle.api.Action; import org.gradle.api.Describable; import org.gradle.api.Project; @@ -41,12 +31,6 @@ import org.gradlex.javamodule.testing.internal.provider.WhiteboxTestCompileArgumentProvider; import org.gradlex.javamodule.testing.internal.provider.WhiteboxTestRuntimeArgumentProvider; -import javax.inject.Inject; -import java.io.File; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - @SuppressWarnings("UnstableApiUsage") public abstract class JavaModuleTestingExtension { private static final Action NO_OP_ACTION = c -> {}; @@ -59,7 +43,8 @@ public JavaModuleTestingExtension(Project project) { TestingExtension testing = project.getExtensions().getByType(TestingExtension.class); testing.getSuites().withType(JvmTestSuite.class).configureEach(jvmTestSuite -> { - boolean isTestModule = jvmTestSuite.getSources().getJava().getSrcDirs().stream().anyMatch(src -> new File(src, "module-info.java").exists()); + boolean isTestModule = jvmTestSuite.getSources().getJava().getSrcDirs().stream() + .anyMatch(src -> new File(src, "module-info.java").exists()); if ("test".equals(jvmTestSuite.getName())) { jvmTestSuite.useJUnitJupiter(); // override old Gradle convention to default to JUnit5 for all suites } @@ -135,41 +120,77 @@ public void classpath(TestSuite jvmTestSuite) { public void whitebox(TestSuite jvmTestSuite, Action conf) { if (jvmTestSuite instanceof JvmTestSuite) { SourceSet suiteSourceSet = ((JvmTestSuite) jvmTestSuite).getSources(); - boolean testFolderExists = suiteSourceSet.getJava().getSrcDirs().stream().anyMatch(File::exists); + boolean testFolderExists = + suiteSourceSet.getJava().getSrcDirs().stream().anyMatch(File::exists); if (!testFolderExists) { - // Remove the dependencies added by Gradle in case the test directory is missing. Then stop. This allows the use of 'useJUnitJupiter("")' without hassle. - project.getConfigurations().getByName(suiteSourceSet.getImplementationConfigurationName(), implementation -> - implementation.withDependencies(dependencySet -> dependencySet.removeIf(d -> "org.junit.jupiter".equals(d.getGroup()) && "junit-jupiter".equals(d.getName())))); - project.getConfigurations().getByName(suiteSourceSet.getRuntimeOnlyConfigurationName(), runtimeOnly -> - runtimeOnly.withDependencies(dependencySet -> dependencySet.removeIf(d -> "org.junit.platform".equals(d.getGroup()) && "junit-platform-launcher".equals(d.getName())))); + // Remove the dependencies added by Gradle in case the test directory is missing. Then stop. This allows + // the use of 'useJUnitJupiter("")' without hassle. + project.getConfigurations() + .getByName( + suiteSourceSet.getImplementationConfigurationName(), + implementation -> implementation.withDependencies(dependencySet -> + dependencySet.removeIf(d -> "org.junit.jupiter".equals(d.getGroup()) + && "junit-jupiter".equals(d.getName())))); + project.getConfigurations() + .getByName( + suiteSourceSet.getRuntimeOnlyConfigurationName(), + runtimeOnly -> runtimeOnly.withDependencies(dependencySet -> + dependencySet.removeIf(d -> "org.junit.platform".equals(d.getGroup()) + && "junit-platform-launcher".equals(d.getName())))); return; } WhiteboxJvmTestSuite whiteboxJvmTestSuite = project.getObjects().newInstance(WhiteboxJvmTestSuite.class); - whiteboxJvmTestSuite.getSourcesUnderTest().convention(project.getExtensions().getByType(SourceSetContainer.class).getByName(SourceSet.MAIN_SOURCE_SET_NAME)); - whiteboxJvmTestSuite.getRequires().addAll(requiresFromModuleInfo((JvmTestSuite) jvmTestSuite, whiteboxJvmTestSuite.getSourcesUnderTest(), false)); - whiteboxJvmTestSuite.getRequiresRuntime().addAll(requiresFromModuleInfo((JvmTestSuite) jvmTestSuite, whiteboxJvmTestSuite.getSourcesUnderTest(), true)); + whiteboxJvmTestSuite + .getSourcesUnderTest() + .convention(project.getExtensions() + .getByType(SourceSetContainer.class) + .getByName(SourceSet.MAIN_SOURCE_SET_NAME)); + whiteboxJvmTestSuite + .getRequires() + .addAll(requiresFromModuleInfo( + (JvmTestSuite) jvmTestSuite, whiteboxJvmTestSuite.getSourcesUnderTest(), false)); + whiteboxJvmTestSuite + .getRequiresRuntime() + .addAll(requiresFromModuleInfo( + (JvmTestSuite) jvmTestSuite, whiteboxJvmTestSuite.getSourcesUnderTest(), true)); conf.execute(whiteboxJvmTestSuite); configureJvmTestSuiteForWhitebox((JvmTestSuite) jvmTestSuite, whiteboxJvmTestSuite); } } - private Provider> requiresFromModuleInfo(JvmTestSuite jvmTestSuite, Provider sourcesUnderTest, boolean runtimeOnly) { - RegularFile moduleInfoFile = project.getLayout().getProjectDirectory().file(whiteboxModuleInfo(jvmTestSuite).getAbsolutePath()); - Provider moduleInfoContent = project.getProviders().fileContents(moduleInfoFile).getAsText(); - return moduleInfoContent.map(c -> { - ModuleInfoParser moduleInfoParser = new ModuleInfoParser(project.getLayout(), project.getProviders()); - String mainModuleName = moduleInfoParser.moduleName(sourcesUnderTest.get().getAllJava().getSrcDirs()); - List requires = ModuleInfoRequiresParser.parse(moduleInfoContent.get(), runtimeOnly); - if (requires.stream().anyMatch(r -> r.equals(mainModuleName)) || runtimeOnly) { - return requires.stream().filter(r -> !r.equals(mainModuleName)).collect(Collectors.toList()); - } - return Collections.emptyList(); - }).orElse(Collections.emptyList()); + private Provider> requiresFromModuleInfo( + JvmTestSuite jvmTestSuite, Provider sourcesUnderTest, boolean runtimeOnly) { + RegularFile moduleInfoFile = project.getLayout() + .getProjectDirectory() + .file(whiteboxModuleInfo(jvmTestSuite).getAbsolutePath()); + Provider moduleInfoContent = + project.getProviders().fileContents(moduleInfoFile).getAsText(); + return moduleInfoContent + .map(c -> { + ModuleInfoParser moduleInfoParser = + new ModuleInfoParser(project.getLayout(), project.getProviders()); + String mainModuleName = moduleInfoParser.moduleName( + sourcesUnderTest.get().getAllJava().getSrcDirs()); + List requires = ModuleInfoRequiresParser.parse(moduleInfoContent.get(), runtimeOnly); + if (requires.stream().anyMatch(r -> r.equals(mainModuleName)) || runtimeOnly) { + return requires.stream() + .filter(r -> !r.equals(mainModuleName)) + .collect(Collectors.toList()); + } + return Collections.emptyList(); + }) + .orElse(Collections.emptyList()); } private File whiteboxModuleInfo(JvmTestSuite jvmTestSuite) { - File sourceSetDir = jvmTestSuite.getSources().getJava().getSrcDirs().iterator().next().getParentFile(); + File sourceSetDir = jvmTestSuite + .getSources() + .getJava() + .getSrcDirs() + .iterator() + .next() + .getParentFile(); return new File(sourceSetDir, "java9/module-info.java"); } @@ -190,23 +211,28 @@ private void configureJvmTestSuiteForBlackbox(JvmTestSuite jvmTestSuite) { tasks.named(sourceSet.getName(), Test.class, t -> { // Classpath consists only of Jars to include classes+resources in one place - t.setClasspath(configurations.getByName(sourceSet.getRuntimeClasspathConfigurationName()).plus(project.files(jarTask))); + t.setClasspath(configurations + .getByName(sourceSet.getRuntimeClasspathConfigurationName()) + .plus(project.files(jarTask))); // Reset test classes dir t.setTestClassesDirs(sourceSet.getOutput().getClassesDirs()); }); } - private void configureJvmTestSuiteForWhitebox(JvmTestSuite jvmTestSuite, WhiteboxJvmTestSuite whiteboxJvmTestSuite) { + private void configureJvmTestSuiteForWhitebox( + JvmTestSuite jvmTestSuite, WhiteboxJvmTestSuite whiteboxJvmTestSuite) { ConfigurationContainer configurations = project.getConfigurations(); DependencyHandler dependencies = project.getDependencies(); TaskContainer tasks = project.getTasks(); ModuleInfoParser moduleInfoParser = new ModuleInfoParser(project.getLayout(), project.getProviders()); SourceSet testSources = jvmTestSuite.getSources(); - JavaModuleDependenciesBridge.addRequiresRuntimeSupport(project, whiteboxJvmTestSuite.getSourcesUnderTest().get(), jvmTestSuite.getSources()); + JavaModuleDependenciesBridge.addRequiresRuntimeSupport( + project, whiteboxJvmTestSuite.getSourcesUnderTest().get(), jvmTestSuite.getSources()); tasks.named(testSources.getCompileJavaTaskName(), JavaCompile.class, compileJava -> { - SourceSet sourcesUnderTest = whiteboxJvmTestSuite.getSourcesUnderTest().get(); + SourceSet sourcesUnderTest = + whiteboxJvmTestSuite.getSourcesUnderTest().get(); Configuration compileOnly = configurations.getByName(sourcesUnderTest.getCompileOnlyConfigurationName()); Configuration testCompileOnly = configurations.getByName(testSources.getCompileOnlyConfigurationName()); @@ -214,43 +240,66 @@ private void configureJvmTestSuiteForWhitebox(JvmTestSuite jvmTestSuite, Whitebo testCompileOnly.extendsFrom(compileOnly); } - compileJava.setClasspath(sourcesUnderTest.getOutput().plus(configurations.getByName(testSources.getCompileClasspathConfigurationName()))); + compileJava.setClasspath(sourcesUnderTest + .getOutput() + .plus(configurations.getByName(testSources.getCompileClasspathConfigurationName()))); - WhiteboxTestCompileArgumentProvider argumentProvider = (WhiteboxTestCompileArgumentProvider) compileJava.getOptions().getCompilerArgumentProviders().stream() - .filter(p -> p instanceof WhiteboxTestCompileArgumentProvider).findFirst().orElseGet(() -> { - WhiteboxTestCompileArgumentProvider newProvider = new WhiteboxTestCompileArgumentProvider( - sourcesUnderTest.getJava().getSrcDirs(), - testSources.getJava().getSrcDirs(), - moduleInfoParser, - project.getObjects()); - compileJava.getOptions().getCompilerArgumentProviders().add(newProvider); - compileJava.doFirst(project.getObjects().newInstance(JavaCompileSetModulePathAction.class)); - return newProvider; - }); - argumentProvider.testRequires(JavaModuleDependenciesBridge.getCompileClasspathModules(project, testSources)); + WhiteboxTestCompileArgumentProvider argumentProvider = (WhiteboxTestCompileArgumentProvider) + compileJava.getOptions().getCompilerArgumentProviders().stream() + .filter(p -> p instanceof WhiteboxTestCompileArgumentProvider) + .findFirst() + .orElseGet(() -> { + WhiteboxTestCompileArgumentProvider newProvider = + new WhiteboxTestCompileArgumentProvider( + sourcesUnderTest.getJava().getSrcDirs(), + testSources.getJava().getSrcDirs(), + moduleInfoParser, + project.getObjects()); + compileJava + .getOptions() + .getCompilerArgumentProviders() + .add(newProvider); + compileJava.doFirst( + project.getObjects().newInstance(JavaCompileSetModulePathAction.class)); + return newProvider; + }); + argumentProvider.testRequires( + JavaModuleDependenciesBridge.getCompileClasspathModules(project, testSources)); argumentProvider.testRequires(whiteboxJvmTestSuite.getRequires()); }); tasks.named(testSources.getName(), Test.class, test -> { - SourceSet sourcesUnderTest = whiteboxJvmTestSuite.getSourcesUnderTest().get(); - test.setClasspath(configurations.getByName(testSources.getRuntimeClasspathConfigurationName()).plus(sourcesUnderTest.getOutput()).plus(testSources.getOutput())); + SourceSet sourcesUnderTest = + whiteboxJvmTestSuite.getSourcesUnderTest().get(); + test.setClasspath(configurations + .getByName(testSources.getRuntimeClasspathConfigurationName()) + .plus(sourcesUnderTest.getOutput()) + .plus(testSources.getOutput())); // Add main classes here so that Gradle finds module-info.class and treats this as a test with module path - test.setTestClassesDirs(sourcesUnderTest.getOutput().getClassesDirs().plus(testSources.getOutput().getClassesDirs())); + test.setTestClassesDirs(sourcesUnderTest + .getOutput() + .getClassesDirs() + .plus(testSources.getOutput().getClassesDirs())); - WhiteboxTestRuntimeArgumentProvider argumentProvider = (WhiteboxTestRuntimeArgumentProvider) test.getJvmArgumentProviders().stream() - .filter(p -> p instanceof WhiteboxTestRuntimeArgumentProvider).findFirst().orElseGet(() -> { - WhiteboxTestRuntimeArgumentProvider newProvider = new WhiteboxTestRuntimeArgumentProvider( - sourcesUnderTest.getJava().getSrcDirs(), - testSources.getJava().getClassesDirectory(), - sourcesUnderTest.getOutput().getResourcesDir(), - testSources.getOutput().getResourcesDir(), - moduleInfoParser, - project.getObjects()); - test.getJvmArgumentProviders().add(newProvider); - return newProvider; - }); - argumentProvider.testRequires(JavaModuleDependenciesBridge.getRuntimeClasspathModules(project, testSources)); + WhiteboxTestRuntimeArgumentProvider argumentProvider = + (WhiteboxTestRuntimeArgumentProvider) test.getJvmArgumentProviders().stream() + .filter(p -> p instanceof WhiteboxTestRuntimeArgumentProvider) + .findFirst() + .orElseGet(() -> { + WhiteboxTestRuntimeArgumentProvider newProvider = + new WhiteboxTestRuntimeArgumentProvider( + sourcesUnderTest.getJava().getSrcDirs(), + testSources.getJava().getClassesDirectory(), + sourcesUnderTest.getOutput().getResourcesDir(), + testSources.getOutput().getResourcesDir(), + moduleInfoParser, + project.getObjects()); + test.getJvmArgumentProviders().add(newProvider); + return newProvider; + }); + argumentProvider.testRequires( + JavaModuleDependenciesBridge.getRuntimeClasspathModules(project, testSources)); argumentProvider.testRequires(whiteboxJvmTestSuite.getRequires()); argumentProvider.testOpensTo(JavaModuleDependenciesBridge.getOpensToModules(project, testSources)); argumentProvider.testOpensTo(whiteboxJvmTestSuite.getOpensTo()); @@ -261,7 +310,10 @@ private void configureJvmTestSuiteForWhitebox(JvmTestSuite jvmTestSuite, Whitebo Configuration implementation = configurations.getByName(testSources.getImplementationConfigurationName()); implementation.withDependencies(d -> { for (String requiresModuleName : whiteboxJvmTestSuite.getRequires().get()) { - Provider dependency = JavaModuleDependenciesBridge.create(project, requiresModuleName, whiteboxJvmTestSuite.getSourcesUnderTest().get()); + Provider dependency = JavaModuleDependenciesBridge.create( + project, + requiresModuleName, + whiteboxJvmTestSuite.getSourcesUnderTest().get()); if (dependency != null) { dependencies.addProvider(implementation.getName(), dependency); } @@ -269,8 +321,12 @@ private void configureJvmTestSuiteForWhitebox(JvmTestSuite jvmTestSuite, Whitebo }); Configuration runtimeOnly = configurations.getByName(testSources.getRuntimeOnlyConfigurationName()); runtimeOnly.withDependencies(d -> { - for (String requiresModuleName : whiteboxJvmTestSuite.getRequiresRuntime().get()) { - Provider dependency = JavaModuleDependenciesBridge.create(project, requiresModuleName, whiteboxJvmTestSuite.getSourcesUnderTest().get()); + for (String requiresModuleName : + whiteboxJvmTestSuite.getRequiresRuntime().get()) { + Provider dependency = JavaModuleDependenciesBridge.create( + project, + requiresModuleName, + whiteboxJvmTestSuite.getSourcesUnderTest().get()); if (dependency != null) { dependencies.addProvider(runtimeOnly.getName(), dependency); } @@ -287,9 +343,16 @@ private void revertJvmTestSuiteForWhitebox(JvmTestSuite jvmTestSuite) { tasks.named(testSources.getCompileJavaTaskName(), JavaCompile.class, compileJava -> { compileJava.setClasspath(testSources.getCompileClasspath()); - compileJava.getOptions().getCompilerArgumentProviders().removeIf(p -> p instanceof WhiteboxTestCompileArgumentProvider); - compileJava.getActions().removeIf(a -> a instanceof Describable - && JavaCompileSetModulePathAction.class.getName().equals(((Describable) a).getDisplayName())); + compileJava + .getOptions() + .getCompilerArgumentProviders() + .removeIf(p -> p instanceof WhiteboxTestCompileArgumentProvider); + compileJava + .getActions() + .removeIf(a -> a instanceof Describable + && JavaCompileSetModulePathAction.class + .getName() + .equals(((Describable) a).getDisplayName())); }); tasks.named(testSources.getName(), Test.class, test -> { diff --git a/src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingPlugin.java b/src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingPlugin.java index f64e2a7..4ac5db0 100644 --- a/src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingPlugin.java +++ b/src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingPlugin.java @@ -1,19 +1,4 @@ -/* - * Copyright the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.javamodule.testing; import org.gradle.api.Plugin; @@ -22,7 +7,6 @@ import org.gradle.util.GradleVersion; import org.jspecify.annotations.NullMarked; -@SuppressWarnings("unused") @NullMarked public abstract class JavaModuleTestingPlugin implements Plugin { @@ -31,7 +15,7 @@ public void apply(Project project) { if (GradleVersion.current().compareTo(GradleVersion.version("7.4")) < 0) { throw new RuntimeException("This plugin requires Gradle 7.4+"); } - project.getPlugins().withType(JvmTestSuitePlugin.class, p-> - project.getExtensions().create("javaModuleTesting", JavaModuleTestingExtension.class)); + project.getPlugins().withType(JvmTestSuitePlugin.class, p -> project.getExtensions() + .create("javaModuleTesting", JavaModuleTestingExtension.class)); } } diff --git a/src/main/java/org/gradlex/javamodule/testing/TaskLockService.java b/src/main/java/org/gradlex/javamodule/testing/TaskLockService.java index 3622c4f..3f7c583 100644 --- a/src/main/java/org/gradlex/javamodule/testing/TaskLockService.java +++ b/src/main/java/org/gradlex/javamodule/testing/TaskLockService.java @@ -1,19 +1,4 @@ -/* - * Copyright the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.javamodule.testing; import org.gradle.api.services.BuildService; diff --git a/src/main/java/org/gradlex/javamodule/testing/WhiteboxJvmTestSuite.java b/src/main/java/org/gradlex/javamodule/testing/WhiteboxJvmTestSuite.java index 17b7495..83fd5b0 100644 --- a/src/main/java/org/gradlex/javamodule/testing/WhiteboxJvmTestSuite.java +++ b/src/main/java/org/gradlex/javamodule/testing/WhiteboxJvmTestSuite.java @@ -1,19 +1,4 @@ -/* - * Copyright the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.javamodule.testing; import org.gradle.api.provider.ListProperty; diff --git a/src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoParser.java b/src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoParser.java index 077b4f6..be9764b 100644 --- a/src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoParser.java +++ b/src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoParser.java @@ -1,30 +1,14 @@ -/* - * Copyright the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.javamodule.testing.internal; -import org.gradle.api.file.ProjectLayout; -import org.gradle.api.file.RegularFile; -import org.gradle.api.provider.Provider; -import org.gradle.api.provider.ProviderFactory; - import java.io.File; import java.util.Arrays; import java.util.List; import java.util.Set; +import org.gradle.api.file.ProjectLayout; +import org.gradle.api.file.RegularFile; +import org.gradle.api.provider.Provider; +import org.gradle.api.provider.ProviderFactory; public class ModuleInfoParser { @@ -38,8 +22,10 @@ public ModuleInfoParser(ProjectLayout layout, ProviderFactory providers) { public String moduleName(Set sourceFolders) { for (File folder : sourceFolders) { - Provider moduleInfoFile = layout.file(providers.provider(() -> new File(folder, "module-info.java"))); - Provider moduleInfoContent = providers.fileContents(moduleInfoFile).getAsText(); + Provider moduleInfoFile = + layout.file(providers.provider(() -> new File(folder, "module-info.java"))); + Provider moduleInfoContent = + providers.fileContents(moduleInfoFile).getAsText(); if (moduleInfoContent.isPresent()) { return moduleName(moduleInfoContent.get()); } @@ -51,9 +37,8 @@ static String moduleName(String moduleInfoFileContent) { boolean inComment = false; boolean moduleKeywordFound = false; - for(String line: moduleInfoFileContent.split("\n")) { - String cleanedLine = line - .replaceAll("/\\*.*\\*/", "") // open & close in this line + for (String line : moduleInfoFileContent.split("\n")) { + String cleanedLine = line.replaceAll("/\\*.*\\*/", "") // open & close in this line .replaceAll("//.*", ""); // line comment inComment = inComment || cleanedLine.contains("/*"); cleanedLine = cleanedLine.replaceAll("/\\*.*", ""); // open in this line diff --git a/src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoRequiresParser.java b/src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoRequiresParser.java index 9f7edc1..d15e364 100644 --- a/src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoRequiresParser.java +++ b/src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoRequiresParser.java @@ -1,19 +1,4 @@ -/* - * Copyright the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.javamodule.testing.internal; import java.util.ArrayList; @@ -26,7 +11,7 @@ public class ModuleInfoRequiresParser { public static List parse(String moduleInfoFileContent, boolean runtimeOnly) { List requires = new ArrayList<>(); boolean insideComment = false; - for(String line: moduleInfoFileContent.split("\n")) { + for (String line : moduleInfoFileContent.split("\n")) { insideComment = parseLine(line, insideComment, requires, runtimeOnly); } return requires; @@ -35,7 +20,8 @@ public static List parse(String moduleInfoFileContent, boolean runtimeOn /** * @return true, if we are inside a multi-line comment after this line */ - private static boolean parseLine(String moduleLine, boolean insideComment, List requires, boolean runtimeOnly) { + private static boolean parseLine( + String moduleLine, boolean insideComment, List requires, boolean runtimeOnly) { if (insideComment) { return !moduleLine.contains("*/"); } @@ -45,7 +31,8 @@ private static boolean parseLine(String moduleLine, boolean insideComment, List< .replace("{", "") .replace(RUNTIME_KEYWORD, "runtime") .replaceAll("/\\*.*?\\*/", " ") - .trim().split("\\s+")); + .trim() + .split("\\s+")); int singleLineCommentStartIndex = tokens.indexOf("//"); if (singleLineCommentStartIndex >= 0) { tokens = tokens.subList(0, singleLineCommentStartIndex); diff --git a/src/main/java/org/gradlex/javamodule/testing/internal/actions/JavaCompileSetModulePathAction.java b/src/main/java/org/gradlex/javamodule/testing/internal/actions/JavaCompileSetModulePathAction.java index 3ddc7f8..b98f665 100644 --- a/src/main/java/org/gradlex/javamodule/testing/internal/actions/JavaCompileSetModulePathAction.java +++ b/src/main/java/org/gradlex/javamodule/testing/internal/actions/JavaCompileSetModulePathAction.java @@ -1,21 +1,9 @@ -/* - * Copyright the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.javamodule.testing.internal.actions; +import java.util.ArrayList; +import java.util.List; +import javax.inject.Inject; import org.gradle.api.Action; import org.gradle.api.Describable; import org.gradle.api.Task; @@ -24,10 +12,6 @@ import org.gradle.internal.jvm.JavaModuleDetector; import org.jspecify.annotations.NullMarked; -import javax.inject.Inject; -import java.util.ArrayList; -import java.util.List; - @NullMarked public abstract class JavaCompileSetModulePathAction implements Action, Describable { @@ -47,7 +31,9 @@ public void execute(Task task) { // Since for Gradle this sources set does not look like a module, we have to define the module path ourselves compilerArgs.add("--module-path"); - compilerArgs.add(getJavaModuleDetector().inferModulePath(true, classpathAndModulePath).getAsPath()); + compilerArgs.add(getJavaModuleDetector() + .inferModulePath(true, classpathAndModulePath) + .getAsPath()); javaCompile.setClasspath(getJavaModuleDetector().inferClasspath(true, classpathAndModulePath)); javaCompile.getOptions().setCompilerArgs(compilerArgs); } diff --git a/src/main/java/org/gradlex/javamodule/testing/internal/bridges/JavaModuleDependenciesBridge.java b/src/main/java/org/gradlex/javamodule/testing/internal/bridges/JavaModuleDependenciesBridge.java index 5dbecef..22f5f1f 100644 --- a/src/main/java/org/gradlex/javamodule/testing/internal/bridges/JavaModuleDependenciesBridge.java +++ b/src/main/java/org/gradlex/javamodule/testing/internal/bridges/JavaModuleDependenciesBridge.java @@ -1,32 +1,16 @@ -/* - * Copyright the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.javamodule.testing.internal.bridges; -import org.gradle.api.Project; -import org.gradle.api.provider.Provider; -import org.gradle.api.tasks.SourceSet; - import java.lang.reflect.Method; import java.util.Collections; import java.util.List; +import org.gradle.api.Project; +import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.SourceSet; public class JavaModuleDependenciesBridge { - public static Provider create(Project project, String moduleName, SourceSet sourceSetWithModuleInfo) { + public static Provider create(Project project, String moduleName, SourceSet sourceSetWithModuleInfo) { Object javaModuleDependencies = project.getExtensions().findByName("javaModuleDependencies"); if (javaModuleDependencies == null) { return null; @@ -39,13 +23,16 @@ public static Provider create(Project project, String moduleName, SourceSet s } } - public static void addRequiresRuntimeSupport(Project project, SourceSet sourceSetForModuleInfo, SourceSet sourceSetForClasspath) { + public static void addRequiresRuntimeSupport( + Project project, SourceSet sourceSetForModuleInfo, SourceSet sourceSetForClasspath) { Object javaModuleDependencies = project.getExtensions().findByName("javaModuleDependencies"); if (javaModuleDependencies == null) { return; } try { - Method addRequiresRuntimeSupport = javaModuleDependencies.getClass().getMethod("addRequiresRuntimeSupport", SourceSet.class, SourceSet.class); + Method addRequiresRuntimeSupport = javaModuleDependencies + .getClass() + .getMethod("addRequiresRuntimeSupport", SourceSet.class, SourceSet.class); addRequiresRuntimeSupport.invoke(javaModuleDependencies, sourceSetForModuleInfo, sourceSetForClasspath); } catch (NoSuchMethodException e) { //noinspection UnnecessaryReturnStatement diff --git a/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestCompileArgumentProvider.java b/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestCompileArgumentProvider.java index ae60427..4303ab9 100644 --- a/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestCompileArgumentProvider.java +++ b/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestCompileArgumentProvider.java @@ -1,35 +1,16 @@ -/* - * Copyright the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.javamodule.testing.internal.provider; -import org.gradle.api.file.FileCollection; -import org.gradle.api.model.ObjectFactory; -import org.gradle.api.provider.ListProperty; -import org.gradle.api.provider.Provider; -import org.gradlex.javamodule.testing.internal.ModuleInfoParser; -import org.gradle.api.tasks.compile.JavaCompile; -import org.gradle.internal.jvm.JavaModuleDetector; -import org.gradle.process.CommandLineArgumentProvider; - import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.provider.ListProperty; +import org.gradle.api.provider.Provider; +import org.gradle.process.CommandLineArgumentProvider; +import org.gradlex.javamodule.testing.internal.ModuleInfoParser; public class WhiteboxTestCompileArgumentProvider implements CommandLineArgumentProvider { private final Set mainSourceFolders; @@ -39,7 +20,10 @@ public class WhiteboxTestCompileArgumentProvider implements CommandLineArgumentP private final ListProperty allTestRequires; public WhiteboxTestCompileArgumentProvider( - Set mainSourceFolders, Set testSourceFolders, ModuleInfoParser moduleInfoParser, ObjectFactory objects) { + Set mainSourceFolders, + Set testSourceFolders, + ModuleInfoParser moduleInfoParser, + ObjectFactory objects) { this.mainSourceFolders = mainSourceFolders; this.testSourceFolders = testSourceFolders; this.moduleInfoParser = moduleInfoParser; @@ -57,8 +41,8 @@ public void testRequires(List testRequires) { @Override public Iterable asArguments() { String moduleName = moduleInfoParser.moduleName(mainSourceFolders); - String testSources = testSourceFolders.stream().map(File::getPath) - .collect(Collectors.joining(File.pathSeparator)); + String testSources = + testSourceFolders.stream().map(File::getPath).collect(Collectors.joining(File.pathSeparator)); List args = new ArrayList<>(); diff --git a/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestRuntimeArgumentProvider.java b/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestRuntimeArgumentProvider.java index f7e7872..760db6a 100644 --- a/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestRuntimeArgumentProvider.java +++ b/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestRuntimeArgumentProvider.java @@ -1,21 +1,11 @@ -/* - * Copyright the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.javamodule.testing.internal.provider; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; import org.gradle.api.file.Directory; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.ListProperty; @@ -23,12 +13,6 @@ import org.gradle.process.CommandLineArgumentProvider; import org.gradlex.javamodule.testing.internal.ModuleInfoParser; -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; - public class WhiteboxTestRuntimeArgumentProvider implements CommandLineArgumentProvider { private final Set mainSourceFolders; private final Provider testClassesFolders; @@ -40,9 +24,13 @@ public class WhiteboxTestRuntimeArgumentProvider implements CommandLineArgumentP private final ListProperty allTestOpensTo; private final ListProperty allTestExportsTo; - public WhiteboxTestRuntimeArgumentProvider(Set mainSourceFolders, - Provider testClassesFolders, File resourcesUnderTest, File testResources, - ModuleInfoParser moduleInfoParser, ObjectFactory objects) { + public WhiteboxTestRuntimeArgumentProvider( + Set mainSourceFolders, + Provider testClassesFolders, + File resourcesUnderTest, + File testResources, + ModuleInfoParser moduleInfoParser, + ObjectFactory objects) { this.mainSourceFolders = mainSourceFolders; this.testClassesFolders = testClassesFolders; @@ -86,7 +74,8 @@ public Iterable asArguments() { testClassesFolders.get().getAsFileTree().visit(file -> { String path = file.getPath(); if (path.endsWith(".class") && path.contains("/")) { - allTestClassPackages.add(path.substring(0, path.lastIndexOf("/")).replace('/', '.')); + allTestClassPackages.add( + path.substring(0, path.lastIndexOf("/")).replace('/', '.')); } }); diff --git a/src/test/java/org/gradlex/javamodule/testing/test/samples/PluginBuildLocationSampleModifier.java b/src/test/java/org/gradlex/javamodule/testing/test/samples/PluginBuildLocationSampleModifier.java index e9cd6ac..8ad70d1 100644 --- a/src/test/java/org/gradlex/javamodule/testing/test/samples/PluginBuildLocationSampleModifier.java +++ b/src/test/java/org/gradlex/javamodule/testing/test/samples/PluginBuildLocationSampleModifier.java @@ -1,38 +1,29 @@ -/* - * Copyright the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.javamodule.testing.test.samples; -import org.gradle.exemplar.model.Command; -import org.gradle.exemplar.model.Sample; -import org.gradle.exemplar.test.runner.SampleModifier; - import java.io.File; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.gradle.exemplar.model.Command; +import org.gradle.exemplar.model.Sample; +import org.gradle.exemplar.test.runner.SampleModifier; public class PluginBuildLocationSampleModifier implements SampleModifier { @Override public Sample modify(Sample sampleIn) { Command cmd = sampleIn.getCommands().remove(0); File pluginProjectDir = new File("."); - sampleIn.getCommands().add( - new Command(new File(pluginProjectDir, "gradlew").getAbsolutePath(), + sampleIn.getCommands() + .add(new Command( + new File(pluginProjectDir, "gradlew").getAbsolutePath(), cmd.getExecutionSubdirectory(), - Stream.concat(cmd.getArgs().stream(), Stream.of("build", "--warning-mode=all","-PpluginLocation=" + pluginProjectDir.getAbsolutePath())).collect(Collectors.toList()), + Stream.concat( + cmd.getArgs().stream(), + Stream.of( + "build", + "--warning-mode=all", + "-PpluginLocation=" + pluginProjectDir.getAbsolutePath())) + .collect(Collectors.toList()), cmd.getFlags(), cmd.getExpectedOutput(), cmd.isExpectFailure(), diff --git a/src/test/java/org/gradlex/javamodule/testing/test/samples/SamplesTest.java b/src/test/java/org/gradlex/javamodule/testing/test/samples/SamplesTest.java index 2371fd4..eea00f0 100644 --- a/src/test/java/org/gradlex/javamodule/testing/test/samples/SamplesTest.java +++ b/src/test/java/org/gradlex/javamodule/testing/test/samples/SamplesTest.java @@ -1,19 +1,4 @@ -/* - * Copyright the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.javamodule.testing.test.samples; import org.gradle.exemplar.test.runner.SampleModifiers; @@ -27,6 +12,4 @@ @SamplesRoot("samples") @SampleModifiers(PluginBuildLocationSampleModifier.class) @Category(NoCrossVersion.class) -public class SamplesTest { - -} +public class SamplesTest {} diff --git a/src/test/java/org/gradlex/testing/NoCrossVersion.java b/src/test/java/org/gradlex/testing/NoCrossVersion.java index 6cf2735..4e79ae8 100644 --- a/src/test/java/org/gradlex/testing/NoCrossVersion.java +++ b/src/test/java/org/gradlex/testing/NoCrossVersion.java @@ -1,4 +1,4 @@ +// SPDX-License-Identifier: Apache-2.0 package org.gradlex.testing; -public @interface NoCrossVersion { -} +public @interface NoCrossVersion {} From 61771c6e8915b7edbd640adec14dadd36e2ced82 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Sun, 19 Oct 2025 12:23:15 +0200 Subject: [PATCH 3/5] Add dependency verification data --- gradle/verification-keyring.keys | 1687 ++++++++++++++++++++++++++++++ gradle/verification-metadata.xml | 151 +++ 2 files changed, 1838 insertions(+) create mode 100644 gradle/verification-keyring.keys create mode 100644 gradle/verification-metadata.xml diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys new file mode 100644 index 0000000..b34f0f4 --- /dev/null +++ b/gradle/verification-keyring.keys @@ -0,0 +1,1687 @@ +pub FE6C7D77A1CE15A6 +uid GradleX Code Signing + +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBGL3vDQBEAC06DyZDdCJFMDH2/J7zrbhN5oJmYpM/mkwmOjkHbsIMJRcocz5 +7gYQC8OeMyfs+dkorsrY31UpgMW+efjEZbDKItfbcs+y1iEhQ0fkKKam/lzNyjK0 +wb1ew3QPMz6NFPcE9+ZmHpQDV3oHJSdNB2wrVPxrDgyxQE5Qufz4KBgbggY+Mn63 +yNPxeo7axeK0GgGzoDMw3Iu/pQCVz6eNMn8+0OKowNiE9U8PyYYNdghrmsFEe9sS +ShS8y6GmEYGz4qErI4TpkG5ZkXuIG1ZEgQlP/BuBrY4AIwkUJADGXowr70JMeeZB +1oFWa1aTx3iIHBtr2ksVOqOuQRmnFdGcUZnqEebQov+q9ZwAge5l1jHiZqZfxQ6m +oQnj7vK7rIA0FW+IznZ3De3M+vUnL/D5EIChySvsxjWOqaRCF8gCUA+KrR7Rqifl +lndVJc4gLFj/NhBvh0TwNYUu2wAEWVEuN40KFs4GcVymdPvy9nJwGqrPOZ3jqdqT +fOskvrgZJtj75wbSppED9Z+pdHLUc85lC5OzjzgE1qKiBh+cxLUwUgRSDFE797Vt +ucYWH2coJQRh92I40koTYgPBV4chkNMc3R8/Gy7LJNMIJcjS513tPuVawCMJRDYO +vz5BSWCgfily85jLX8eK2ceYt1m7OUA8LOElxmzysCGbARgP+lpCMfvHeQARAQAB +tCdHcmFkbGVYIENvZGUgU2lnbmluZyA8dGVhbUBncmFkbGV4Lm9yZz4= +=5N7Z +-----END PGP PUBLIC KEY BLOCK----- + +pub 893A028475557671 +uid Gradle Inc. + +sub 5E9AEEBA28836032 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +WzZKkqBVoahM3qqyoKOy7mfpt1hB4gEq +=E5AV +-----END PGP PUBLIC KEY BLOCK----- + +pub 85911F425EC61B51 +uid Marc Philipp + +sub 8B2A34A7D4A9B8B3 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +PXCe8La72ukmaxEGbpJ8mdzS2PJko7mm +=Xe8l +-----END PGP PUBLIC KEY BLOCK----- + +pub E2F38302C8075E3D +uid Gradle Inc. + +sub 1B80C80E07BC7190 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=Rl7p +-----END PGP PUBLIC KEY BLOCK----- + +pub AE5A7FB608A0221C +uid Robert Scholte + +sub 38185785755267BD +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=Kqmv +-----END PGP PUBLIC KEY BLOCK----- + +pub 86FDC7E2A11262CB +uid Gary David Gregory (Code signing key) + +sub 59BA7BFEAD3D7F94 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBE2kzuwBCACYV+G9yxNkSjAKSji0B5ipMGM74JAL1Ogtcu+993pLHHYsdXri +WWXi37x9PLjeHxw63mN26SFyrbMJ4A8erLB03PDjw0DEzAwiu9P2vSvL/RFxGBbk +cM0BTNXNR1rk8DpIzvXtejp8IHtD1qcDLTlJ8D0W3USebShDPo6NmMxTNuH0u99B +WHCMAdSa34wsg0ZpffwQmRxeA+ebrf2ydKupGkeZsKjkLlaXNkTVp1ghn5ts/lvg +KeHv1SJivWKCRmFlbPhBK4+mxSUSOPdoBNAfxA51QzZoPizSk0VbRz3YufYRVLFy +9vqPSorDmYJhCvn3f6+A38FS/j8VE+8obQ2rABEBAAG0O0dhcnkgRGF2aWQgR3Jl +Z29yeSAoQ29kZSBzaWduaW5nIGtleSkgPGdncmVnb3J5QGFwYWNoZS5vcmc+uQEN +BE2kzuwBCACzeGpkd6X/xTfKDBWvXgHOOKIJ2pht9XmtZZKiIj7LIiSwvSds/Zko +ZKxAm7AY+KPh8Xjf968FtoUBQJvHAG4rbowEqT7OOrJae2JcenH5qzaod7TpIPQV +v+Ysz8I1wLlC6LzKRj1X99Hng6X+obsEasnPbmEEkuiZ/Sgi4vVC8SHkDmYt1Dx8 +jDgm53oUeWkEJO9LSI2zcrZhSgvg1xa4Q4gY5UUK7gE4LbmGCjFlATuuW/0sryxu +8zxph15gkn4Nqgk0CPMSjesMYEGOsdDzfQXl2tXbt+Pe6mBoWh67MZ1v5zOq3EDt +oSqDpWPxponAeaCuNDDFX44vGjfxGE0tABEBAAGJAR8EGAECAAkFAk2kzuwCGwwA +CgkQhv3H4qESYsvEMAf/VGyqIEcw4T2D3gZZ3ITkeoBevQdxBT/27xNvoWOZyGSz +GYlRbRQrlo+uZsjfMc9MNvaSmxyy4gLVbcdvQr3PF//GxphJ98W8pk9l+M57jfyH +nnCumn7MO4o9ed+WuigN5oeuNJ6BIq3ff2o1DsrEvDChYOJEOeFuWxv+u7I2ABJJ +ep7NbByM2n9PE8vlGU3zUBgWUBsk6jT+klKnEyHE76WzegPLz3jtElTuyB7jRhjy +QJu1yiJEMbs2zH8aJGObi5f8Jum4tILZuEAdoI0M3c3VRq12cz/vLy+9VXa/s//8 +IsGn88kjyyYqOy8WJEjoOXFh++dpWiM7nZkgQcNi5A== +=ggBv +-----END PGP PUBLIC KEY BLOCK----- + +pub A6ADFC93EF34893E +uid Tom Denley (scarytom) + +sub 9C4C23E6FFE405BD +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBE+xZxIBCACzKctn4ez8xOC0pGThhAwjYWGkzcwK4HNaC1usHThBFz3/t8JN +OqUXRixLyi5wELN6GHlsGVUQS3IfB4JtuhScsieSB8PTree68/knMq6JI08mJqZr +9nFrAB4eDW0UMbSL9kPmclUm/yN+qcCZBrsVn0q6CWb/Kcd8EEXEu6sGILzOGqGe +d433t5O+tGXWL2TjAz+Scsk2Hf4zcuDeQcxELAMnVaVgKuGuEZvibrjsdIvJDGI+ +0BzWIu8ZP8ldBl4SVtzGpEVzLvDUo3mOqBeTkj3rP7xLtFDN/3AFtowbLfL7L2Pg +SMcTnKK+jfFHRfbHP1Ih3rQ4ilLzhCnY/QIZABEBAAG0K1RvbSBEZW5sZXkgKHNj +YXJ5dG9tKSA8dC5kZW5sZXlAY2FudGFiLm5ldD7OwE0ET7FnEgEIAM3i3e1sjwrx +2PN8XYMPQWG+/YTtw1BYDl2+iYE+LaZvtq1hpbgeCLgEVwXrCJ4spLP1rFXogWqK +rkJ0LRjlpdKhKBvyH1ex4grh3cWN/bIDJcJ7JA4I/Bhqhlh8hYycS9pGFeS+MR3a +FIsii+vadrwYYvuVYGeWvdZhB7mJKYevj5Ms0OpYTfZd95Pzo4o//lNpDnrG7Xd3 +tgTNU/fkpw6rFB/2Ib1Qlk+Kz1z6JNsp+tOPGGCBrzwfwglcikTuqS+xyRgC9cHh +5eCol11uSoWPKcQR2Ar8Eo56nxv/UApdu15iJ7R8cA5guKeeS4jt0CGCPs2Phugg +DxI73Xvl4zsAEQEAAcLAXwQYAQIACQUCT7FnEgIbDAAKCRCmrfyT7zSJPuylB/9i +wtIQeexMWBmQNdDe0md8HLulDfcujPtklrvYHtXMJQFaGA0Vafq0oT9MhBfb1YCP +79uF0qgswSxINYCOJx4nTPIP9BOdTwqfGo7ul27REgNq4lIUW0GkMgZAUA2ft/vc +0u/I0PqnhKCi4Pq79hLIx7eiX2ySfXfYfLXRVzbMWKMoi7lWXseQqbM0RvCA54J1 +qAi6Ew+JyoYGQ7OvXdL5Eh5Tkm2cpIADyqCkp/aFDe5lqZiU1zS2fU6mpOf/o0co ++GoYkieIxxibDCmt3BioLgmyzpGUsMNwh4pAIQUGkcxd4spC0KIWdDEvq/QJEEIh +ZlI/ojefaZkRseFrtl3X +=L0GY +-----END PGP PUBLIC KEY BLOCK----- + +pub 54AC8E2D98CFEAC6 +uid gitlab@ysb33r.org + +sub 1309825C79629B3C +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQGNBGB1tD4BDADSzOETLscSpqNTDixnOsYLLwodQQ6pxebc4w4s2QarDHvdaFft +lZge0kTQCxpvGiENusWwt6gQngegy6qWziWSfbdHgVWBsH5u9frgJ8wCZ21UqEwV +A3d/rEbzpc3Ujo1L3yFpuZJWpBo4jTwH3GGxNXS64VwKN/mAKFZirm9DrSpdNjQU +S0mlOThn/SdJ4jqH2podnRZs3yxlr33NvVAYaACndLABCTMkHqKTRPhFYR2C2XAV +sMQ0sQaYJLmMHUTB2Cn8FZRudhuBl+O3TY58w77h+EoUrSw8T4aQRZn9Lbuq1voL +3onEnoR9tU06P576wjrJ44KGi4YJz/L5yKreKBfSe7vfGhBWDmrcjSb3thj+pP30 +Q7LQFmY5EaAz/Wpr0oDMAxtBBbii+QCllEFxu397OMrZZYqQjt9K/l4krYjDZc12 +fQZqCT889kRBA8nqhPpueY5iELmL5oGHTKmWDbKFo6fEPAq6F3e9p50s9pfhT1g2 +GUM9m+0LDs+N+38AEQEAAbQRZ2l0bGFiQHlzYjMzci5vcme5AY0EYHW0PgEMALkB +cL/X7eKvtznC1SE4dJr0skc9rGniiYwVhSNiyiYXlbb0ETdRDbajSHjv53cR5DGb +AyPgwwLNzHo1K3MrE0CvM09sCMJBOjpCu1X5sma1w76I9ScvJ+Gqr3jFu8CO9JbS +s4bj2VRr9ITOEZinvwo+Ult1vj1Vib9K4lAlpsXcd0dgFS7jlTBqeDgRR+xyRdt+ +54yrCay+IXupBF0GuYQ9lHwCVyFhwhOneoQq4xhEmwmNEQOWq28byVLUpMDzKAPt ++T5AmyxNebLRQmE7rWX2PmoCSTby8aQPlG0OSRBQJu3f6lhMZN21QbTcCBeDW5VI +sjPtZnJ7nIpOkT2UXulnlRk/QAEydJdPdSz/Idps3JcHyNK0YXKJ3qvrH1k0ur8Y +fgHuY41d4QqShOZleDcJtDXj7Gh0BtLlijspiscBNt16BpkKzEcqd/6Pt1fMIOEx +iBXrdad9mPpZT14KTXT8dXHtAEKozut37a4hLfJ7al+XBqilnYEm1OjVx/BVKwAR +AQABiQG2BBgBCAAgFiEE6gIlYKgeW9SNs9GLVKyOLZjP6sYFAmB1tD4CGwwACgkQ +VKyOLZjP6sbEogv+LX9Z8BlnClkJ3lVMZlyzbUf2lleg+QA4cWTsPE4SSi1VFHsR +CAoxesJdKqJuFcIEOFxscGfpkSbhTsTEczI9e2XsaaDAaY1GodvJfRUAu2VdvVAG +xHhoEqUUSbD4r3AW0yLViLlsQVoiuKIizm8PQZr9bfLSkXjGQz1wlPfZVC7raPJ1 +VYb3TQXmIALTc8peel2SlqFLQVZ+3Lb8JKC/9DeHAGmpBipB+VcSC5vRchqpncsH +Az0GXtmqzkgcyzq0Kyh0nIshDsGQ/vXoZQRl5hjMWBLaN/y5ik7Qde4bjL7p1ozK +Vm0S2qY0CfrGSzZnLXLOxX90fqXXN9cwmLv++bdyrXElA10u9LIqsViop3UvHitV +jkJlIhwt9/duJEhPJnT/qH2O9YAqwlEFggSNSctD3LC1uMjB8JD6XcpQgDP6BiZU +wP/yCGQGvA27Omf2WgrpGukXiZFSBkCZPL+/rcP5dnVrCwneGCXluI+sONfybagy +2nNTTJWxonBh7c5p +=ksoJ +-----END PGP PUBLIC KEY BLOCK----- + +pub 8B8E0CB0F6A7657E +uid Robert Panzer + +sub 66E5C946D7F2C395 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEYpEQgxYJKwYBBAHaRw8BAQdAAyUqDlsM76TEI9sgzz6DaXhdy7BqSrZ1C/Hi +P8QhqbK0JFJvYmVydCBQYW56ZXIgPHJvYmVydC5wYW56ZXJAbWUuY29tPrg4BGKR +EIMSCisGAQQBl1UBBQEBB0AJY1E2mT4hAuveR1BnaNwwosfF1JiwU7ihSB0aiytl +DAMBCAeIfgQYFgoAJhYhBK0pbKAUMhSF62eA/4uODLD2p2V+BQJikRCDAhsMBQkD +wmcAAAoJEIuODLD2p2V+VMEA/j1HUrIcDQ+FZtFsVQOnCjgIoeOzphExVVZmOjr2 +mAQWAPsFmTyYBbzvAHsj8KBEyO6FlSY0mKQlJxIelqBxUlxyDw== +=oQqF +-----END PGP PUBLIC KEY BLOCK----- + +pub 38EE757D69184620 +uid Lasse Collin + +sub 5923A9D358ADF744 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +mBUN4AU6 +=kKlc +-----END PGP PUBLIC KEY BLOCK----- + +pub 1AAAA7AB37293D3E +uid DiffPlug LLC (release signing key) + +sub 2C7F998F4272C851 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +Eg== +=PrQD +-----END PGP PUBLIC KEY BLOCK----- + +pub A1AE06236CA2BA62 +uid DiffPlug LLC + +sub 030DD9087C31C9AF +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsDNBGPAYVUBDADCs9PkY8zzhzE38bRZX+vTrr3LdChGNBmObV858NGRrXeZtyLu +U7YwYVF7w2vHUI/JQWrlPZc5tBFicefucfUtKt790WzAk3NBjGtX4IWpG57C1Z5t +QRI23HqWr1If0UanH2vUjy4fUgNZdYlH2KzookoU0950dIcqwA/HwiosO5RmQ9iY +HztkwwvFW9QxiJgL+lR84EcaIVN1ukr0ZKrG1a6wOJ6HLf9S2F3DMe7fQ+O+TpT/ +A11RewOZHwE9spH8cEsNYgutBouw/MttuYHjZKD7O4hN12MmzecWeMAPyrvYgTJp +PHcjQaVeD27OGLRpy5n5LonvkzJbhTzM+Ps1qEj/4of3EFVhxNjR0gdrkX+0Ub1A +XXiw3gjqAQuLQVKIbwvCbfj2go+YHrfcXN6kpKkYZU8ERPxI/VBTw230PPdXXwXP +Ux/JRQIEXOuMIuELm/91H8TXKutw6NdNRu5q+LPcUkU7W6jsv28dmQHdC+ebVHlA +vNcBOWVSY5e8IasAEQEAAbQjRGlmZlBsdWcgTExDIDxzc2xjZXJ0QGRpZmZwbHVn +LmNvbT7OwM0EY8BhVQEMAL4ZVuEVH9zbhY6AewA4T3u2XZ7k1KGOxoK74eygzYEp +fKMplWQtCxcxBXe2tboT7I8U3MrV6m7KDwcxLNVZM638fvfU3Px0yGs0jBzyjOcb +Vk6n18xX9UoNyoEqpxHhyPbTBr+U9OINcneXZ/iG9FfLURZjDxhNcQcnrnmvbUB6 +M+teZ6Gpb1Ye8ghVCJJNjRRQhFxXE7XnmX3C1pZoSoGcBx5zVspSuHjq7nTTw/rd +7OpC6sBK0ULk8GPAd2vJUfOtZcsLvOs2++bHxNULTXraTy/fYvXsTSe+PmbJo1Fd +5o3imI0eUy853UJmF/HbuWspFe8yONHjo0+uZITsAMq0jbzG8MTKMmgsXS/i/vaW +8BVUmLfhB7E+bUXJLJuQAan397NbYZqPF5agLZ1wHSki3iuYEttdMsy5PYCLeCqh +8Tv6VBNkEToKDAvNbaad4ZgBdwbBQaAIrWekWpiXSXizyGr/VTFE2hT5NC0d1BXy +sc9P2UCvHit6A1bCl7MSywARAQABwsD8BBgBCAAmFiEER5e09dzEbOphBZBxoa4G +I2yiumIFAmPAYVUCGwwFCQPCZwAACgkQoa4GI2yiumIHXwwAh4/tSXSQ9Btws4ZP +eLfihAb4ogHOsrJ8ZO+lZMyQOrEyzDK/y/1LpFVlHYEP51XS5h4u4XVivXGzsZ+r +tQoXaCS6n19dyyNeusehZx/BxxQrdV9OYEkgb3BC+05AWogdHXTP4prGdMtpSttd +gcxTuHwx9RUv/d6CsQ8DyKyjTv82hd3yuXQVl1829NwDbM7HJ8eq0uZPmez2ewbx +Ze9CxjKoOLfYSQ4k0DfcIFqz8CSqTVIz5aNLLXiY6NXPhS9B9/bXkRNAXzUgMrG4 +GmmP8XLYjBn9g8V+fAad67N0dUWDeAPzz3OXjp6bxyScgjT6OMlp55xXaE5HWW4a +aE9epjKjLuOD7LYdmv0GI1HhSrOnlqznB3TCwJgKMw6/37uGZnpsX0JoMs947ZIm +pcN1kNNR3e4aAFcpBwj2OSjds+G/DI3/WOXJj3aaRI4nBRr2/IB3TVhzLOizLTNQ +Q/IKL5Iy5doINK/iyjb/G/JLH1/TkhW9zEheiKUY6TiXeR3p +=fdmt +-----END PGP PUBLIC KEY BLOCK----- + +pub 379CE192D401AB61 +uid Bintray (by JFrog) + +sub 0CFE993CDBE1D0A2 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +E/XhP4QkRJrZI1F/ +=Jm2n +-----END PGP PUBLIC KEY BLOCK----- + +pub 0729A0AFF8999A87 +uid Kotlin Release + +sub 6005789E24E5AD1E +sub 6A0975F8B1127B83 +sub 3FF44D37464BBB7E +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +BedOSN7DqsnvIUfFaQ== +=bvfg +-----END PGP PUBLIC KEY BLOCK----- + +pub 66B50994442D2D40 +uid Square Clippy + +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsFNBGDoYisBEACqUDZnT4h6ma6XIzdC6KR++uDbR2VKdhCuv0Og/sHEKkm6ZbG0 +OFB8tAaQx/WlsoQyf3DlLfUEOGDai875Aqor3fbM+E1hrZbQNfsOySKEE52k7PYe +0qGWlnAzINuQaEuZwNw+pjZqPraMlwc/hwzJB8yFNHCv25pCFohK7KXvFGr5Fc6y +NHBp6pM3pnDQ1kbkloDr32YZY2LdrfdkRqwa9STNMcZtM724aaInValFpVGEHolF +dklo9MIsMI6mVHlxi6UwFSSLltUfTXGYY+rt2Q2sLNnEKzK1GvVhK996vrNWCvpr +cdtbTzGE3WK4f2knhqzlaX99OLmkM1ah+p2EkK7HgWM9oEO7SYpNxKe/F/QfRNRS +4W0aokPsEtfKCD7vQ3cRWQXdqFwvksilv+b6pcSrwfAsaCzVuhB3lcIra4MevJcH +ZEbPrfGMi5/MIVtLayglLHSPoZtjQBhlqo8w3nuADR/aFlIUZ6NGOwaz5yXIGVEs +6E1wiuILRAd7ecJ3Zyr/URHjawfHfKMM2tNCJKl48cScBMY61FJ1EmYzwhDw+at5 +D4pCk75eM5/t6VdYQ1cDWm7J3LGXEANMU5aSZMqgVnb4SQEmRxkW7oq3Z+GIkQQf +Sj4OK6Oi4cUpM7b0m7Cbcsoqb6nD27VKD3J5KTYEq3e+78h0VRjhoi0Z+QARAQAB +tCdTcXVhcmUgQ2xpcHB5IDxvcGVuc291cmNlQHNxdWFyZXVwLmNvbT4= +=Vcde +-----END PGP PUBLIC KEY BLOCK----- + +pub 72475FD306B9CAB7 +sub 1723844CF9A045EC +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBE7+huMBCADW9rfqKBXOqUSLCK5Klag5WqLFxAOddqEM7wTx/42XaIKjDiAW +gmFnV4XBKm/7Z4fwWq7+ku6NDYUjBpI4vcQ2hYJJ4SRWZHT5wWzOmqgznf+/Qwug +P7Ss3EUTRGX3LnhKhKN656XQhM0PutdsHQlUKjvnl2JOaKerEhbHCRxga/U/WWOT +KdobRO+x8v1scsrnUG83J7sTSaja0McmgUhKrhJqrgSk1Tod45SxprxOyp0cgATY +xjHrf2rkafBn7K7aFDe8a73iCJPWS77gxTZCZ72xkcnMLR0m7QI8TzFa4lRjTovA +QcTpr7jwjmyjA1+68peL6VHdVr0cdXm34mTVABEBAAHOwE0ETv6G4wEIANLmAn1+ +tkX0pSiu6NJ0rkaZlMbvkxeFAstHdQ5zOoSWvJV+52DAd+h8HKZy6I89/BI1alYt +7KWALGzj1I6s1+HavaYKWftk7UvAM6hEh8PzFQD5NNziptDOjTG3oztZ0SK6Et3F +Qaczyzh9GyPC83vC8Dr48a+Bp5Ygpo/5LbuNloptVIapHftW6PUmRuxlXVXgFdc5 +vSDI2xPqz8dzLSjBa1mRUEiAFqdi6L0na6iyBEyEd4QlQ7TnDp6EKgCSvaS3OPRB +EOaWOZsaOIcSw5w7tkO7YlDIjbltVQKTbVLUIR0h9njGaJXlGPYvDFvssIMR766Z +z5bb/uPlG1HtFYUAEQEAAcLAdgQYAQIACQUCTv6G4wIbDAAhCRByR1/TBrnKtxYh +BAFUeeEFU0FDG0VFq3JHX9MGucq3IAgIAIdFSkB0cMKL+mA1dtR9P4dL7/d+G68D +VsSD8+OllWtMSPn5gNMGF4PtTk0Acu66iR1qCtCNzOqo2b72iqO+8lFLXcnteoH/ +0sSj1MFzMk4PfKIzr6u6K7wxdJLROfbLc2so1LN760e8Q4f5sacIgjetNiZNu7wg +k3YNAB27vwrCvgrta5KpamvZ0NDtDaNCIhiXQyudf2ZbhgYYQe98UPo6oAH/4Nam +mxtGcr9jfubcPgJafbKg7H8gNdfQeqt8SqGiaqPvYfs0NL6WazTLqYdBA3mxsUfV +TIjthffHWnAJv0K/EE8kY+ONuK5AkitlW2bb2pXsMpWOdeMYNpVf0oc= +=WUy8 +-----END PGP PUBLIC KEY BLOCK----- + +pub B6D3AB9BCC641282 +sub 700E4F39BC05364B +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +2bX9MtjSsKhYeVDZhwUHbX5VuRtS+X0IIFhu1Q== +=xPkk +-----END PGP PUBLIC KEY BLOCK----- + +pub 72475FD306B9CAB7 +sub 1723844CF9A045EC +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBE7+huMBCADW9rfqKBXOqUSLCK5Klag5WqLFxAOddqEM7wTx/42XaIKjDiAW +gmFnV4XBKm/7Z4fwWq7+ku6NDYUjBpI4vcQ2hYJJ4SRWZHT5wWzOmqgznf+/Qwug +P7Ss3EUTRGX3LnhKhKN656XQhM0PutdsHQlUKjvnl2JOaKerEhbHCRxga/U/WWOT +KdobRO+x8v1scsrnUG83J7sTSaja0McmgUhKrhJqrgSk1Tod45SxprxOyp0cgATY +xjHrf2rkafBn7K7aFDe8a73iCJPWS77gxTZCZ72xkcnMLR0m7QI8TzFa4lRjTovA +QcTpr7jwjmyjA1+68peL6VHdVr0cdXm34mTVABEBAAHOwE0ETv6G4wEIANLmAn1+ +tkX0pSiu6NJ0rkaZlMbvkxeFAstHdQ5zOoSWvJV+52DAd+h8HKZy6I89/BI1alYt +7KWALGzj1I6s1+HavaYKWftk7UvAM6hEh8PzFQD5NNziptDOjTG3oztZ0SK6Et3F +Qaczyzh9GyPC83vC8Dr48a+Bp5Ygpo/5LbuNloptVIapHftW6PUmRuxlXVXgFdc5 +vSDI2xPqz8dzLSjBa1mRUEiAFqdi6L0na6iyBEyEd4QlQ7TnDp6EKgCSvaS3OPRB +EOaWOZsaOIcSw5w7tkO7YlDIjbltVQKTbVLUIR0h9njGaJXlGPYvDFvssIMR766Z +z5bb/uPlG1HtFYUAEQEAAcLAdgQYAQIACQUCTv6G4wIbDAAhCRByR1/TBrnKtxYh +BAFUeeEFU0FDG0VFq3JHX9MGucq3IAgIAIdFSkB0cMKL+mA1dtR9P4dL7/d+G68D +VsSD8+OllWtMSPn5gNMGF4PtTk0Acu66iR1qCtCNzOqo2b72iqO+8lFLXcnteoH/ +0sSj1MFzMk4PfKIzr6u6K7wxdJLROfbLc2so1LN760e8Q4f5sacIgjetNiZNu7wg +k3YNAB27vwrCvgrta5KpamvZ0NDtDaNCIhiXQyudf2ZbhgYYQe98UPo6oAH/4Nam +mxtGcr9jfubcPgJafbKg7H8gNdfQeqt8SqGiaqPvYfs0NL6WazTLqYdBA3mxsUfV +TIjthffHWnAJv0K/EE8kY+ONuK5AkitlW2bb2pXsMpWOdeMYNpVf0oc= +=WUy8 +-----END PGP PUBLIC KEY BLOCK----- + +pub 5B05CCDE140C2876 +uid Matthias Sohn + +sub 9D29AE4A6B50E01F +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=Ll5p +-----END PGP PUBLIC KEY BLOCK----- + +pub 7EB97D110DFADD60 +uid Niall Gallagher (www.npgall.com) + +sub DC0B7E986BD7398F +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBE9/RAsBCADI/pVIFcoLmbq4LCKkqeN4i5xgGKsuQsDAf/ndFkILDUA2FaPN +7cI3EvZacWnWUA0QkkKNKpajU2OjjQlu4IyBosJht3VMtD0BJ2nL8eIDvwO6L8TS +2RRGMnMaDUc91NnoxKs/7VlQ2ySk6Cm6lH3t8KVkwaJdU59lAH1ey9UKhYyvRQuT +htenl2R63lyyDe1ZLMAlmQXi4RcCWOO+L1emChNv0q0Fsir+7go9ZNYUi6pmIEva +jKXM8bo/VtRIHrS73DsH7BVVCURYoBWexZWlRdb86KSE993dRXLvFPy5JzlRM+eu +mUY3CMKxx3nLaDN5qepf1nGzMW88xjq4z4rhABEBAAG0M05pYWxsIEdhbGxhZ2hl +ciAod3d3Lm5wZ2FsbC5jb20pIDxuaWFsbEBucGdhbGwuY29tPs7ATQRPf0QLAQgA +68HLImPvBSPnMtjUHczE+gccsVWzLEsjVYSBcOUi1j67KQHbTPcHAqzYJl19t4FA +N/yU1oOjuu/4GKVni27y8NGSavzY5elTZ22lqUqgqT6DjoOG2BTLHuOiNRIMqBmD +Gy41mEq62C9I107pqJnnbARmde4646kDiaf2vkF1BsnBx0Dp93re2eJq4rkAf803 +fDvA8iyk5uDFiGg3f70JAu7ZCAKczglD0WUjIiO5Jxncz2sWiO2OuVgdsTuZf+9T +0aODKua60Z7CLn4ZK4ZpdibbOEp66XLeaGuy5HPInTTsr4UnT2kvor/AmmPKOryp +9oBFnPvf5+wREwlQN2h/PwARAQABwsGbBBgBAgAPBQJPf0QLAhsuBQkHhh+AAUAJ +EH65fREN+t1gwF0gBBkBAgAGBQJPf0QLAAoJENwLfphr1zmPJtcH/RJ5ba5m0Obq +BGbcJpJwhEjpB6tCOufdzvvJGAMMAuH0Vs5kXrASIJPyVgJ2ab4txg6U3DKIfxnE +IGjfdH9okl/oHRYrI/EDMN0PnIkE1JidhVOEOj3UWaoLUS8vvobKq0XP8B6J+P4q +NA5L3cPlBBtH7yqzVNavi6ljJcsJH3g7L5vJDQyw+xxfOvQq66y4lcO8ptAqB+nw +oHfSsfRKQQgT+Xlp4lG+acf+Kc0bLjWWUnBRgJfkhbGPVYHQ/QfnxbuLvlqohive +HEV+d/PxCwUHq4EtLC9d8V3ADCZgb3v9YE03abItwg7tnQBd/LuJ4qdOEbjAWI4c +crfZTmD74BkWIQSpeJNC9ZitWxF17zV+uX0RDfrdYGx7CACw7LqreqNnAHAONQdz +j4yr1nBp6Fngtq70SPKs49nDWRIJZzutzGVNs9r7bFSu/fzZlzsqi8gyYSizhEnW +BoV9e+t4YrMI6uWwDiSddzCn2fLCNkfYd36nuX78QHZgD32syCVeX/k1+zmTYjVt +Op85vZ45d17mnwCSHV7G+4jImZF/+lF5ED/x1coIT+ob4pmQk6Hwf2AP/ydfyf/l +B+boV/SIUXeZ0Esz1B0Frfr+qjAFhDO7blgUfQ0qLOIXRjavSl3g1CGgCKsZ1qZU +99YrO8eFnxdaGSWvVV77df02pkg5xdDHWusPcEvovBUm0dx9DG5PchEOeOdhdkBQ +5UCV +=MD5j +-----END PGP PUBLIC KEY BLOCK----- + +pub BCF4173966770193 +uid IntelliJ IDEA Sign Key + +sub C9F04E6E2DC4F7F8 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFKneXIBCACtnX3ZQmPujf6ocvdnhsBheze71DSl34TfebyW2Qt+g9NhMxo4 +DaJy+iFNnsaMwLZRr6k/qf+ISE3A4opWAQlbk+Wb5s6DPPA2cHH6W4GdkxtuJzqt +tFn6YtkFhA15Aahr/vz31NBjUJlBmO4PwvkyxiF/MYP6TQ/AHar4xP1RxSYEPcCi +dIQczQ8nXzya4OqOyTfibeGz/eiHHuwTLHi3Rd2kihQnlRQdhE1rmm8uTyzFe1H+ +P7WW7kQgygW6yxQ3J+DXrG8kG+nbe57ZY1oyv3F/fOBxzn/kuoKHZ3JJEMJmTIrT +Lr1ngCZApgteAynRHk4t/SYZiyoyqZCuBcwHABEBAAG0RUludGVsbGlKIElERUEg +U2lnbiBLZXkgPGludGVsbGlqLWlkZWEtc2lnbi1rZXktbm9yZXBseUBqZXRicmFp +bnMuY29tPrkBDQRSp3lyAQgAvc8Q7O0gVSJsHoVgSQ5tWGwNsKcfD3I7kwC8BYHr +Q6F/UnhP1ArreNnn8KKpwOvD65pv0j5G7P9KAbIVLRRcCTB9MgJR2FPmRTNmYbKi +Pa6X6IUM/25R0SBKDJddqSvEFsE/M1ozHz4bIhdFUXJFMfv7WBaA9Cx03WwZg6Bn +5/xMzMC/qzG7QlXOMpcABtd2JlPImH13qHWNLkhyKW7y9HCfdBz9nOy0FGT54ttv +r3BL1gahSXNi8MHP7m2I3C8dSuIpzrNVPgR2eByvSYpZN28P4Cy9l99TRcr6/FuA +y5FaL/nWpv5WAraAV4Cx5Xpr4PXTn27b7k+feH8W/+9EAQARAQABiQElBBgBAgAP +BQJSp3lyAhsMBQkSzAMAAAoJELz0FzlmdwGTSqAIAJ0/yTJRlWp+dwDZGxAffw0V +iEHPkwAQ4iEKburA8LpcbTwJRl+k9d1RvFkZSWITq+F+Putlu9QooeVwcM+ht1Mm +oah/aO3Yx+yMnXwljR7FJa5VOY2aoALeCyIx8QYiqNAVaid+bQ53gC924u5zRM+T +J+vSChtqSBi+EOOTt5C+ALVB8qWTqEcD84AVbvvippCzKsA2sV69FrsIFAShvpXo +3xpXW83GCXxrp8nM9M0E46Y/SarvGTqfKRC6phNUXKp9c3SnVttPEcGhb9+92LOL +vMxKy4GRZS18bXDI3vS6gRDNJDCqBYIhp13Os9k+ZpnwK3PPIHv4l1I0i0EHZKk= +=WJEa +-----END PGP PUBLIC KEY BLOCK----- + +pub 436902AF59EDF60E +uid Sebastian Sampaoli + +sub D94994D14B55169B +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xjMEY4fp+xYJKwYBBAHaRw8BAQdArb04PVwQKvEhtUEmEu7/aASZivOWgEkZBqX0 +Tovwvq+0J1NlYmFzdGlhbiBTYW1wYW9saSA8c3NhbXBhb2xpQGVxdW8uZGV2Ps44 +BGOH6fsSCisGAQQBl1UBBQEBB0CSPWzZfBjKWyPW+D6RDRLFz5xlO9/30yGD/VhA +EPXybAMBCAfCfQQYFgoAJhYhBB0sfvitoPeUtYx8Y0NpAq9Z7fYOBQJjh+n7AhsM +BQkDwmcAAAoJEENpAq9Z7fYOTMMBAKfZb2ahnfGNBt8Hrbu1j99580a2IaFQddAk +xXZy2unHAPYyfxDLPkbTR7Mm4k8Cva8PCcXotDow4bDLm9rhwVkJwn0EGBYKACYW +IQQdLH74raD3lLWMfGNDaQKvWe32DgUCY4fp+wIbDAUJA8JnAAAKCRBDaQKvWe32 +DkzDAQCn2W9moZ3xjQbfB627tY/fefNGtiGhUHXQJMV2ctrpxwD2Mn8Qyz5G00ez +JuJPAr2vDwnF6LQ6MOGwy5va4cFZCQ== +=VAP1 +-----END PGP PUBLIC KEY BLOCK----- + +pub 2C7B12F2A511E325 +sub 10DA72CD7FBFA159 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBE+ZO+EBCAC3fZOOuYKthr0GcUge0PH2bh18sbM9XUmPKQz/W15l1NA/2ARS +2gUXM0R+SunMlun9KsqjnojJ2ObVPvbm1Hg/66JSRgR3JWfIpSlJxLicpfu8rCfN +bOjh4v9ZipD+px8w3o/RNrnZH/KRsoJg9yER6pf+pUZqTJfdg5lXezc1WF+/1qVo +ypldMGfrkfLsPrUZTT689ubbig978e7eYmJEqldtaIwaAzHQnB70wIJyg/rEwFUM +ldsvs6t6czSuJ4zPMvmh8TMpTg9e6+DMktPl1CWRONl8RPpgYMIC96gb4OnfDDjk +Ex6clSCwgbDwdeAyOjjR6pVq+pCNTo1Pcj5jABEBAAHOwE0ET5k74QEIALaxogmJ +1t7arw82krV7ILlcOu6aLuuXTuy03K1/jU73oyWfUqwvPSbH4igcLb8kt1/6ogfk +u0T9tTx+0mDsvqK8A8NZ2nDTXok3T58UAg0FTXlqUqZmy5QPtG+it2j3/xGgip3V +5p0Ml1TqEl2SfW6gHtLptDUWzuzPi9SgK1ZFlueprPg7xwHmWhp0gwx0KSSOYWlK +oEllj/1aDxFNcdKogWcGN5aJEsETCEguBP7olL75u6732wc3zola4zTy5bFT4kEY +Dk30Du3VGQJrdsqlibdQpZYm8uH4AVXDmFMdEAjIs/DGRrUgde/oUqwtgm9U+p9M +qcbmMoeLFdi7ajEAEQEAAcLAdgQYAQIACQUCT5k74QIbDAAhCRAsexLypRHjJRYh +BEdfO45Z5uY6p4BnSCx7EvKlEeMlX0UIAKS+4ZAKrGG9jbWfzTTDbu9zzkXgV13s +uMD+XcGz10DkdluTUBXj8wWlp289fXNm4E49ipsNK+dcZ+gOATjUvb1Llh6D6bHz +1QM7olxBCeU2feTmYYKBH8GYY9JZzfAXNMQhcNiiPj+ntZqePy/EFA4uZHM7We7v +l2c7CBcDAq1NNeEczo0KvG7AWt6QoaMVmbvA14EKadNzrmEy9apkag1BKvwzXInY +CvIHMa9ZqicOSUcI5QCYu5TufvIE7Eq3Khh2Ex1FiOaEA+57LMrt6NsSKXrB8JNY +bI5pqE1rxJXZnYtx3ZpPAAEfLjPdi1AOkWhvhsoPmiGFC6ebYQ5eVbI= +=gaSa +-----END PGP PUBLIC KEY BLOCK----- + +pub 0555B3BA1CA4ECF9 +uid Andrea Peruffo + +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBFeI2igBCADSyC1+7+GrBt5easeGer72OC8yrqjO/Wv6o7AYWbs3f6SRmzEi +myc1sh8gBt1NbpkhIDuxdlqSOiYU4uHn246FuEEOPFyp3SHnTkEcI3J/5JzRLpKB +p6qdA2uXSPFtyMZWiMJS84eEeuzgs2J22ankAIRhC4HsV2TWkKEE5r0TnKBAP1pW +p16sXlDaUNf5JXIVOjILwFx22hVc/ZEx/3i/MmY02ZbZTDYDHvDC/v8zyv8aXIft +aKJEuV3H+jHZXbum2KMVVKokptVAr1boq6vTth0MfHDMibBHkm0bYNTSV5dUEoQO +ZlDSAKhjJlZHRzqy3Yp6hZyOA0ELYSI31HJNABEBAAG0LUFuZHJlYSBQZXJ1ZmZv +IDxhbmRyZWEucGVydWZmbzE5ODJAZ21haWwuY29tPg== +=b3AU +-----END PGP PUBLIC KEY BLOCK----- + +pub 1DA784CCB5C46DD5 +uid Rafael Winterhalter + +sub 7999BEFBA1039E8B +sub A7E989B0634097AC +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +pIXjPlQ0i6kV0h8KapE1Uo005JYgeg== +=/SKc +-----END PGP PUBLIC KEY BLOCK----- + +pub 0CC0B712FEE75827 +uid AssertJ + +sub A9E4161147556D82 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +sMY= +=vnKw +-----END PGP PUBLIC KEY BLOCK----- + +pub 3D12CA2AC19F3181 +uid Tatu Saloranta (cowtowncoder) + +sub 575D6C921D84AC76 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +96Um/Inf +=Evfn +-----END PGP PUBLIC KEY BLOCK----- + +pub 199C76080F8A18BE +uid Open Source + +sub E3461D2D16725F94 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=rjU5 +-----END PGP PUBLIC KEY BLOCK----- + +pub F6D4A1D411E9D1AE +uid Christopher Povirk + +sub B5CB27F94F97173B +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBE89LqsBCAC/C7QToaRF8eZgGOxcvp9aG+mFFCMjaRAb4Mh59OYdmUb6ZjfO +9388HPebGbPNR8SHYs0dBIuWY4ZJ7oUTYPswasL8vB0iPFdyHhvkCca+yk0b8ZBM +DmFlISm9HkYpoVjcFUp1oivyeJ5LRTJTd5JGEd/SWFRbB4TimdKXBzej9fIm2zVl +KInEMMd8HnSYE6nm3aNkbyiqhx81bFvl8x6X3ZMWcKs+TAVXdP9uLVvWowUwcApk +xpee442Ld1QfzMqdDnA6bGrp8LN8PZF9AXQ9Z6LTQL3p9PIq/6LPueQjpJWM+2j8 +BfhbW/F2kyHRwVNkjaa68A544shgxJcrxWzJABEBAAG0J0NocmlzdG9waGVyIFBv +dmlyayA8Y3Bvdmlya0Bnb29nbGUuY29tPrkBDQRPPS6rAQgAuYRnTE225fVwuw1T +POrQdXPAOLDkiq49bLfcxwRJe+RozKrJC1iKxb751jTozEEJLe5Xj7WcojqgDsuT +jzaLHDNvDCzRFvwfkJ4scMTAZd+2GYsC8N3Gg0JRgC2lU4wZxsanLnVMbdX2L0lZ +7WnH6S+GJ5f0Et8PM/g+V2Gj2UraBhGGak8OBQ6NhmCJBcyYg8Bh90cgD9V1hMRM +LSW7gB1vnpLM7C8Yymd3etdZSIltmDuVb3uG9s4Uwq51s2MEKsXsuFYCHTz0xT2u ++6e7Puaq5V0218QGR1Wupkl29iIUF57hFR7f6oYKkecvPKc4Yev6Ii0Mbvc1H19k +LOXUrwARAQABiQEfBBgBAgAJBQJPPS6rAhsMAAoJEPbUodQR6dGunSQH/A+4/Zbr +2jB46q1JEN/UV4U3MBQiNvCOSD9tOPMnBvVzJ53HutvGGkmafbtbwDZaN+YMs6fi +itBMqjF/eQ/pJ54aFguTPGMFrlFyjz2n/pffkHLpVHgs8V5M4ALITttwCOo8Vv7u +3VjO+ea5kiCm9MqJySrUP2Dv4lPVB32eoEUqWDxoyeACihW+Utdo8TBDVd+R8w36 +W3CUSvujW2z9jMNTF+VoVWDQWc3up7Nqb+ztW9wrjqs73nJCv9bLPahUPNzfh742 +v9vak3TkwMcDR1eZv+KvA8GXSZM6ACALzTmqRHXjGF3UZ4vowQDfiTzZKr87eBaE +FoHco7Lnn+W+8qk= +=9+x+ +-----END PGP PUBLIC KEY BLOCK----- + +pub DDF3944950267CD1 +uid Jean-Baptiste Giraudeau + +sub 76947357924D7C43 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=Q1Om +-----END PGP PUBLIC KEY BLOCK----- + +pub 78178478013521D0 +uid Ktfmt Team + +sub FA84183FDD6A6B98 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBF6RvwcBCADIVU7oxOiljoWxNTkZ00PKVwyqhahYpN/4lamULtECCS+HAF+J +DsNy/6QCl7lKAGrSyn9dvsI56KEkGvUJfpQrpRlg+uIQDMxS8JF7p9n49DNc8Q88 +XuCaiv7pv9hhCN3Mn5qcuzTR2gGP7ToZ4fQW9W/PSJBSOeO6JK6xXNyiKcyEoXp/ +jGSRqqbDkAT4OYEUy9RfG9BeJEGUbDK4RIaH5Bo0bdahq3mfdlKYXMwRWGV9D3KN +4iLE/26h3y6tQZS5zHQGjIIJedaKGWEiMsF+b7Jjf5OEC//FoH1IS7nDz2GK9BjW +iELtSnmyDIDiFAvMY0pGsn8AQFn4JxEP3TMTABEBAAG0GUt0Zm10IFRlYW0gPGt0 +Zm10QGZiLmNvbT7OwE0EXpG/BwEIAPuROTIEOMOtp07cZ0bYwuPEsX40TJNFPOxg +ak9Mx9RSfzhSNnQ0HaxaGc7O+HelsE6xeWtivbuHWjveWUvoxvkjaoYQ9WVtDN/s +Bh2kwxS26BkvlxbbA25ZDgjk+M0xCqwkB0WX2O5PoV17+KJUhrxU9ySKe4ROCTnT +zLIgfTvlaL1nzsJd/NWDN5RhzBKe9Uv9pcxZAmZySDXmn6z62B55TXyeyvzQZWaH +acHb4DYdCE7tPkfVY+7kV+LvaLOsWsBf5v+Eo4yQb1EFc4Yd/jgMTq8GUAnN8isS +HeQ14Sb1r3mHSPA+/8Q/SGZ5s+NJc13/RS2Q8OhiOE007JO2nDEAEQEAAcLAfAQY +AQgAJhYhBGSBkJluwJMKbX1JqXgXhHgBNSHQBQJekb8HAhsMBQkDwmcAAAoJEHgX +hHgBNSHQXSsH/jmg51oPLs8Qu0USx4aHVgmD0F3//9xssxx3/SW5l6iR8UPKoxUy +2uUOAZ8xSrDa8arNxfrSf1h5WRrJ0GqiKMJm8eeVDuLaFnGYX1LuMgC2qCrfNlQ0 +9DdFEHYHnxyEoyjBPWgqcZpa/bYMTiOjbHz+HEQs7gUBGEEuWh2zezp5MX6a50zB +D7whEN9qwzVz1fxdAwb5Xl+iXqQZ+mYvQo+TBqbM/KNcDb3a6hv904Fcdzy0Seb3 +aXWb3uzaQDSJEEJxxEgWjUG9uEuS+eMD4TJqrsfg6TqN6ykXvdbXTHO2cD0DFFZN +zO5quWpqxTLMSgNswFB4mjvd0mS3bUK4DhM= +=3R74 +-----END PGP PUBLIC KEY BLOCK----- + +pub D364ABAA39A47320 +uid Liam Miller-Cushon (Error Prone releases) + +sub 3F606403DCA455C8 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +xquhnpl2HvE= +=A/Aj +-----END PGP PUBLIC KEY BLOCK----- + +pub E3822B59020A349D +uid Kotlin Libraries Release + +sub 60EB70DDAAC2EC21 +sub 3D5839A2262CBBFB +sub 9351716690874F25 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=9e+M +-----END PGP PUBLIC KEY BLOCK----- + +pub 4DB7BC57DFDBCEA4 +uid Timothy Wall + +sub 25EB2A6CB1459233 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBFBm+zUBCACsrBpO6mOsZ/B6PdPPV/Hj87m2GHeEYEHt2o2l8X2BdbZKbVW1 +FIKnpYe3+TsFCe/qNxlR6vk0Jpy3ChD3nW/J0rmU0ju1SZnS7rdSMj3AI5M5xxpy +Vn03vCbYyFWw4Bj9avYmiz8kC7yImfGfTLv5XPmlHhUQaxW8+s+393n1mHZsIZTt ++luPftSLCkcmKGHn+PUkFaHHD+q+TTaG98nDkkaCXS0JwXzujYDJDQgV+6HB6PO3 +gJJW4QcUHWa5uUY4CfqGcYGBvzlfII2psyKFIHqrx1uHxbhjLlIwif6I+Q9OFcdq +qq4JgVnWti2dEBgOVunb5S0KnN40VcH0v3VVABEBAAG0IVRpbW90aHkgV2FsbCA8 +dHdhbGxAdXNlcnMuc2YubmV0Ps7ATQRQZvs1AQgAumH3wbBy7RYBaRjaWjN90OKc +pXuJ0MTIzkgC/JtNexIVtzFdrfmHPOEZESYyLVk0E5YU5i3ux+K9ARi+bWrst3s1 +iiPfebeNCRU0lmxI7fih/r+PxcTTdJnHAoZUNBK1ZzjlTgXacradjS1LGFX5+52g +TgFVNlYXvI3qPKQFb+Vfz3x4LwOI10ipnqZK61D/FC96JD0osEFJkmFvI5n00Vww +XXRoeefN44Guvs58nf6MNi9ZA11iQlK2a8CswAuHJTndkQejVq5D1+ejVVmt27mH +5RhG1xoNZ6FSkha+Y3ImTpxQMJzdbkOtMzj1S2VIt8ZcrV/6dt+yCAskTFW/ewAR +AQABwsBfBBgBAgAJBQJQZvs1AhsMAAoJEE23vFff286kd/gH/2Wz5zWkcvk8ReH1 +Ke9vYH2gee0qtXIrCjtV1WBOTy0NLm0S4Bx/uFjbFUbqNK0nKjTix4mAe9KrVJwN +47mXVGxG5N79KkiS8lj+YM8WOUIe5tkDovzEfqFukzgpHBY3CXjiojugxVv6cEe1 +GLnEEOYJlezZj02HS0D1eEeIdu7aV6f6xPFAo2q94aavz8cC01IXrnccUfuDtBJE +VqdZmVoc/5tUZf/dU2m5ga62U7yaVbiimP2NXIL2tzGLgyUaT73E3e+EXzfcpJaO +rBqbcs+2HPfAjBm/km/0EC3ET0r2Vqoq40hP3fQqLSC/LYK6Vbuc/l5M0I1QxhJ1 +njCEin0= +=U1nj +-----END PGP PUBLIC KEY BLOCK----- + +pub BEDE11EAF1164480 +sub 4BE257B370130000 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsDNBFv1EEwBDAC61jyEM99KH18hI3zlfuqvGoNjTLIh0wge5vXAH8VxMR0ndOID +HYSBT2+L6OeiqKlyhCgF1km48F/dMzyJdTASkNO1Ni+B2Ric1sBxjsSPufkjl4en +yMOl/FuQOB2myht1fCXhlynmOoiRia5J6xzCsCNVGOVYfSru8vpoT9QKcD1OlwoD +WhfyBx/bXsoRvD1CMjQdalcGxv1aJRWfhRumXQwhMPZlFeARAzeDmWNpglqrMnuG +/VADZXZsbLv8VWaequ4wEWiwTOeA6YYElx648OTSv7NjMM7iyPPPWbbUvkVbA3Em +lLBLlGYZTx2nI0B/322SsREcEDwaBzO53GStIzP1XvaRosM/98/Y9ITwB+Oh7ZwZ +dYmmabxN6F5O3v+TNndEW7wgP0lkbsOWZ6YNmFhvoEtd1RxZiSNov5CxokYUrug1 +cS+/vsa9oIecUwxYOG2D1v/pwYhQnr3qasYz4nEEBWHnnkhyr1BbUSuen7w2SiK+ +64cQn6V9aeZYi6cAEQEAAc7AzQRb9RBMAQwA7UCAsQ8KxX8nYO4Sy2pzlh9W5FMP +wGluuokPA2A6g2Fz3vF62RqeaE4HrRQMpijQCsN3JTJVwDid41X84XCMItkdAxMj +mn5zeF/yCcRuHe2Ci/+ae5BzrBaKE/VWRAkaZSZWJ1MoDdpSxJhLHNFnVrwTkM/S +eSNUBk9ZDEC+43b0hciefX9bFlc6XPHgV+yr5ohhwcNcrZ/gbAhhN3/xIVmvKoib +mb+ZIajhiCP1OOH+GpZAPT93w9qZWq3+2gvP4ZZ7bO+8N8Gmz24GL3/0eYI6aMUM +wWGjy5J+iRiFjb6E+Iv/zToyZFWm2VOuOUqy5t4u+Vyk5bl0hATpJICmKa5OFtQw +G5Uvfztk6rujjat90xv8yzsBvoEUqKqzIzjHdN36qop5hLMnBljdLdFY+Rk9CHdF +7MW8Nf0YWbP/3uUk19utGW686Lolt8gvBQc4B5N7VtNoXFCKM/I3ufgnHQvDlf8p +gdJOcyx/a90V/DpUI1ANlwg6IsmFZXbBQw7tABEBAAHCwPwEGAEKACYWIQTjqflQ +eehM4gH3z2C+3hHq8RZEgAUCW/UQTAIbDAUJA8JnAAAKCRC+3hHq8RZEgEy+C/4l +sgrKCmq2Nc7eTdN1AxwMkj28XQFmkqO8orfJm1hAtVK1KRizkX52RNeRN6QX3pX9 +s1e3DjJi3Hpa1UWqeicPA0kKTi2ytUlxR/iZDkaQkLyCCZtWnGHr/eRBdOjblprl +5O+v/tcyrmQGC04TqOntMumuk7JNjZ0QAVkZUxdmfi9bHaF5W5vlcaFYT5gdWpkO +Q0YaWXXw5ynh6Ookjhq0g4pZNjl2rdWWyTC59YIvC9THx0+vuyN7xnSWIb8J1IjE +EYvPqRfpd8s1Vf2AA0JRPjUG2UV8MZqu8k8x4iC2gbdji/vyg/ycdlRT/ULyNprz +1nTLMfhBT0Wmy8B5lFVme3URmld8T90RPln6Dy+c+IKb/79z3FPujuSbipXzx3Qv +GwVYyP80JFn7CJluOl/u8vxi2EVFN6aVqdzwoswFE3+0W0AfbpHUUT4oeBW5OBTJ +5i1Qb0DT6WXk3Y2j1Z08xxhY1RITnc2C33wjXAW0h+qq7/7Yq3w3/7ncv9sWIzU= +=+T4J +-----END PGP PUBLIC KEY BLOCK----- + +pub 6A65176A0FB1CD0B +uid Paul King + +sub EA8543C570FAF804 +sub CA890A5FA09CFD80 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=g/bF +-----END PGP PUBLIC KEY BLOCK----- + +pub 72FEFD1572EB75E1 +uid Spockframework Robot + +sub E95B8FF73F6B84E3 +-----BEGIN PGP PUBLIC KEY BLOCK----- + +xsBNBFt1xhcBCADDofPZYtlG1I5NRG67j5Fn8KArIzKK9L3bH3MfJC+XYYPY2N11 +ckiF3JQ0kXH3BPL6r0+dOQm/9SGJYsRVRYYoz2HEf/bzLSxFvKeEdEsWh66IcEzp +xlxV7rXc3oeGCZ+EvobG7JVoRyyLegx/VareBwtBhW39lLGfBjGBzFuXEMVG4H4U +v304N7D4sEIBYWT8c2z5Q5/Iviiyu/VgHxczDn0H6Sl1kXP1vVhWff+OBlbO7JAF +TcW4ET3K/ASWL/CirLbyyVkO8DO5pQyuJqci7pJFWWp/56CpJBmxuyQRc4SEpPjC +ZUOs335j1+MxAJh6z1L/xZHF9OV0GgT8cs67ABEBAAG0M1Nwb2NrZnJhbWV3b3Jr +IFJvYm90IDxkZXZAZm9ydW0uc3BvY2tmcmFtZXdvcmsub3JnPs7ATQRbdcYXAQgA +xh+deGqkK22ydYsUjGkRe8BGN9QQfdY3KfuTIugU9nQBTtXetx2wGD2T0Oz0vLnG +FEVVR3wDOWvLBJ4BD9tJX76JeHf3Eurj3g8ctBMbla7GDwfDbW0p7vT2I7Mlryvo +I7XSyP0l8KfnNaKWo5tzFw2MpyYY7BN+giWbyCJV+10w2B7XMSwlDddNm0w1I0ec +rcCn8ju0gFPH+nYB2AUo4vvejC2pAgFemWZGv0AesSLCri+zHCHfdLf0ex8TcoKZ +VYkQin0JuK00aaidv7lwW1rGEQSGeamZekBu5Bw2yMGA6JZchR5ynuJOQ8ygX98L +MmAHMdXHfghX9cHOLhm5mQARAQABwsB8BBgBCAAmFiEEdulOj/CrWvO2+DZpcv79 +FXLrdeEFAlt1xhcCGwwFCQPCZwAACgkQcv79FXLrdeGvyggAvNhz/LfzuQKaEkSc +xaJ5Ww5xhDilQuPbJNhT2lhFCbEd0EjALxmRvE+WMVm+Cs+yd1Gce5VlS7/BNJWM +7JTRr1QDueirU+nmwj7DPEpJgx3cI9rPFytA8SmeokWJUOZrU0BddNARLNImcKei +B/SeaDiy+BVs1qY5+ZqwGKvPAJuEUOgvTUbYd6EWCYnxGttZtrAa/Dx2kShNOgNz +kLBXkjgSJxFIbaRjrOFvsH/wcSG3Teyv5g/kOXb6stVtoUi9RoyQCEe9JbxeH4pA +j4u9f5+Fcg4SfYIub6ONQy61an6LPty07DADRtYREyn+rmgzopI9KSB2iSZiwhrt +1RHXCQ== +=mM4w +-----END PGP PUBLIC KEY BLOCK----- diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml new file mode 100644 index 0000000..360ff7d --- /dev/null +++ b/gradle/verification-metadata.xml @@ -0,0 +1,151 @@ + + + + false + true + armored + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 56dad54527e228727d52817dbf58abb08b22abdf Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Sun, 19 Oct 2025 12:34:07 +0200 Subject: [PATCH 4/5] Fix included build location --- settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 5b0e3c5..f5c84f4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,4 @@ -pluginManagement { includeBuild("../plugin-publish-conventions") } +pluginManagement { includeBuild("build/plugin-publish-conventions") } plugins { id("org.gradlex.internal.gradlex-build-conventions") version "0.7" } From f7616bada632ddaa43ab5943fada86b3cf097c22 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Sun, 19 Oct 2025 12:51:49 +0200 Subject: [PATCH 5/5] Add gradle-daemon-jvm.properties --- gradle/gradle-daemon-jvm.properties | 1 + 1 file changed, 1 insertion(+) create mode 100644 gradle/gradle-daemon-jvm.properties diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties new file mode 100644 index 0000000..20fe571 --- /dev/null +++ b/gradle/gradle-daemon-jvm.properties @@ -0,0 +1 @@ +toolchainVersion=17 \ No newline at end of file