fix(pacquet): refresh lockfile when catalogs change#12382
Conversation
📝 WalkthroughWalkthroughThe PR extends lockfile and optimistic repeat-install freshness checks to detect when workspace catalog configurations change. It adds a new ChangesCatalog Freshness in Lockfile and Repeat Install
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Micro-Benchmark ResultsLinux |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #12382 +/- ##
==========================================
+ Coverage 88.26% 88.29% +0.03%
==========================================
Files 297 297
Lines 38705 38796 +91
==========================================
+ Hits 34164 34256 +92
+ Misses 4541 4540 -1 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Code Review by Qodo
1. Catalog drift not checked
|
PR Summary by QodoFix pacquet lockfile freshness when workspace catalogs change WalkthroughsDescription• Detect catalog drift between pnpm-workspace.yaml and pnpm-lock.yaml snapshots. • Persist catalogs in workspace-state to avoid skipping installs after catalog edits. • Add regression tests covering lockfile, repeat-install, and CLI behavior. Diagramgraph TD
W["pnpm-workspace.yaml"] --> R["Repeat-install check"] --> D{"Skip install?"}
S["workspace-state.json"] --> R
D -->|"UpToDate"| U["Exit early"]
D -->|"Run install"| F["Full install"] --> L["pnpm-lock.yaml"] --> C["Lockfile settings check"]
W --> C
F --> S
subgraph Legend
direction LR
_file["File"] ~~~ _proc["Process"] ~~~ _dec{"Decision"}
end
High-Level AssessmentThe following are alternative approaches to this PR: 1. Invalidate repeat-install on `pnpm-workspace.yaml` mtime change
2. Store a catalogs checksum instead of full JSON in workspace-state
Recommendation: The PR’s approach is the best fit: it mirrors pnpm’s split behavior (catalogs ignored in generic settings loop but checked explicitly for workspace installs), while also extending the lockfile settings drift check to include the lockfile’s File ChangesBug fix (3)
Tests (4)
Other (1)
|
|
Code review by qodo was updated up to the latest commit 86f5df4 |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
pacquet/crates/lockfile/src/freshness/tests.rs (1)
600-685: 💤 Low valueOptional: Consider adding a test for the "config adds new catalog entry" scenario.
The current tests cover the core scenarios well. To make the asymmetric ignore behavior more explicit, consider adding a test where:
- Lockfile has
catalogs.default.react: ^18.2.0- Config has both
react: ^18.2.0ANDvue: ^3.0.0(new entry)- Assert: check passes (new config entries not in snapshot are ignored)
This would document the behavior that removing snapshot entries triggers drift (test at line 670) but adding new config entries does not.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@pacquet/crates/lockfile/src/freshness/tests.rs` around lines 600 - 685, Add a new unit test to document that new catalog entries present in the config but absent from the lockfile snapshot are ignored: create a test (e.g., check_settings_ignores_new_catalog_entries_in_config) that parses a Lockfile containing catalogs.default.react specifier ^18.2.0, builds a Catalogs via Catalogs::from with both "react": "^18.2.0" and a new "vue": "^3.0.0", and assert that check_lockfile_settings_with_catalogs(&lockfile, settings_check(&catalogs)).is_ok(); use the same helper functions and types shown (Lockfile parsing, Catalogs::from, settings_check, check_lockfile_settings_with_catalogs) so the test mirrors the existing patterns.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@pacquet/crates/lockfile/src/freshness/tests.rs`:
- Around line 600-685: Add a new unit test to document that new catalog entries
present in the config but absent from the lockfile snapshot are ignored: create
a test (e.g., check_settings_ignores_new_catalog_entries_in_config) that parses
a Lockfile containing catalogs.default.react specifier ^18.2.0, builds a
Catalogs via Catalogs::from with both "react": "^18.2.0" and a new "vue":
"^3.0.0", and assert that check_lockfile_settings_with_catalogs(&lockfile,
settings_check(&catalogs)).is_ok(); use the same helper functions and types
shown (Lockfile parsing, Catalogs::from, settings_check,
check_lockfile_settings_with_catalogs) so the test mirrors the existing
patterns.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 0fa8ceb8-c912-404b-947c-69b376dea99b
⛔ Files ignored due to path filters (1)
Cargo.lockis excluded by!**/*.lock
📒 Files selected for processing (8)
pacquet/crates/cli/tests/catalog.rspacquet/crates/lockfile/Cargo.tomlpacquet/crates/lockfile/src/freshness.rspacquet/crates/lockfile/src/freshness/tests.rspacquet/crates/package-manager/src/install.rspacquet/crates/package-manager/src/install/tests.rspacquet/crates/package-manager/src/optimistic_repeat_install.rspacquet/crates/package-manager/src/optimistic_repeat_install/tests.rs
✅ Files skipped from review due to trivial changes (1)
- pacquet/crates/lockfile/Cargo.toml
🚧 Files skipped from review as they are similar to previous changes (6)
- pacquet/crates/package-manager/src/install/tests.rs
- pacquet/crates/cli/tests/catalog.rs
- pacquet/crates/lockfile/src/freshness.rs
- pacquet/crates/package-manager/src/optimistic_repeat_install.rs
- pacquet/crates/package-manager/src/install.rs
- pacquet/crates/package-manager/src/optimistic_repeat_install/tests.rs
📜 Review details
🧰 Additional context used
📓 Path-based instructions (1)
pacquet/**/*.rs
📄 CodeRabbit inference engine (pacquet/AGENTS.md)
pacquet/**/*.rs: Log emissions are part of matching pnpm — when porting a function that firespnpm:<channel>events throughglobalLogger,logger.debug(...), orstreamParser.write(...), mirror the call site, payload, and ordering so@pnpm/cli.default-reporterparses pacquet's NDJSON the same way
Declare a newtype wrapper for branded string types instead of collapsing the brand into a plainStringor&strin Rust
If upstream TypeScript always validates before construction of a branded string, validate in the Rust wrapper too viaTryFrom<String>and/orFromStrand do not provide an infallible public constructor
If upstream TypeScript never validates a branded string, just brand for type-safety in Rust by exposing an infallibleFrom<String>constructor
If upstream TypeScript occasionally constructs a branded string without validation, exposefrom_str_uncheckedin Rust as an escape hatch alongside the validating constructor
Match upstream serde behavior for branded strings crossing JSON, YAML, or INI boundaries by using#[serde(try_from = "String")]for deserialization and#[serde(into = "String")]for serialization
Derive simple conversions for branded strings using#[derive(derive_more::From)]and#[derive(derive_more::Into)]instead of handwritingimplblocks; use manualimplonly when conversion needs custom logic
Model TypeScript string literal unions (like'auto' | 'always' | 'never') as Rustenums instead of newtype wrappers, since the set of valid values is closed
Treat TypeScript string template literal types (like`${string}@${string}`) the same as branded string types in Rust, using a newtype wrapper with validation
Follow the code style guide inCODE_STYLE_GUIDE.md— imports, modules, naming, ownership and borrowing, parameter type selection, trait bounds, pattern matching,pipe-trait, error handling, test layout, and cloning ofArcandRc
Choose owned vs. borrowed parameters to minimize copies; widen to t...
Files:
pacquet/crates/lockfile/src/freshness/tests.rs
🧠 Learnings (6)
📚 Learning: 2026-05-20T19:40:55.051Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 11774
File: pacquet/crates/resolving-deps-resolver/src/resolve_peers.rs:0-0
Timestamp: 2026-05-20T19:40:55.051Z
Learning: In the pacquet Rust code, ensure the semver implementation uses the `node-semver` crate (not `nodejs-semver`). `node-semver`’s public API does not include a `satisfies_with_prerelease`-style method; prerelease-tolerant matching should be implemented inline by first calling `Range::satisfies`, and when it rejects a prerelease version, retry matching against a stripped `MAJOR.MINOR.PATCH` base of the prerelease version.
Applied to files:
pacquet/crates/lockfile/src/freshness/tests.rs
📚 Learning: 2026-05-22T00:08:44.646Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 11837
File: pacquet/crates/resolving-npm-resolver/src/pick_package.rs:33-51
Timestamp: 2026-05-22T00:08:44.646Z
Learning: In the pnpm/pnpm repo’s pacquet Rust crates, do not flag Unicode ellipsis characters (U+2026, `…`) in Rust doc comments (`///` / `/** */`) as a lint violation. The pacquet crate’s `dylint.toml` only enables `perfectionist::derive_ordering`, and the Dylint `unicode-ellipsis` rule is not enabled for this project—so `…` in doc comments is an intentional, repo-consistent style.
Applied to files:
pacquet/crates/lockfile/src/freshness/tests.rs
📚 Learning: 2026-05-20T23:07:58.444Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 11784
File: pacquet/crates/resolving-deps-resolver/src/hoist_peers.rs:120-133
Timestamp: 2026-05-20T23:07:58.444Z
Learning: When reviewing code in this pacquet Rust port, follow the upstream pnpm compatibility rule: only match pnpm’s behavior exactly. Do not propose review changes that intentionally deviate from pnpm’s documented/observed behavior, even if pnpm appears buggy. If you identify a real bug in pnpm behavior, the review should prioritize fixing it upstream in pnpm first, and avoid implementing a pnpm-behavior workaround here unless the same fix has already landed upstream.
Applied to files:
pacquet/crates/lockfile/src/freshness/tests.rs
📚 Learning: 2026-05-20T23:23:40.606Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 11788
File: pacquet/crates/lockfile/src/snapshot_dep_ref.rs:52-56
Timestamp: 2026-05-20T23:23:40.606Z
Learning: In the pacquet lockfile crate, the link target is intentionally represented as a raw `Link(String)` (not a `LinkTarget` newtype) for both `SnapshotDepRef::Link` and `ImporterDepVersion::Link`. pnpm upstream preserves `link:` targets verbatim with only a prefix check (e.g., `refToRelative`), so do not suggest introducing a `LinkTarget` newtype in a bug-fix/targeted PR. If type branding is ever desired, it should be done together for both variants in a separate dedicated refactor PR rather than as part of a small fix.
Applied to files:
pacquet/crates/lockfile/src/freshness/tests.rs
📚 Learning: 2026-06-06T18:58:37.156Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 12243
File: pacquet/crates/package-manager/src/install_package_by_snapshot.rs:319-322
Timestamp: 2026-06-06T18:58:37.156Z
Learning: When reviewing Rust code, do not assume `matches!(expr, Pattern(_))` will move out of `expr` if `Pattern(_)` contains no by-value bindings. `matches!` desugars to a `match` that auto-borrows the scrutinee for discrimination, so even if `expr` is a non-`Copy` value behind a shared reference (e.g., `&T`), the macro should not move-out of the borrowed data purely due to `matches!`. Treat `matches!(&expr, Pattern(_))` as a readability/clarity improvement, not a correctness requirement. Only flag potential move-out-of-borrow risks when the pattern includes by-value bindings that would require moving the matched value.
Applied to files:
pacquet/crates/lockfile/src/freshness/tests.rs
📚 Learning: 2026-06-12T20:41:57.558Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 12364
File: pacquet/crates/package-manager/src/install/tests.rs:5717-5717
Timestamp: 2026-06-12T20:41:57.558Z
Learning: In the pnpm/pnpm Rust workspace (toolchain Rust 1.95.0), keep using `std::time::Duration::from_mins(...)` and `std::time::Duration::from_hours(...)` as-is. Do not flag these as invalid or suggest replacing them with `Duration::from_secs(...)`, because Clippy’s `clippy::duration_suboptimal_units` lint is denied by `-D warnings` in CI, and changing to seconds may trigger CI failures.
Applied to files:
pacquet/crates/lockfile/src/freshness/tests.rs
🔇 Additional comments (6)
pacquet/crates/lockfile/src/freshness/tests.rs (6)
1-11: LGTM!
25-35: LGTM!
605-621: LGTM!
623-634: LGTM!
636-668: LGTM!
670-685: LGTM!
Integrated-Benchmark Report (Linux)Each scenario reports direct installs and pnpr installs. Bencher consumes pacquet@HEAD and pnpr@HEAD. Scenario: Isolated linker: fresh restore, cold cache + cold store
BENCHMARK_REPORT.json{
"results": [
{
"command": "pacquet@HEAD",
"mean": 3.9657185697800004,
"stddev": 0.10346409625851508,
"median": 3.9615679901800003,
"user": 3.8502562399999993,
"system": 3.3206070399999996,
"min": 3.80513191218,
"max": 4.09805198018,
"times": [
4.001287645180001,
3.87244465018,
4.09805198018,
4.06736636818,
4.06765935418,
3.90919503718,
4.04952781618,
3.86467259918,
3.92184833518,
3.80513191218
]
},
{
"command": "pacquet@main",
"mean": 3.9350989522799997,
"stddev": 0.11687072020525434,
"median": 3.89110322368,
"user": 3.8548601399999995,
"system": 3.32639574,
"min": 3.8181279511799997,
"max": 4.19870979918,
"times": [
3.95469144018,
3.8451905051799997,
3.88349559418,
3.8181279511799997,
3.87419312218,
4.0598056191800005,
3.89871085318,
3.85123358618,
3.96683105218,
4.19870979918
]
},
{
"command": "pnpr@HEAD",
"mean": 2.15323049838,
"stddev": 0.1300570446960446,
"median": 2.11803487568,
"user": 2.69140654,
"system": 2.8389105399999996,
"min": 1.9753972191800002,
"max": 2.3363762541799997,
"times": [
2.04275734818,
2.29023387218,
2.08665364318,
2.3363762541799997,
2.1494161081799996,
2.07349376618,
2.33387510118,
2.04887146518,
2.1952302061799998,
1.9753972191800002
]
},
{
"command": "pnpr@main",
"mean": 2.09635932008,
"stddev": 0.14501334313705147,
"median": 2.07147621668,
"user": 2.6997371400000003,
"system": 2.85464654,
"min": 1.9223052611800002,
"max": 2.37142347518,
"times": [
1.9780548631800001,
1.99425576118,
2.0654982601799996,
2.37142347518,
2.07745417318,
1.9624107001800002,
1.9223052611800002,
2.1199442341799997,
2.23419372118,
2.2380527511799997
]
}
]
}Scenario: Isolated linker: fresh restore, hot cache + hot store
BENCHMARK_REPORT.json{
"results": [
{
"command": "pacquet@HEAD",
"mean": 0.61148069272,
"stddev": 0.01132089162990104,
"median": 0.6088791797200002,
"user": 0.35889622,
"system": 1.28113324,
"min": 0.5953892412200001,
"max": 0.62742775122,
"times": [
0.6110896262200001,
0.6066687332200001,
0.6231385992200001,
0.6273518812200001,
0.6020147402200001,
0.5953892412200001,
0.61406552422,
0.6010222662200001,
0.62742775122,
0.6066385642200001
]
},
{
"command": "pacquet@main",
"mean": 0.60606739532,
"stddev": 0.006144617325348355,
"median": 0.6066993412200001,
"user": 0.36455782000000003,
"system": 1.27665754,
"min": 0.5933516132200001,
"max": 0.61396769922,
"times": [
0.60535623522,
0.6023680252200001,
0.6111672972200001,
0.6118132072200001,
0.6080424472200001,
0.5933516132200001,
0.6023616822200001,
0.6025981572200001,
0.6096475892200001,
0.61396769922
]
},
{
"command": "pnpr@HEAD",
"mean": 0.6706269073200002,
"stddev": 0.016629044193292742,
"median": 0.6692184697200001,
"user": 0.37930402,
"system": 1.3222870400000002,
"min": 0.64608426222,
"max": 0.7108020572200001,
"times": [
0.7108020572200001,
0.6606802962200001,
0.6706987002200001,
0.64608426222,
0.6716513882200001,
0.66090667422,
0.66701394022,
0.67778778922,
0.6677382392200001,
0.6729057262200001
]
},
{
"command": "pnpr@main",
"mean": 0.6652952737200001,
"stddev": 0.02957553679851492,
"median": 0.6638885687200001,
"user": 0.3771773199999999,
"system": 1.30921054,
"min": 0.6314390232200001,
"max": 0.7398829682200001,
"times": [
0.6627697562200001,
0.6712388022200001,
0.6712301702200001,
0.6314390232200001,
0.6650073812200001,
0.6479569422200001,
0.6459192302200001,
0.6460221342200001,
0.6714863292200001,
0.7398829682200001
]
}
]
}Scenario: Isolated linker: fresh install, cold cache + cold store
BENCHMARK_REPORT.json{
"results": [
{
"command": "pacquet@HEAD",
"mean": 4.16861883246,
"stddev": 0.05144368238332586,
"median": 4.18457853446,
"user": 3.7775097200000003,
"system": 3.247822899999999,
"min": 4.09097077496,
"max": 4.21763142796,
"times": [
4.09576459296,
4.20827347096,
4.20682037096,
4.10308435996,
4.1817878769600005,
4.09097077496,
4.18008852096,
4.21763142796,
4.2143977369600005,
4.18736919196
]
},
{
"command": "pacquet@main",
"mean": 4.176426306160001,
"stddev": 0.037006365430495916,
"median": 4.18275748146,
"user": 3.79602852,
"system": 3.2577073,
"min": 4.1137147699600005,
"max": 4.23778386796,
"times": [
4.1793137949600005,
4.23778386796,
4.18674585696,
4.16197423096,
4.18620116796,
4.15761263396,
4.1137147699600005,
4.12991496996,
4.20495747196,
4.20604429696
]
},
{
"command": "pnpr@HEAD",
"mean": 2.18388616886,
"stddev": 0.12259543863925924,
"median": 2.19728011846,
"user": 2.53801542,
"system": 2.7644962,
"min": 1.98995014896,
"max": 2.33824630296,
"times": [
2.01246834196,
2.2722193009600002,
2.2583632059600003,
2.1187744039600003,
2.33824630296,
2.27586478696,
2.1355032079600003,
2.13619703096,
2.30127495796,
1.98995014896
]
},
{
"command": "pnpr@main",
"mean": 2.16924271416,
"stddev": 0.13054323744733323,
"median": 2.14679437396,
"user": 2.5686706200000002,
"system": 2.7669571,
"min": 2.00460984396,
"max": 2.4112114899600003,
"times": [
2.2113565469600003,
2.03433235596,
2.23048847096,
2.4112114899600003,
2.00460984396,
2.04700323996,
2.3314899329600003,
2.15172055396,
2.14186819396,
2.1283465129600003
]
}
]
}Scenario: Isolated linker: fresh install, hot cache + hot store
BENCHMARK_REPORT.json{
"results": [
{
"command": "pacquet@HEAD",
"mean": 1.3484204780000002,
"stddev": 0.036140543457678774,
"median": 1.3356384697,
"user": 1.33344036,
"system": 1.6922674200000003,
"min": 1.3108149712000001,
"max": 1.4357113642000001,
"times": [
1.3241721362,
1.3282551302,
1.3387417152,
1.4357113642000001,
1.3743433812,
1.3444380282000001,
1.3325352242000001,
1.3661910232,
1.3290018062000002,
1.3108149712000001
]
},
{
"command": "pacquet@main",
"mean": 1.3870855763,
"stddev": 0.053704544946753,
"median": 1.3662539262000002,
"user": 1.35642546,
"system": 1.7238543199999998,
"min": 1.3460368412000001,
"max": 1.5288942602000002,
"times": [
1.3460368412000001,
1.5288942602000002,
1.4117613002,
1.3630933522000002,
1.3624715272,
1.3694145002000002,
1.3939085752,
1.3838288652000001,
1.3599610432,
1.3514854982000002
]
},
{
"command": "pnpr@HEAD",
"mean": 0.6399357395,
"stddev": 0.008519082020001737,
"median": 0.6378907572000001,
"user": 0.32239455999999994,
"system": 1.25342702,
"min": 0.6281491902,
"max": 0.6585410372,
"times": [
0.6281491902,
0.6382460612,
0.6375354532,
0.6367786062,
0.6463704612000001,
0.6402347422,
0.6457802042,
0.6340140952000001,
0.6337075442,
0.6585410372
]
},
{
"command": "pnpr@main",
"mean": 0.6416583,
"stddev": 0.010329244588443254,
"median": 0.6423891397000001,
"user": 0.33183216,
"system": 1.2502074200000002,
"min": 0.6284170572000001,
"max": 0.6655115222,
"times": [
0.6412195612,
0.6423272962000001,
0.6432532872000001,
0.6424509832,
0.6655115222,
0.6358940712000001,
0.6288553162,
0.6437209812,
0.6284170572000001,
0.6449329242
]
}
]
}Scenario: Isolated linker: fresh install, cold cache + hot store
BENCHMARK_REPORT.json{
"results": [
{
"command": "pacquet@HEAD",
"mean": 3.0383262291,
"stddev": 0.03753261558143003,
"median": 3.0315685708,
"user": 1.7823595399999999,
"system": 1.9688726200000002,
"min": 2.9846095283,
"max": 3.1182121403000003,
"times": [
3.0293352963,
2.9846095283,
2.9988832693000003,
3.0562256003,
3.0243706863,
3.0201515533000003,
3.1182121403000003,
3.0530397133,
3.0338018453,
3.0646326583000003
]
},
{
"command": "pacquet@main",
"mean": 3.0682329483,
"stddev": 0.03349267088811908,
"median": 3.0633140718,
"user": 1.78204174,
"system": 2.04864462,
"min": 3.0209045733,
"max": 3.1269539233,
"times": [
3.0447651713,
3.0562034683,
3.0595460303,
3.0209045733,
3.0670821133,
3.0356787293000003,
3.0859779773000002,
3.1269539233,
3.0694522303,
3.1157652663
]
},
{
"command": "pnpr@HEAD",
"mean": 0.64493435,
"stddev": 0.008298119291685602,
"median": 0.6444765093,
"user": 0.32713133999999994,
"system": 1.26726082,
"min": 0.6320179553,
"max": 0.6612066513,
"times": [
0.6438473193,
0.6612066513,
0.6320179553,
0.6485067023,
0.6387423823,
0.6452030103,
0.6372251723,
0.6446893493,
0.6442636693,
0.6536412883
]
},
{
"command": "pnpr@main",
"mean": 0.6578822008,
"stddev": 0.024167365784456437,
"median": 0.6545143693,
"user": 0.32859604,
"system": 1.27033242,
"min": 0.6383614623,
"max": 0.7238320613,
"times": [
0.6436459043,
0.6544258723,
0.6454185513,
0.6582933213,
0.6554007853,
0.6461193593,
0.6383614623,
0.6546028663,
0.7238320613,
0.6587218243
]
}
]
} |
|
| Branch | pr/12382 |
| Testbed | pacquet |
Click to view all benchmark results
| Benchmark | Latency | Benchmark Result milliseconds (ms) (Result Δ%) | Upper Boundary milliseconds (ms) (Limit %) |
|---|---|---|---|
| isolated-linker.fresh-install.cold-cache.cold-store | 📈 view plot 🚷 view threshold | 4,168.62 ms(-13.03%)Baseline: 4,792.91 ms | 5,751.49 ms (72.48%) |
| isolated-linker.fresh-install.cold-cache.hot-store | 📈 view plot 🚷 view threshold | 3,038.33 ms(-1.32%)Baseline: 3,078.83 ms | 3,694.60 ms (82.24%) |
| isolated-linker.fresh-install.hot-cache.hot-store | 📈 view plot 🚷 view threshold | 1,348.42 ms(+13.74%)Baseline: 1,185.51 ms | 1,422.61 ms (94.78%) |
| isolated-linker.fresh-restore.cold-cache.cold-store | 📈 view plot 🚷 view threshold | 3,965.72 ms(-23.66%)Baseline: 5,194.56 ms | 6,233.48 ms (63.62%) |
| isolated-linker.fresh-restore.hot-cache.hot-store | 📈 view plot 🚷 view threshold | 611.48 ms(-6.46%)Baseline: 653.68 ms | 784.41 ms (77.95%) |
|
| Branch | pr/12382 |
| Testbed | pnpr |
⚠️ WARNING: No Threshold found!Without a Threshold, no Alerts will ever be generated.
Click here to create a new Threshold
For more information, see the Threshold documentation.
To only post results if a Threshold exists, set the--ci-only-thresholdsflag.
Click to view all benchmark results
| Benchmark | Latency | milliseconds (ms) |
|---|---|---|
| isolated-linker.fresh-install.cold-cache.cold-store | 📈 view plot | 2,183.89 ms |
| isolated-linker.fresh-install.cold-cache.hot-store | 📈 view plot | 644.93 ms |
| isolated-linker.fresh-install.hot-cache.hot-store | 📈 view plot | 639.94 ms |
| isolated-linker.fresh-restore.cold-cache.cold-store | 📈 view plot | 2,153.23 ms |
| isolated-linker.fresh-restore.hot-cache.hot-store | 📈 view plot | 670.63 ms |
The catalog-registry-range test reaches catalogs_cache_matches now that the workspace state records catalogs (pnpm#12382). Stamp the state with the test's catalogs so the cache comparison passes and the spec deref is what gets exercised, not the catalogs-outdated bail.
The catalog-registry-range test reaches catalogs_cache_matches now that the workspace state records catalogs (pnpm#12382). Stamp the state with the test's catalogs so the cache comparison passes and the spec deref is what gets exercised, not the catalogs-outdated bail.
The catalog-registry-range test reaches catalogs_cache_matches now that the workspace state records catalogs (pnpm#12382). Stamp the state with the test's catalogs so the cache comparison passes and the spec deref is what gets exercised, not the catalogs-outdated bail.
Summary
pnpm-workspace.yamland the lockfilecatalogs:snapshotpacquet installdoes not skip after catalog editsTests
cargo test -p pacquet-lockfile check_settings_cargo test -p pacquet-package-manager returns_outdated_when_workspace_catalog_cache_changescargo test -p pacquet-cli --test catalog install_reruns_when_catalog_entry_changescargo test -p pacquet-package-manager returns_up_to_date_when_state_carries_unported_pnpm_settingscargo test -p pacquet-package-manager build_workspace_state_testscargo check --locked -p pacquet-lockfile -p pacquet-package-manager -p pacquet-cli --all-targetsNo changeset: pacquet Rust-only change.
Written by an agent (Codex, GPT-5).
Summary by CodeRabbit
Tests
Bug Fixes