diffplug / diffplug/spotless

versionCatalog() silently deletes standalone comments at section boundaries and EOF

Geschlossen
#3,048 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Java
Sterne
5.6k
Forks
559
Ø Merge
1 T. 14 Std.
Gemergte PRs (30 T.)
43

Beschreibung

## Summary

`versionCatalog()` silently deletes standalone comments when they are either:

1. between the final entry of one table and the next table header, or
2. after the final entry at end of file.

The formatting task succeeds, so these comments are removed without an error or lint. This reproduces with the released Spotless Gradle plugin 8.10.2 and at commit `cd8b6e2b4532f6533bd78c0d0ffec8ee37cae0e6` (the merge commit for #3042).

## Environment

- Gradle: 9.7.1
- Spotless Gradle plugin: 8.10.2
- Also reproduced at commit: `cd8b6e2b4532f6533bd78c0d0ffec8ee37cae0e6` (the merge commit for #3042)
- OS: Windows 11 10.0 amd64
- JVM: 21.0.8

## Spotless configuration

```groovy
plugins {
id 'com.diffplug.spotless' version '8.10.2'
}

spotless {
toml {
target 'gradle/libs.versions.toml'
versionCatalog()
}
}
```

## Input

`gradle/libs.versions.toml`:

```toml
[versions]
zoo = "1.0"
# keep this trailing comment

[libraries]
foo = { module = "g:a", version.ref = "zoo" }
# keep this final comment
```

## Steps to reproduce

```shell
./gradlew spotlessApply --stacktrace
```

## Actual output file

```toml
[versions]
zoo = "1.0"

[libraries]
foo = { module = "g:a", version.ref = "zoo" }
```

Both comments are removed.

## Expected output

Both comments should be preserved. Their exact attachment to the preceding table or following header is less important than avoiding data loss.

## Console output

There is no error or lint. The task reports success:

```text
> Task :spotlessToml
> Task :spotlessTomlApply
> Task :spotlessApply

BUILD SUCCESSFUL in 20s
2 actionable tasks: 2 executed
```

The released-plugin reproduction above was run as a minimal Gradle project using version 8.10.2. The commit-level reproduction was verified separately with local JUnit tests which call `VersionCatalogStep.create()` through `StepHarness` using the same section-boundary and EOF inputs; it was not run through a source-built Gradle plugin.

## Suspected cause

`VersionCatalogStep.parseSections()` stores standalone comments in `pendingComments`, but only attaches them when a later entry is parsed. A new table header clears `pendingComments`, and pending comments are not flushed at EOF:

https://github.com/diffplug/spotless/blob/cd8b6e2b4532f6533bd78c0d0ffec8ee37cae0e6/lib/src/main/java/com/diffplug/spotless/toml/VersionCatalogStep.java#L127-L168

#3042 fixed other comment/quote-related data-loss cases, but these section-boundary and EOF cases remain reproducible at commit `cd8b6e2b4532f6533bd78c0d0ffec8ee37cae0e6` after that change.

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne in lib/src/main/java/com/diffplug/spotless/toml/VersionCatalogStep.java, insbesondere bei parseSections() und der Verarbeitung von pendingComments. Reproduziere die Fälle an Abschnittsgrenzen und am EOF mit den lokalen JUnit-Tests, die VersionCatalogStep.create() über StepHarness aufrufen. Als abgeschlossen gilt die Aufgabe, wenn eigenständige Kommentare an beiden Positionen die Formatierung ohne Fehler oder Datenverlust überstehen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
java
Bereich
build-system
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Aktiv
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
78/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.