Skip to content

Commit 55f2aad

Browse files
committed
fix(unify,release): use compiler diagnostics for unused-dep removals and
harden release preflight - add compiler diagnostics collection/storage for source-level unused dependency detection - evaluate target cfgs via rustc-provided cfg sets (remove heuristic target matching) - require complete diagnostics per required target before auto-removing dependencies - add diagnostics cache model/store with robust invalidation inputs (rustc/env/cargo config/manifest/source/lock) - add `unify.compiler_diag_cache` config support across schema/builder/config/docs - ensure `cargo rail clean` removes compiler diagnostics cache artifacts - add release safeguards and workflow guard updates for cleaner release runs - add integration/unit coverage for clean, config, release, and unused-dependency flows
1 parent 3f559e2 commit 55f2aad

22 files changed

Lines changed: 1626 additions & 309 deletions

.github/workflows/commit.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ jobs:
3232
# ==========================================================================
3333
plan:
3434
name: Plan
35+
if: github.event_name != 'push' || !startsWith(github.event.head_commit.message, 'chore(release):')
3536
runs-on: ubuntu-latest
3637
outputs:
3738
build: ${{ steps.plan.outputs.build }}

docs/config.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ targets = [
5858
msrv = true # Compute MSRV from dependencies
5959
prune_dead_features = true # Remove unused features
6060
detect_unused = true # Find unused dependencies
61+
compiler_diag_cache = true # Reuse rustc diagnostics across runs
6162
remove_unused = true # Auto-remove them
6263

6364
[release]
@@ -107,6 +108,7 @@ Controls workspace dependency unification behavior. All options are optional wit
107108
| `enforce_msrv_inheritance` | `bool` | `false` | Ensure every workspace member inherits MSRV by setting `[package].rust-version = { workspace = true }` in each member's `Cargo.toml`. This makes `[workspace.package].rust-version` actually apply across the workspace. |
108109
| `msrv_source` | `enum` | `"max"` | How to compute the final MSRV:<br>• `"deps"` - Use maximum from dependencies only (original behavior)<br>• `"workspace"` - Preserve existing rust-version, warn if deps need higher<br>• `"max"` - Take max(workspace, deps) - your explicit setting wins if higher |
109110
| `detect_unused` | `bool` | `true` | Detect unused dependencies using two signals: (1) declared deps absent from the resolved cargo graph, and (2) rustc `unused_crate_dependencies` diagnostics for deps that resolve but are never referenced in source. Optional deps and deps behind unconfigured target constraints are conservatively skipped. |
111+
| `compiler_diag_cache` | `bool` | `true` | Cache target-aware rustc `unused_crate_dependencies` diagnostics in `target/cargo-rail/cache/compiler-diags-v1.json` and reuse them across runs. Disable to force fresh compiler checks each run. |
110112
| `remove_unused` | `bool` | `true` | Automatically remove unused dependencies during unification. Requires `detect_unused = true`. |
111113
| `prune_dead_features` | `bool` | `true` | Remove features that are never enabled in the resolved dependency graph across all targets. Only prunes empty no-ops (`feature = []`). Features with actual dependencies are preserved. |
112114
| `preserve_features` | `string[]` | `[]` | Features to preserve from dead feature pruning. Supports glob patterns (e.g., `"unstable-*"`, `"bench*"`). Use this to keep features intended for future use or external consumers. |
@@ -123,6 +125,7 @@ msrv = true
123125
msrv_source = "max" # "deps" | "workspace" | "max"
124126
enforce_msrv_inheritance = false
125127
detect_unused = true
128+
compiler_diag_cache = true
126129
remove_unused = true
127130
prune_dead_features = true
128131
preserve_features = ["future-api", "unstable-*"] # Keep these from pruning
@@ -202,6 +205,7 @@ msrv = true
202205
msrv_source = "max" # "deps" | "workspace" | "max"
203206
enforce_msrv_inheritance = false
204207
detect_unused = true
208+
compiler_diag_cache = true
205209
remove_unused = true
206210
prune_dead_features = true
207211
preserve_features = [] # Glob patterns to preserve from pruning
@@ -260,6 +264,7 @@ sign_tags = true
260264
| `changelog_relative_to` | `enum` | `"crate"` | What changelog paths are relative to:<br>• `"crate"` - Relative to each crate's directory<br>• `"workspace"` - Relative to workspace root |
261265
| `skip_changelog_for` | `string[]` | `[]` | Crate names that should not generate changelog entries. |
262266
| `require_changelog_entries` | `bool` | `false` | If `true`, error when there are no changelog entries for a crate being released. |
267+
| `require_release_notes` | `bool` | `true` | If `true`, preflight fails release apply when the target version has no release notes (`## [<version>]`) and changelog generation produces no entries. Set to `false` to allow note-less releases. |
263268

264269
**Example:**
265270

@@ -288,6 +293,7 @@ changelog_path = "CHANGELOG.md"
288293
changelog_relative_to = "crate"
289294
skip_changelog_for = []
290295
require_changelog_entries = false
296+
require_release_notes = true
291297
```
292298

293299
**Notes:**
@@ -668,6 +674,7 @@ msrv = true
668674
msrv_source = "max" # "deps" | "workspace" | "max"
669675
enforce_msrv_inheritance = false
670676
detect_unused = true
677+
compiler_diag_cache = true
671678
remove_unused = true
672679
prune_dead_features = true
673680
preserve_features = [] # Glob patterns: ["unstable-*", "future-api"]
@@ -705,6 +712,7 @@ changelog_path = "CHANGELOG.md"
705712
changelog_relative_to = "crate"
706713
skip_changelog_for = []
707714
require_changelog_entries = true
715+
require_release_notes = true
708716
709717
# Change detection
710718
[change-detection]
@@ -824,6 +832,7 @@ targets = ["x86_64-unknown-linux-gnu"]
824832
pin_transitives = true
825833
msrv = true
826834
detect_unused = true
835+
compiler_diag_cache = true
827836
remove_unused = true
828837
prune_dead_features = true
829838
@@ -832,6 +841,7 @@ tag_prefix = "v"
832841
tag_format = "{crate}-{prefix}{version}"
833842
require_clean = true
834843
require_changelog_entries = true
844+
require_release_notes = true
835845
create_github_release = true
836846
sign_tags = true
837847
@@ -953,6 +963,7 @@ cargo-rail provides similar functionality with tighter integration:
953963
[release]
954964
tag_format = "{crate}-{prefix}{version}"
955965
require_changelog_entries = true
966+
require_release_notes = true
956967
create_github_release = true
957968
```
958969

0 commit comments

Comments
 (0)