diff --git a/README.md b/README.md index 639f1ab..b17fa12 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,19 @@ To run the automated checks for the trace action and the project trace itself: ./gradlew check verifyPlugin ``` +To check for newer dependency, Gradle plugin, and Gradle wrapper versions: + +```sh +./gradlew --no-configuration-cache --no-parallel dependencyUpdates -Drevision=release +``` + +After intentionally changing dependency or Gradle plugin versions, refresh the +committed Gradle lock file: + +```sh +./gradlew --write-locks dependencies +``` + Example OFT files for manual testing are available under `examples/` in this project. For a guided live demonstration, use the script in [doc/demo/plugin-demo.md](doc/demo/plugin-demo.md) with the isolated example project in [doc/demo/example](doc/demo/example). diff --git a/build.gradle.kts b/build.gradle.kts index 600fa48..694606c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,4 @@ +import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent import org.gradle.api.tasks.bundling.Zip @@ -5,18 +6,27 @@ import org.gradle.jvm.toolchain.JavaLanguageVersion import org.gradle.testing.jacoco.plugins.JacocoTaskExtension import org.jetbrains.intellij.platform.gradle.TestFrameworkType +fun isNonStableVersion(version: String): Boolean { + val stableKeyword = listOf("RELEASE", "FINAL", "GA").any { version.uppercase().contains(it) } + val stableVersion = "^[0-9,.v-]+(-r)?$".toRegex().matches(version) + return !stableKeyword && !stableVersion +} + // [bld->dsn~plugin-build-uses-intellij-platform-gradle-plugin~1] plugins { id("java") id("jacoco") - id("com.diffplug.spotless") version "8.4.0" - id("org.itsallcode.openfasttrace") version "3.1.1" - id("org.jetbrains.intellij.platform") version "2.15.0" - id("org.sonarqube") version "7.2.3.7755" + id("com.github.ben-manes.versions") version "0.54.0" + id("com.diffplug.spotless") version "8.6.0" + id("org.itsallcode.openfasttrace") version "3.1.2" + id("org.jetbrains.intellij.platform") version "2.16.0" + id("org.sonarqube") version "7.3.1.8318" } -group = providers.gradleProperty("group").get() -version = providers.gradleProperty("version").get() +val pluginVersion = providers.gradleProperty("version") + +group = "org.itsallcode.openfasttrace" +version = pluginVersion.get() java { toolchain { @@ -28,6 +38,11 @@ jacoco { toolVersion = "0.8.13" } +// [bld->dsn~gradle-dependency-maintenance-uses-locks-and-versions-plugin~1] +dependencyLocking { + lockAllConfigurations() +} + sonar { properties { property("sonar.organization", "itsallcode") @@ -59,22 +74,22 @@ repositories { } dependencies { - implementation("org.itsallcode.openfasttrace:openfasttrace:${providers.gradleProperty("openfasttraceVersion").get()}") + implementation("org.itsallcode.openfasttrace:openfasttrace:4.5.0") intellijPlatform { - intellijIdea(providers.gradleProperty("platformVersion")) + intellijIdea("2026.1.3") bundledPlugin("com.intellij.java") testFramework(TestFrameworkType.Platform) pluginVerifier() zipSigner() } - testImplementation(platform("org.junit:junit-bom:${providers.gradleProperty("junitBomVersion").get()}")) - testImplementation("junit:junit:${providers.gradleProperty("junit4Version").get()}") + testImplementation(platform("org.junit:junit-bom:6.1.0")) + testImplementation("junit:junit:4.13.2") testImplementation("org.junit.jupiter:junit-jupiter") testImplementation("org.junit.platform:junit-platform-launcher") - testImplementation("org.hamcrest:hamcrest:${providers.gradleProperty("hamcrestVersion").get()}") - testImplementation("org.opentest4j:opentest4j:${providers.gradleProperty("opentest4jVersion").get()}") + testImplementation("org.hamcrest:hamcrest:3.0") + testImplementation("org.opentest4j:opentest4j:1.3.0") testRuntimeOnly("org.junit.vintage:junit-vintage-engine") } @@ -82,18 +97,18 @@ intellijPlatform { buildSearchableOptions = false pluginConfiguration { - id = providers.gradleProperty("pluginId") - name = providers.gradleProperty("pluginName") - version = providers.gradleProperty("version") + id = "org.itsallcode.openfasttrace-intellij-plugin" + name = "OpenFastTrace" + version = pluginVersion vendor { - name = providers.gradleProperty("pluginVendor") - email = providers.gradleProperty("pluginVendorEmail") - url = providers.gradleProperty("pluginVendorUrl") + name = "Itsallcode.org" + email = "opensource@itsallcode.org" + url = "https://itsallcode.org/" } ideaVersion { - sinceBuild = providers.gradleProperty("platformSinceBuild") + sinceBuild = "261" } } @@ -124,7 +139,15 @@ tasks { } named("buildPlugin") { - archiveBaseName.set(providers.gradleProperty("pluginName")) + archiveBaseName.set("OpenFastTrace") + } + + withType().configureEach { + revision = "release" + gradleReleaseChannel = "current" + rejectVersionIf { + isNonStableVersion(candidate.version) && !isNonStableVersion(currentVersion) + } } test { diff --git a/doc/changes/changes_0.8.0.md b/doc/changes/changes_0.8.0.md index 73a1f65..fcd76d3 100644 --- a/doc/changes/changes_0.8.0.md +++ b/doc/changes/changes_0.8.0.md @@ -21,3 +21,7 @@ The global `Tools | OpenFastTrace | Trace Project` action and new or previously ## Documentation #43: Add a use-case-centric plugin user guide + +## Build Maintenance + +#45: Add Gradle dependency locks, dependency version checks, and dependency updates diff --git a/doc/changesets/45-gradle-lock-and-version-check.md b/doc/changesets/45-gradle-lock-and-version-check.md new file mode 100644 index 0000000..59075a5 --- /dev/null +++ b/doc/changesets/45-gradle-lock-and-version-check.md @@ -0,0 +1,218 @@ +# GH-45 Gradle lock and version check + +## Goal + +Make the Gradle build deterministic enough for SonarCloud by using committed +dependency locks, and add an on-demand Gradle version check that reports newer +dependency and plugin versions. After adding the update check, refresh the +project's dependencies, Gradle plugins, IntelliJ Platform target, and Gradle +wrapper to the latest resolvable stable releases. + +This is repository build maintenance only. It must not change IntelliJ plugin +runtime behavior or user-facing requirements except where a dependency update +requires keeping plugin support aligned with the upstream OpenFastTrace +contract. + +## Scope + +In scope: + +* configure Gradle dependency locking for the project build +* generate and commit the Gradle lock files required by the chosen locking setup +* add `com.github.ben-manes.versions` as the minimal-effort Gradle plugin for + checking available dependency, plugin, and Gradle wrapper updates +* update all project dependencies, Gradle plugins, the IntelliJ Platform target, + and the Gradle wrapper to the latest resolvable stable releases +* refresh the committed lock metadata after intentional version changes +* keep version declarations centralized and avoid dynamic dependency versions +* update developer documentation for lock maintenance and version checks +* keep CI build, tracing, packaging, and plugin verification compatible with the + new Gradle metadata + +Out of scope: + +* changing IntelliJ plugin runtime behavior or end-user IDE workflows +* changing `doc/system_requirements.md` +* broader dependency-management redesign beyond adding the Gradle Versions Plugin +* changing SonarCloud quality profiles, quality gates, or project permissions + +## Design References + +* [System Requirements](../system_requirements.md) +* [Design Decisions](../design/architecture_decisions.md) +* [Quality Requirements](../design/quality_requirements.md) +* [Changeset Guidelines](README.md) + +## Strategy + +Treat GH-45 as a build configuration change. Prefer Gradle's built-in +dependency locking for deterministic dependency resolution, then commit only the +lock metadata that normal builds need. + +Use the Gradle Versions Plugin +(`com.github.ben-manes.versions`) for the version check instead of custom Gradle +logic. The plugin provides the `dependencyUpdates` task for dependency updates +and also checks for newer Gradle releases. As of 2026-06-09, the Gradle Plugin +Portal lists `0.54.0` as the latest version. + +Keep `dependencyUpdates` as an on-demand developer task, not part of the normal +`check` lifecycle, because available update results change over time and should +not make ordinary builds unstable. Configure it for the current release channel +and stable-version candidates if the default report is too noisy. Run it with +`--no-configuration-cache --no-parallel` on Gradle 9 because the plugin +documents that Gradle 9 parallel execution is incompatible with this task, and +the task is not clean with the project's default configuration-cache setting. + +The user explicitly approved using the Gradle Versions Plugin as the +minimal-effort dependency-update solution. Because this still adds a third-party +build plugin, document the decision if the dependency policy requires an +architecture decision for build plugins as well as runtime libraries. + +The user later requested updating all dependencies to the latest releases. Use +the `dependencyUpdates` report as the source for version candidates, update only +stable releases, and keep locked dependency resolution deterministic. If a +reported version is not reachable through the project's Gradle coordinates, +record that as an explicit unresolved update instead of forcing an invalid +coordinate. + +## Task List + +- [x] Create and checkout a new Git branch `refactoring/45-gradle-lock-and-version-check` + +### Requirements And Design + +- [x] Confirm that GH-45 does not require changes to `doc/system_requirements.md` + because it affects repository build maintenance, not plugin behavior +- [x] Confirm that the existing build-tool design decision + `dsn~plugin-build-uses-intellij-platform-gradle-plugin~1` still covers the + Gradle build setup after dependency locking is enabled +- [x] Record that the user approved `com.github.ben-manes.versions` as the + minimal-effort version-check plugin for GH-45 +- [x] Add the narrow build-tool decision + `dsn~gradle-dependency-maintenance-uses-locks-and-versions-plugin~1` to + `doc/design/architecture_decisions.md` +- [x] Update `doc/design/quality_requirements.md` so it documents dependency + locking and approved build-plugin scope +- [x] Proceed after the user requested plan execution without an additional + documentation-review stop + +### Build Integration + +- [x] Configure Gradle dependency locking in `build.gradle.kts` or + `settings.gradle.kts` for all relevant resolvable project configurations +- [x] Generate lock files with the Gradle-supported `--write-locks` flow and + include the resulting lock metadata in the changeset +- [x] Verify that normal Gradle invocations use the committed locks and report + lock drift instead of silently accepting changed dependency resolution +- [x] Add the Gradle Versions Plugin to `build.gradle.kts` with plugin ID + `com.github.ben-manes.versions` and the current approved plugin version + from the Gradle Plugin Portal +- [x] Configure the `dependencyUpdates` task so it reports stable available + updates for project dependencies, test dependencies, Gradle plugins, and + Gradle itself +- [x] Keep the `dependencyUpdates` task outside `check` and CI build gates unless + the user later requests update checks as a scheduled/reporting workflow +- [x] Inline build-only constants in `build.gradle.kts`, keep only the release + version in `gradle.properties`, and avoid dynamic versions +- [x] Update project dependencies, Gradle plugins, and the Gradle wrapper to the + latest stable versions reported by `dependencyUpdates` when the + corresponding Gradle coordinates are resolvable +- [x] Update the IntelliJ Platform target to the latest resolvable IDEA release + available through the IntelliJ Platform Gradle Plugin repositories +- [x] Keep coverage-tag file-extension support aligned with the default + extensions of the updated OpenFastTrace Tag Importer, including completion + registration for newly supported XML coverage-tag files +- [x] Keep generated version-report output under `build/` or another ignored + location so only source metadata and lock files are committed +- [x] Keep `.github/workflows/build.yml` and `.github/workflows/release.yml` + compatible with dependency locking and the standard build lifecycle + +### Update Developer Documentation + +- [x] Update the README development section with the command that checks latest + dependency and plugin versions: + `./gradlew --no-configuration-cache --no-parallel dependencyUpdates -Drevision=release` +- [x] Update the README development section with the command for refreshing + Gradle lock files after an intentional dependency or plugin version change + +### Verification + +- [x] Run the chosen Gradle lock generation command and confirm no unexpected + files outside Gradle lock metadata are produced +- [x] Run `./gradlew --no-configuration-cache --no-parallel dependencyUpdates -Drevision=release` + and confirm it reports dependency, plugin, and Gradle update information + without failing the normal build +- [x] Run `./gradlew --warning-mode=all traceRequirements` +- [x] Run `./gradlew --warning-mode=all check buildPlugin` +- [x] Run `./gradlew --warning-mode=all verifyPlugin` and record any remaining + pre-existing verifier findings if it is not green +- [x] Run `./gradlew --no-configuration-cache sonar -Dsonar.skip=true` locally + to verify Sonar task wiring, and rely on CI for a real SonarCloud upload + when no `SONAR_TOKEN` is available +- [x] Confirm no third-party runtime dependencies were added and that the only + added third-party artifact is the approved build plugin +- [x] Keep the OpenFastTrace trace clean for the requirement and design artifact + types in scope +- [x] After the dependency refresh, rerun `./gradlew --write-locks dependencies` + and confirm the lock file matches the updated dependency graph +- [x] After the dependency refresh, rerun `./gradlew --no-configuration-cache --no-parallel dependencyUpdates -Drevision=release` + and record any remaining unavailable or unresolved update candidates +- [x] After the dependency refresh, rerun `./gradlew --warning-mode=all check buildPlugin` +- [x] After the dependency refresh, rerun `./gradlew --warning-mode=all verifyPlugin` +- [x] After the dependency refresh, rerun `./gradlew --no-configuration-cache sonar -Dsonar.skip=true` + +`./gradlew --write-locks dependencies` generated and refreshed `gradle.lockfile` +as source-controlled lock metadata. After the dependency refresh, the lock file +records OpenFastTrace `4.5.0`, IntelliJ IDEA `2026.1.3` / `IU-261.25134.95`, +JUnit `6.1.0`, and the updated Gradle plugin dependency graph. + +`./gradlew wrapper --gradle-version 9.5.1` updated the Gradle wrapper +distribution URL, wrapper jar, and wrapper scripts. + +`./gradlew dependencyInsight --dependency org.itsallcode.openfasttrace:openfasttrace --configuration runtimeClasspath` +shows Gradle selecting `4.5.0` with the reason `Dependency version enforced by +Dependency Locking`. + +`./gradlew --no-configuration-cache --no-parallel dependencyUpdates -Drevision=release` +passes after the refresh. It reports the declared project dependencies, Gradle +plugins, and Gradle `9.5.1` wrapper as up to date, except for the IntelliJ +Platform `test-framework` artifact where it reports `261.25134.95` to +`262.7132.36`. Attempting to move the project target to `intellijIdea("2026.2")` +failed because `idea:idea:2026.2` is not resolvable from the configured +IntelliJ Platform repositories, so the build remains on the latest resolvable +IDEA product coordinate `2026.1.3`. The task still cannot determine latest +versions for the +IntelliJ Platform pseudo-dependencies `bundledModule:intellij-platform-test-runtime`, +`bundledPlugin:com.intellij.java`, and `idea:idea`. + +Updating OpenFastTrace to `4.5.0` added `xml` and `fxml` to the upstream Tag +Importer's default extensions. The plugin's supported coverage-tag file +extension list and its upstream-extension alignment test now include those +extensions. XML coverage-tag completion is also registered in `plugin.xml` and +covered by `OftCoverageTagCompletionTest`. + +`./gradlew --warning-mode=all traceRequirements` passes. + +`./gradlew --warning-mode=all check buildPlugin` passes. + +`./gradlew --warning-mode=all verifyPlugin` passes. The verifier reports the +existing experimental `BackgroundUpdateHighlightersUtil` class and method usage +in `OftHighlightingPass` for the checked IDEs, but reports the plugin as +compatible. + +`./gradlew --no-configuration-cache sonar -Dsonar.skip=true` passes and confirms +Sonar task wiring without requiring a `SONAR_TOKEN`. + +## Version And Changelog Update + +- [x] Check the current version mentioned in `gradle.properties` against the + latest GitHub release before making a version decision +- [x] Keep the plugin version unchanged unless the project release policy + requires a patch release for build-maintenance changes +- [x] If a changelog entry is needed, add GH-45 to the active release changelog + as a build/refactoring entry and update the release date to the + implementation date + +Current `gradle.properties` version is `0.8.0`; latest GitHub release is +`0.7.0` as of 2026-06-09. The version remains `0.8.0`, and GH-45 is added to +the active `0.8.0` changelog as build maintenance. diff --git a/doc/design/architecture_decisions.md b/doc/design/architecture_decisions.md index baa039d..b9b9a64 100644 --- a/doc/design/architecture_decisions.md +++ b/doc/design/architecture_decisions.md @@ -51,6 +51,64 @@ Needs: bld Tags: Build, Gradle +### How Does the Project Keep Gradle Dependency Metadata Predictable? + +The project needs predictable Gradle dependency resolution for static analysis +and reproducible local and CI builds. It also needs a lightweight way to check +whether newer dependency, build-plugin, or Gradle versions are available without +making ordinary builds fail when an update exists. + +This decision is architecture-relevant because it impacts: + +* build reproducibility +* dependency maintenance effort +* SonarCloud analysis compatibility +* the project's dependency-policy boundary for build plugins + +We considered the following alternatives: + +1. Use Gradle dependency verification metadata only. + + This would verify artifact integrity, but it would require reviewing and + maintaining checksums for each resolved artifact. The project explicitly does + not want that review burden at this stage. + +1. Use Gradle dependency locking and a custom version-check task. + + This would keep the dependency set predictable, but a custom version-check + task would add project-specific Gradle logic for behavior that already has a + maintained plugin solution. + +1. Use Gradle dependency locking and the Gradle Versions Plugin. + + This keeps normal dependency resolution locked through Gradle's built-in + mechanism and delegates update discovery to a maintained build plugin that + can be run on demand by maintainers. + +#### Gradle Dependency Maintenance Uses Locks And Versions Plugin +`dsn~gradle-dependency-maintenance-uses-locks-and-versions-plugin~1` + +The Gradle build uses dependency locking for predictable dependency resolution +and the Gradle Versions Plugin for on-demand dependency, build-plugin, and +Gradle wrapper update reports. + +Rationale: + +Gradle dependency locking satisfies the need for stable resolved dependency +versions without enabling full dependency verification metadata. The Gradle +Versions Plugin is an approved build-only dependency for GH-45 and avoids +custom version-check logic in the build script. + +Comment: + +The version-check task is informational and stays outside the standard `check` +lifecycle. Available updates change over time, so update discovery must not +make normal local or CI builds unstable. + +Needs: bld + +Tags: Build, Gradle, Dependencies, SonarCloud + ### How Does the Project Monitor Dependency Vulnerabilities? The project needs vulnerability monitoring for Gradle dependencies without making local and CI builds depend on an external vulnerability-audit service during every run. diff --git a/doc/design/quality_requirements.md b/doc/design/quality_requirements.md index 8b42286..f3ff460 100644 --- a/doc/design/quality_requirements.md +++ b/doc/design/quality_requirements.md @@ -55,7 +55,11 @@ The plugin uses the minimum set of dependencies required for: Additional libraries are not allowed by default. Any new third-party dependency requires an explicit design decision and approval before it is added to the build. -The Gradle dependency verification is disabled. Otherwise, we would have to review each dependency. Instead, we only use dependencies from the Central Repository. +The Gradle dependency verification is disabled. Otherwise, we would have to review each dependency. Runtime and test dependencies come from the Central Repository, while approved Gradle build plugins are resolved through the Gradle Plugin Portal. + +Gradle dependency locking is enabled for predictable dependency resolution in local and CI builds. Dependency locking is not a replacement for dependency verification; it only fixes the resolved dependency versions until maintainers intentionally refresh the lock metadata. + +Third-party build plugins follow the same approval rule as runtime libraries. Approved build plugins must stay limited to build maintenance concerns and must not add plugin runtime dependencies. ## Static Analysis And Security Gates diff --git a/gradle.lockfile b/gradle.lockfile new file mode 100644 index 0000000..605d7b6 --- /dev/null +++ b/gradle.lockfile @@ -0,0 +1,86 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +bundledModule:intellij-platform-test-runtime:IU-261.25134.95=intellijPlatformTestRuntimeFixClasspath,intellijPlatformTestRuntimeFixClasspath_manualTestIde +bundledPlugin:com.intellij.java:IU-261.25134.95=compileClasspath,intellijPlatformBundledPlugins,intellijPlatformDependencies,intellijPlatformTestBundledPlugins,intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +com.fasterxml.jackson.core:jackson-annotations:2.19.0=intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +com.fasterxml.jackson.core:jackson-core:2.19.0=intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +com.fasterxml.jackson.core:jackson-databind:2.19.0=intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +com.fasterxml.jackson.module:jackson-module-kotlin:2.19.0=intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +com.fasterxml.jackson:jackson-bom:2.19.0=intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +com.jetbrains.intellij.java:java-compiler-ant-tasks:261.25134.95=intellijPlatformJavaCompiler +com.jetbrains.intellij.java:java-compiler-instrumentation-util-java8:261.25134.95=intellijPlatformJavaCompiler +com.jetbrains.intellij.java:java-compiler-instrumentation-util:261.25134.95=intellijPlatformJavaCompiler +com.jetbrains.intellij.java:java-gui-forms-compiler:261.25134.95=intellijPlatformJavaCompiler +com.jetbrains.intellij.java:java-gui-forms-rt:261.25134.95=intellijPlatformJavaCompiler +com.jetbrains.intellij.platform:core-nio-fs:261.25134.95=intellijPlatformTestClasspath,intellijPlatformTestDependencies +com.jetbrains.intellij.platform:test-framework-common:261.25134.95=intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +com.jetbrains.intellij.platform:test-framework-core:261.25134.95=intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +com.jetbrains.intellij.platform:test-framework-team-city:261.25134.95=intellijPlatformTestClasspath,intellijPlatformTestDependencies +com.jetbrains.intellij.platform:test-framework:261.25134.95=intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +com.jetbrains.intellij.platform:todo:261.25134.95=intellijPlatformTestClasspath,intellijPlatformTestDependencies +com.jetbrains.intellij.platform:util-jdom:261.25134.95=intellijPlatformJavaCompiler +com.jetbrains.intellij.tools:tests-bootstrap:261.25134.95=intellijPlatformTestClasspath,intellijPlatformTestDependencies +com.jgoodies:forms:1.1-preview=intellijPlatformJavaCompiler +idea:idea:2026.1.3=compileClasspath,intellijPlatformClasspath,intellijPlatformClasspath_manualTestIde,intellijPlatformDependency,intellijPlatformDependencyArchive,intellijPlatformDependencyArchive_manualTestIde,intellijPlatformDependency_manualTestIde,intellijPlatformTestClasspath,intellijPlatformTestClasspath_manualTestIde,intellijPluginVerifierIdes,intellijPluginVerifierIdesDependency,testCompileClasspath +jaxen:jaxen:1.2.0=intellijPlatformJavaCompiler +junit:junit:4.13.2=intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,testCompileClasspath,testRuntimeClasspath +one.util:streamex:0.8.4=intellijPlatformTestClasspath,intellijPlatformTestDependencies +org.apache.httpcomponents:httpclient:4.5.14=intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +org.apache.httpcomponents:httpcore:4.4.16=intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +org.apache.httpcomponents:httpmime:4.5.14=intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath +org.assertj:assertj-core:4.0.0-M1=intellijPlatformTestClasspath,intellijPlatformTestDependencies +org.hamcrest:hamcrest-core:1.3=intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,testCompileClasspath,testRuntimeClasspath +org.hamcrest:hamcrest:2.2=intellijPlatformTestClasspath,intellijPlatformTestDependencies +org.hamcrest:hamcrest:3.0=intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-api:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-core:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-exporter-common:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-exporter-specobject:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-importer-lightweightmarkup:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-importer-markdown:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-importer-restructuredtext:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-importer-specobject:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-importer-tag:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-importer-xmlparser:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-importer-zip:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-reporter-aspec:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-reporter-html:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace-reporter-plaintext:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.itsallcode.openfasttrace:openfasttrace:4.5.0=compileClasspath,intellijPlatformComposedJar,intellijPlatformRuntimeClasspath,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.jacoco:org.jacoco.agent:0.8.13=jacocoAgent,jacocoAnt +org.jacoco:org.jacoco.ant:0.8.13=jacocoAnt +org.jacoco:org.jacoco.core:0.8.13=jacocoAnt +org.jacoco:org.jacoco.report:0.8.13=jacocoAnt +org.jetbrains.compose.hot-reload:hot-reload-agent:1.1.0-alpha03=composeHotReloadAgent +org.jetbrains.intellij.deps:asm-all:9.6.1=intellijPlatformJavaCompiler +org.jetbrains.intellij.plugins:verifier-cli:1.405=intellijPluginVerifier +org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.4.0=intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.9.0=intellijPlatformTestClasspath,intellijPlatformTestDependencies +org.jetbrains.runtime:jbr-api:1.9.0=intellijPlatformTestClasspath,intellijPlatformTestDependencies,testCompileClasspath +org.jetbrains:annotations:26.0.2=intellijPlatformJavaCompiler,intellijPlatformTestClasspath,intellijPlatformTestDependencies +org.jetbrains:marketplace-zip-signer:0.1.43=marketplaceZipSigner +org.jspecify:jspecify:1.0.0=testCompileClasspath +org.junit.jupiter:junit-jupiter-api:5.13.4=intellijPlatformTestClasspath,intellijPlatformTestDependencies +org.junit.jupiter:junit-jupiter-api:6.1.0=intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-engine:5.13.4=intellijPlatformTestClasspath,intellijPlatformTestDependencies +org.junit.jupiter:junit-jupiter-engine:6.1.0=intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-params:6.1.0=intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter:6.1.0=intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-commons:1.13.4=intellijPlatformTestClasspath,intellijPlatformTestDependencies +org.junit.platform:junit-platform-commons:6.1.0=intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-engine:1.13.4=intellijPlatformTestClasspath,intellijPlatformTestDependencies +org.junit.platform:junit-platform-engine:6.1.0=intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-launcher:1.13.4=intellijPlatformTestClasspath,intellijPlatformTestDependencies +org.junit.platform:junit-platform-launcher:6.1.0=intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,testCompileClasspath,testRuntimeClasspath +org.junit.vintage:junit-vintage-engine:5.13.4=intellijPlatformTestClasspath,intellijPlatformTestDependencies +org.junit.vintage:junit-vintage-engine:6.1.0=intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,testRuntimeClasspath +org.junit:junit-bom:5.13.4=intellijPlatformTestClasspath,intellijPlatformTestDependencies +org.junit:junit-bom:6.1.0=intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,testCompileClasspath,testRuntimeClasspath +org.opentest4j:opentest4j:1.3.0=intellijPlatformTestClasspath,intellijPlatformTestDependencies,intellijPlatformTestRuntimeClasspath,intellijPlatformTestRuntimeClasspath_manualTestIde,testCompileClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.8=intellijPlatformTestClasspath,intellijPlatformTestDependencies +org.ow2.asm:asm-commons:9.8=jacocoAnt +org.ow2.asm:asm-tree:9.8=intellijPlatformTestClasspath,intellijPlatformTestDependencies,jacocoAnt +org.ow2.asm:asm:9.8=intellijPlatformTestClasspath,intellijPlatformTestDependencies,jacocoAnt +empty=annotationProcessor,intellijPlatformBundledModules,intellijPlatformLocal,intellijPlatformLocal_manualTestIde,intellijPlatformPlugin,intellijPlatformPluginComposedModule,intellijPlatformPluginDependency,intellijPlatformPluginLocal,intellijPlatformPluginModule,intellijPlatformTestBundledModules,intellijPlatformTestBundledModules_manualTestIde,intellijPlatformTestBundledPlugins_manualTestIde,intellijPlatformTestDependencies_manualTestIde,intellijPlatformTestPlugin,intellijPlatformTestPluginDependency,intellijPlatformTestPluginDependency_manualTestIde,intellijPlatformTestPluginLocal,intellijPlatformTestPluginLocal_manualTestIde,intellijPlatformTestPlugin_manualTestIde,intellijPluginVerifierIdesLocalInstance,jetbrainsRuntime,jetbrainsRuntimeDependency,jetbrainsRuntimeLocalInstance,jetbrainsRuntime_manualTestIde,testAnnotationProcessor diff --git a/gradle.properties b/gradle.properties index 43eefca..c9bd9c6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,22 +1,4 @@ -group=org.itsallcode.openfasttrace version=0.8.0 -platformType=IC -platformVersion=2026.1 -platformSinceBuild=261 -openfasttraceVersion=4.4.0 -junitBomVersion=5.14.1 -junit4Version=4.13.2 -hamcrestVersion=3.0 -opentest4jVersion=1.3.0 - -pluginId=org.itsallcode.openfasttrace-intellij-plugin -pluginName=OpenFastTrace -pluginVendor=Itsallcode.org -pluginVendorEmail=opensource@itsallcode.org -pluginVendorUrl=https://itsallcode.org/ - -userGuideUrl=https://github.com/itsallcode/openfasttrace/blob/main/doc/user_guide.md - org.gradle.configuration-cache=true org.gradle.jvmargs=-Xmx2g -Dfile.encoding=UTF-8 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d997cfc..b1b8ef5 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cc9639f..df6a6ad 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,9 @@ -#Thu May 14 09:27:45 CEST 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip +networkTimeout=10000 +retries=0 +retryBackOffMs=500 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 739907d..b9bb139 100755 --- a/gradlew +++ b/gradlew @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/gradlew.bat b/gradlew.bat index c4bdd3a..24c62d5 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -23,8 +23,8 @@ @rem @rem ########################################################################## -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @@ -51,7 +51,7 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -65,7 +65,7 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :execute @rem Setup the command line @@ -73,21 +73,10 @@ goto fail @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/src/main/java/org/itsallcode/openfasttrace/intellijplugin/OftSupportedFiles.java b/src/main/java/org/itsallcode/openfasttrace/intellijplugin/OftSupportedFiles.java index e7dda6c..ee90247 100644 --- a/src/main/java/org/itsallcode/openfasttrace/intellijplugin/OftSupportedFiles.java +++ b/src/main/java/org/itsallcode/openfasttrace/intellijplugin/OftSupportedFiles.java @@ -35,6 +35,7 @@ public final class OftSupportedFiles { "tf", "tfvars", "bat", "json", + "xml", "fxml", "toml", "html", "htm", "xhtml", "yaml", "yml", diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index e18439c..6564fd3 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -61,6 +61,9 @@ + diff --git a/src/test/java/org/itsallcode/openfasttrace/intellijplugin/OftSupportedFilesTest.java b/src/test/java/org/itsallcode/openfasttrace/intellijplugin/OftSupportedFilesTest.java index f071ad5..58b7860 100644 --- a/src/test/java/org/itsallcode/openfasttrace/intellijplugin/OftSupportedFilesTest.java +++ b/src/test/java/org/itsallcode/openfasttrace/intellijplugin/OftSupportedFilesTest.java @@ -35,7 +35,8 @@ void givenInvalidSpecificationFileNameWhenCheckingThenItReturnsFalse(final Strin "settings.cfg", "settings.conf", "settings.ini", "scenario.feature", "source.go", "source.groovy", - "data.json", "page.htm", "page.html", "page.xhtml", "pipeline.yaml", "pipeline.yml", + "data.json", "layout.fxml", "project.xml", "page.htm", "page.html", "page.xhtml", + "pipeline.yaml", "pipeline.yml", "Main.JAVA", "source.clj", "source.kt", "source.scala", "source.js", "source.mjs", "source.cjs", "template.ejs", diff --git a/src/test/java/org/itsallcode/openfasttrace/intellijplugin/navigation/OftCoverageTagCompletionTest.java b/src/test/java/org/itsallcode/openfasttrace/intellijplugin/navigation/OftCoverageTagCompletionTest.java index 99d26f4..feedccc 100644 --- a/src/test/java/org/itsallcode/openfasttrace/intellijplugin/navigation/OftCoverageTagCompletionTest.java +++ b/src/test/java/org/itsallcode/openfasttrace/intellijplugin/navigation/OftCoverageTagCompletionTest.java @@ -101,6 +101,15 @@ public void testGivenCoverageTagTargetInJsonLineCommentWhenBasicCompletionInvoke assertThat(lookupStrings(), hasItem("dsn~coverage-target~1")); } + public void testGivenCoverageTagTargetInXmlCommentWhenBasicCompletionInvokesThenItSuggestsDeclaredSpecificationIds() { + addTargetDeclaration(); + myFixture.configureByText("project.xml", ""); + + myFixture.completeBasic(); + + assertThat(lookupStrings(), hasItem("dsn~coverage-target~1")); + } + public void testGivenCoverageTagTargetInNewTagImporterExtensionWhenBasicCompletionInvokesThenItSuggestsDeclaredSpecificationIds() { addTargetDeclaration(); myFixture.configureByText("suite.robot", "# " + tagTarget("dsn~coverage-target"));