Open nikomatsakis opened 4 months ago
This issue is intended for status updates only.
For general questions or comments, please contact the owner(s) directly.
Status update as of September 1.
Key developments: We've laid a lot of the groundwork to make manifest linting possible.
Not blocked on anything. No opportunities to contribute yet, but stay tuned — there will be some in future updates!
Status update as of September 17.
Key developments: Working prototype of manifest querying.
WIP branch here: https://github.com/obi1kenobi/trustfall-rustdoc-adapter/compare/manifest_querying
An example SemVer lint this enables would be: "a non-nightly
, non-underscore-prefixed feature has been removed from the package between releases."
{
CrateDiff {
baseline {
feature {
feature: name
@filter(op: "!=", value: ["$nightly"])
@tag
@output
}
}
current {
feature @fold @transform(op: "count") @filter(op: "=", value: ["$zero"]) {
name @filter(op: "=", value: ["%feature"])
}
}
}
}
# args:
{
"nightly": "nightly",
"zero": 0
}
This is SemVer-major because it'll break uses like: my_dep = { version = "1.0", features = ["removed_feature"] }
. We're ignoring any features named nightly
because community consensus is that such features are unstable — I'll do some more research on other expected-unstable feature patterns in the community before we ship any lints around this.
Not blocked on anything. No opportunities to contribute yet, but stay tuned — there will be some in future updates!
No major updates to report. Preparing my talk for next week's EuroRust has taken away most of my free time.
Key developments:
The schema we use for writing lints now contains information on:
This newly allows the implementation of breaking-change lints such as "generic const parameter no longer has default value" or "trait bound removed from generic parameter in trait method."
Additionally, @suaviloquence has implemented the ability to print rustdoc JSON type information into human-readable source code form, which will allow us to produce higher-quality diagnostics for type-related breaking changes. This required a lot of care, perseverance, and testing — thank you 🙏
For a long time, cross-crate checking was blocked on a multi-team coordination problem: cargo-semver-checks needs more data from rustdoc, which in turn needs more data from rustc. This was a classic "everyone's third-most important thing" problem: important, but not critical and therefore never top of the agenda for resolving the open questions there.
In-person meetings with Rust Project members during my trips to RustConf and EuroRust helped nudge this forward:
Plumbing in manifest information was proving challenging due to a significant amount of tech debt accrued in the cargo-semver-checks code that loads the data of scanned crates. This PR is a significant clean-up and refactor of that portion of the tool, allowing us to move forward with retrieving manifest information while also supporting other quality-of-life improvements.
With the mountain of tech debt largely resolved, I expect that adding manifest information should be relatively straightforward from here.
This portion of the goal also greatly benefited from the Google Summer of Code work that @suaviloquence did — it wouldn't have been possible without the significant effort he put into improving our test suites and harnesses.
Key developments:
As a recap, the idea here is catching breakage caused by manifest (Cargo.toml
) changes, not just source code changes.
An example of such breakage is the removal of a package feature: any crates that enabled the removed feature will no longer build.
The PR above builds upon the data-handling refactor from the previous update post, and makes it possible to lint manifests for breaking changes. The PR includes the feature_missing
lint that checks for the exact case mentioned above. That is but one of many new lints that are now possible with this feature. Hooray! 🎉
Summary
Design and implement
cargo-semver-checks
functionality that lies on the critical path for merging the tool into cargo itself.Tasks and status