From 0c91b859a147ce0f1397b05cc9d96885ba10f4ea Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sun, 20 Sep 2026 14:33:51 +0200 Subject: [PATCH 01/13] Code cleanup --- .../gradle/OpenFastTracePlugin.java | 16 ++++++++-------- .../gradle/config/TracingConfig.java | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java b/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java index f3656aa..e135a9d 100644 --- a/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java +++ b/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java @@ -80,10 +80,10 @@ private static void createTracingTask(final Project rootProject, final TaskProvider collectTask) { rootProject.getTasks().register("traceRequirements", TraceTask.class, - task -> configureTask(rootProject, collectTask, task)); + task -> configureTracingTask(rootProject, collectTask, task)); } - private static void configureTask(final Project rootProject, + private static void configureTracingTask(final Project rootProject, final TaskProvider collectTask, final TraceTask task) { task.setGroup(TASK_GROUP_NAME); @@ -156,12 +156,12 @@ private static ConfigurableFileCollection getImportedRequirements(final Project private static Configuration getImportedRequirements(final Project project) { final String CONFIG_NAME = "oftRequirementConfig"; - final Configuration configuration = project.getConfigurations().create(CONFIG_NAME); - getConfig(project).getImportedRequirements().get().forEach(dependency -> { - LOG.info("Adding dependency {} with configuration {} to project {}", dependency, - CONFIG_NAME, project); - project.getDependencies().add(CONFIG_NAME, dependency); - }); + final Configuration configuration = project.getConfigurations().create(CONFIG_NAME); + getConfig(project).getImportedRequirements().get().forEach(dependency -> { + LOG.info("Adding dependency {} with configuration {} to project {}", dependency, + CONFIG_NAME, project); + project.getDependencies().add(CONFIG_NAME, dependency); + }); return configuration; } diff --git a/src/main/java/org/itsallcode/openfasttrace/gradle/config/TracingConfig.java b/src/main/java/org/itsallcode/openfasttrace/gradle/config/TracingConfig.java index 859ef34..d5347de 100644 --- a/src/main/java/org/itsallcode/openfasttrace/gradle/config/TracingConfig.java +++ b/src/main/java/org/itsallcode/openfasttrace/gradle/config/TracingConfig.java @@ -111,7 +111,8 @@ public RegularFileProperty getReportFile() } /** - * Returns the external requirement dependencies. + * Returns the external requirement dependencies. This is a list of dependency coordinates pointing to ZIP files + * containing requirements, e.g. {@code com.example:swad:1.0.0@zip}. * * @return the imported requirements */ From b5e0c50af25ef543342b3dd0a613b2f1feb6d023 Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sun, 20 Sep 2026 14:45:15 +0200 Subject: [PATCH 02/13] Fix parallel import --- .../gradle/OpenFastTracePlugin.java | 37 ++++++++++++------- .../gradle/PluginTestFixture.java | 3 +- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java b/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java index e135a9d..02e6271 100644 --- a/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java +++ b/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java @@ -12,6 +12,7 @@ import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.logging.Logging; import org.gradle.api.plugins.ExtensionAware; +import org.gradle.api.provider.Provider; import org.gradle.api.tasks.TaskProvider; import org.itsallcode.openfasttrace.api.core.ItemStatus; import org.itsallcode.openfasttrace.gradle.config.TagPathConfiguration; @@ -139,30 +140,38 @@ private static ItemStatus convertStatus(final String value) private static Set getAllInputDirectories(final Set allProjects) { - return allProjects.stream() // - .map(project -> getConfig(project).getInputDirectories().getFiles()) // - .flatMap(Set::stream) // + return allProjects.stream() + .map(project -> getConfig(project).getInputDirectories().getFiles()) + .flatMap(Set::stream) .collect(toSet()); } private static ConfigurableFileCollection getImportedRequirements(final Project rootProject, final Set allProjects) { - return rootProject.files(allProjects.stream() // - .map(OpenFastTracePlugin::getImportedRequirements) // - .toList()); + final ConfigurableFileCollection importedRequirements = rootProject.files(); + allProjects.stream() + .map(OpenFastTracePlugin::getImportedRequirements) + .flatMap(Optional::stream) + .forEach(importedRequirements::from); + return importedRequirements; } - private static Configuration getImportedRequirements(final Project project) + private static Optional> getImportedRequirements(final Project project) { final String CONFIG_NAME = "oftRequirementConfig"; - final Configuration configuration = project.getConfigurations().create(CONFIG_NAME); - getConfig(project).getImportedRequirements().get().forEach(dependency -> { - LOG.info("Adding dependency {} with configuration {} to project {}", dependency, - CONFIG_NAME, project); - project.getDependencies().add(CONFIG_NAME, dependency); - }); - return configuration; + final List dependencies = getConfig(project).getImportedRequirements().get(); + if (dependencies.isEmpty()) + { + return Optional.empty(); + } + project.getConfigurations().create(CONFIG_NAME); + dependencies.forEach(dependency -> { + LOG.info("Adding dependency {} with configuration {} to project {}", dependency, + CONFIG_NAME, project); + project.getDependencies().add(CONFIG_NAME, dependency); + }); + return Optional.of(project.getConfigurations().named(CONFIG_NAME)); } private static List getPathConfig(final Set allProjects) diff --git a/src/test/java/org/itsallcode/openfasttrace/gradle/PluginTestFixture.java b/src/test/java/org/itsallcode/openfasttrace/gradle/PluginTestFixture.java index 8951308..ad60e04 100644 --- a/src/test/java/org/itsallcode/openfasttrace/gradle/PluginTestFixture.java +++ b/src/test/java/org/itsallcode/openfasttrace/gradle/PluginTestFixture.java @@ -76,7 +76,8 @@ private GradleRunner createGradleRunner() { allArgs.add("--build-cache"); } - allArgs.addAll(List.of("--configuration-cache", "--configuration-cache-problems=fail")); + allArgs.addAll(List.of("--configuration-cache", "--configuration-cache-problems=fail", + "--parallel")); allArgs.addAll(List.of("--warning-mode", "fail")); final GradleRunner runner = GradleRunner.create() .withProjectDir(projectDir.toFile()) From 12b5e95b8e72eb4c520b78f0209ff4383219add8 Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sun, 20 Sep 2026 14:51:14 +0200 Subject: [PATCH 03/13] Update changelog --- CHANGELOG.md | 4 ++++ README.md | 2 +- build.gradle | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99729c9..5918929 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [3.3.0] - 2026-09-?? + - [PR #80](https://github.com/itsallcode/openfasttrace-gradle/pull/80) - Fix JavaDoc warnings and let build fail on warnings - [PR #82](https://github.com/itsallcode/openfasttrace-gradle/pull/82) @@ -21,6 +23,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Allow configuring color schema - Configuration values for details section display and report verbosity are now case insensitive - Improve error messages for invalid enum values +- [#63](https://github.com/itsallcode/openfasttrace-gradle/issues/63) / [PR 88](https://github.com/itsallcode/openfasttrace-gradle/pull/88): + - Add support for parallel builds. This failed before with error `Resolution of the configuration 'oftRequirementConfig' was attempted without an exclusive lock` ## [3.2.0] - 2026-08-18 diff --git a/README.md b/README.md index 720744e..20db02a 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Gradle plugin for the requirement tracing suite [OpenFastTrace](https://github.c ```groovy plugins { - id "org.itsallcode.openfasttrace" version "3.2.0" + id "org.itsallcode.openfasttrace" version "3.3.0" } ``` diff --git a/build.gradle b/build.gradle index c32d77a..83cf259 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ repositories { apply from: 'gradle/workAroundJacocoGradleTestKitIssueOnWindows.gradle' -version = '3.2.0' +version = '3.3.0' group = 'org.itsallcode' ext { From a186c37c96cd0fe4bd2cfc73907d67f90a59a7ac Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sun, 20 Sep 2026 14:53:46 +0200 Subject: [PATCH 04/13] Upgrade plugins --- build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 83cf259..da8aa83 100644 --- a/build.gradle +++ b/build.gradle @@ -2,11 +2,11 @@ plugins { id 'java-gradle-plugin' id 'jacoco' id 'signing' - id 'com.gradle.plugin-publish' version '2.1.1' - id 'org.sonarqube' version '7.4.0.8496' + id 'com.gradle.plugin-publish' version '2.2.1' + id 'org.sonarqube' version '7.5.0.8588' id 'pl.droidsonroids.jacoco.testkit' version '1.0.12' - id 'io.github.ben-manes.versions' version '0.61.0' - id 'org.sonatype.gradle.plugins.scan' version '4.0.0' + id 'io.github.ben-manes.versions' version '0.64.0' + id 'org.sonatype.gradle.plugins.scan' version '4.1.0-02' } repositories { From e4e5f54b71e106449218a2b35101ca62a0277254 Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sun, 20 Sep 2026 14:54:31 +0200 Subject: [PATCH 05/13] Fix sonar warning --- .../openfasttrace/gradle/OpenFastTracePlugin.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java b/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java index 02e6271..61b72a5 100644 --- a/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java +++ b/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java @@ -159,19 +159,19 @@ private static ConfigurableFileCollection getImportedRequirements(final Project private static Optional> getImportedRequirements(final Project project) { - final String CONFIG_NAME = "oftRequirementConfig"; final List dependencies = getConfig(project).getImportedRequirements().get(); if (dependencies.isEmpty()) { return Optional.empty(); } - project.getConfigurations().create(CONFIG_NAME); + final String configName = "oftRequirementConfig"; + project.getConfigurations().create(configName); dependencies.forEach(dependency -> { LOG.info("Adding dependency {} with configuration {} to project {}", dependency, - CONFIG_NAME, project); - project.getDependencies().add(CONFIG_NAME, dependency); + configName, project); + project.getDependencies().add(configName, dependency); }); - return Optional.of(project.getConfigurations().named(CONFIG_NAME)); + return Optional.of(project.getConfigurations().named(configName)); } private static List getPathConfig(final Set allProjects) From d08511a210efbbee7e8a16e8d95780e949c42e39 Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sun, 20 Sep 2026 14:57:22 +0200 Subject: [PATCH 06/13] Upgrade setup-java action --- .github/workflows/build.yml | 4 ++-- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/release.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b2c8568..4fa5e56 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,7 +33,7 @@ jobs: fetch-depth: 0 persist-credentials: false - - uses: actions/setup-java@v5 + - uses: actions/setup-java@v6 with: distribution: 'temurin' java-version: ${{ matrix.java }} @@ -78,7 +78,7 @@ jobs: - uses: actions/checkout@v7 with: persist-credentials: false - - uses: actions/setup-java@v5 + - uses: actions/setup-java@v6 with: distribution: temurin java-version: 17 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index f6a34d0..c88894e 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -28,7 +28,7 @@ jobs: with: persist-credentials: false - - uses: actions/setup-java@v5 + - uses: actions/setup-java@v6 with: distribution: 'temurin' java-version: 17 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e328fdb..b783a14 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,7 +33,7 @@ jobs: script: | core.setFailed('Not running on main branch, github.ref is ${{ github.ref }}. Please start this workflow only on main') - - uses: actions/setup-java@v5 + - uses: actions/setup-java@v6 with: distribution: "temurin" java-version: 17 From 6bb9a16fab955c473524b6d694c5a757e0111f57 Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sun, 20 Sep 2026 14:59:15 +0200 Subject: [PATCH 07/13] Fix sonar warning --- .../openfasttrace/gradle/OpenFastTracePlugin.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java b/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java index 61b72a5..9e20af8 100644 --- a/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java +++ b/src/main/java/org/itsallcode/openfasttrace/gradle/OpenFastTracePlugin.java @@ -164,14 +164,13 @@ private static Optional> getImportedRequirements(final P { return Optional.empty(); } - final String configName = "oftRequirementConfig"; - project.getConfigurations().create(configName); + final String CONFIG_NAME = "oftRequirementConfig"; + project.getConfigurations().create(CONFIG_NAME); dependencies.forEach(dependency -> { - LOG.info("Adding dependency {} with configuration {} to project {}", dependency, - configName, project); - project.getDependencies().add(configName, dependency); + LOG.info("Adding dependency {} with configuration {} to project {}", dependency, CONFIG_NAME, project); + project.getDependencies().add(CONFIG_NAME, dependency); }); - return Optional.of(project.getConfigurations().named(configName)); + return Optional.of(project.getConfigurations().named(CONFIG_NAME)); } private static List getPathConfig(final Set allProjects) From 628a59dc0aefe503850c6da7d68bf89e8ff4d813 Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sun, 20 Sep 2026 15:05:28 +0200 Subject: [PATCH 08/13] Fix sonar warnings about action version --- .github/workflows/build.yml | 4 ++-- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/release.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4fa5e56..9378805 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,7 +39,7 @@ jobs: java-version: ${{ matrix.java }} - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6 + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 - name: Cache SonarQube packages if: ${{ env.DEFAULT_JAVA == matrix.java }} @@ -83,7 +83,7 @@ jobs: distribution: temurin java-version: 17 - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6 + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 - name: Ossindex run: ./gradlew ossIndexAudit --warning-mode all --info env: diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index c88894e..65628c4 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -34,7 +34,7 @@ jobs: java-version: 17 - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6 + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 - name: Initialize CodeQL uses: github/codeql-action/init@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b783a14..56f0bdd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,7 +39,7 @@ jobs: java-version: 17 - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6 + uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 - name: Build run: ./gradlew build --warning-mode all -PjavaVersion=17 From c5286090db8ae744c8ac164bc43f1a68a0b6cc28 Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sun, 20 Sep 2026 15:19:51 +0200 Subject: [PATCH 09/13] Pin action hash --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9378805..aafd5e5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -103,7 +103,7 @@ jobs: run: | mkdir -p ./target echo '{ "aliveStatusCodes": [429, 200] }' > ./target/broken_links_checker.json - - uses: tcort/github-action-markdown-link-check@v1 + - uses: tcort/github-action-markdown-link-check@e7c7a18363c842693fadde5d41a3bd3573a7a225 # v1.1.2 with: use-quiet-mode: 'yes' use-verbose-mode: 'yes' From 60700d5de3cb2d66fd3d5498709cb60e1d6c1110 Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sun, 20 Sep 2026 15:25:02 +0200 Subject: [PATCH 10/13] Use strict mode for config cache --- settings.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/settings.gradle b/settings.gradle index 52fc8c5..eebbce4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,3 +2,4 @@ plugins { id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' } rootProject.name = 'openfasttrace-gradle' +enableFeaturePreview "STABLE_CONFIGURATION_CACHE" From 1e7d04ff4d3ba7f64f330634fd814b86c80beaed Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sun, 20 Sep 2026 15:25:26 +0200 Subject: [PATCH 11/13] Enable parallel config cache --- .../itsallcode/openfasttrace/gradle/PluginTestFixture.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/itsallcode/openfasttrace/gradle/PluginTestFixture.java b/src/test/java/org/itsallcode/openfasttrace/gradle/PluginTestFixture.java index ad60e04..1adf031 100644 --- a/src/test/java/org/itsallcode/openfasttrace/gradle/PluginTestFixture.java +++ b/src/test/java/org/itsallcode/openfasttrace/gradle/PluginTestFixture.java @@ -76,8 +76,8 @@ private GradleRunner createGradleRunner() { allArgs.add("--build-cache"); } - allArgs.addAll(List.of("--configuration-cache", "--configuration-cache-problems=fail", - "--parallel")); + allArgs.addAll(List.of("--configuration-cache", "-Dorg.gradle.configuration-cache.parallel=true", + "--configuration-cache-problems=fail", "--parallel")); allArgs.addAll(List.of("--warning-mode", "fail")); final GradleRunner runner = GradleRunner.create() .withProjectDir(projectDir.toFile()) From 0bb24bdffd65097954d352b2e6b7d541846c55de Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sun, 20 Sep 2026 19:57:14 +0200 Subject: [PATCH 12/13] Fix github linter findings --- .github/dependabot.yml | 2 ++ .github/workflows/release.yml | 7 +++---- .github/zizmor.yml | 8 ++++++++ 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 .github/zizmor.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e412a2a..33c07f6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,3 +9,5 @@ updates: directory: "/" schedule: interval: "monthly" + cooldown: + default-days: 7 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 56f0bdd..375ea24 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,10 +28,9 @@ jobs: - name: Fail if not running on main branch if: ${{ github.ref != 'refs/heads/main' }} - uses: actions/github-script@v9 - with: - script: | - core.setFailed('Not running on main branch, github.ref is ${{ github.ref }}. Please start this workflow only on main') + run: echo "Not running on main branch, github.ref is $GITHUB_REF. Please start this workflow only on main" && exit 1 + env: + GITHUB_REF: ${{ github.ref }} - uses: actions/setup-java@v6 with: diff --git a/.github/zizmor.yml b/.github/zizmor.yml new file mode 100644 index 0000000..785db4c --- /dev/null +++ b/.github/zizmor.yml @@ -0,0 +1,8 @@ +# See https://docs.zizmor.sh/configuration/#settings +rules: + unpinned-uses: + config: + policies: + "actions/*": ref-pin + "github/codeql-action/*": ref-pin + "*": hash-pin From 6642e2e4375fdfe19b94e13afd071f69e6ae8318 Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sun, 20 Sep 2026 19:59:39 +0200 Subject: [PATCH 13/13] Update relase date --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5918929..086a913 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [3.3.0] - 2026-09-?? +## [3.3.0] - 2026-09-20 - [PR #80](https://github.com/itsallcode/openfasttrace-gradle/pull/80) - Fix JavaDoc warnings and let build fail on warnings