From d9858fbd322ce20de84f44ce67ae11edf081578c Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 24 Feb 2026 00:47:35 +0900 Subject: fix(solver): iterate live watch chain to prevent infinite loop in propagation The watch graph's propagateLiteral used a cloned chain for iteration while checking the live chain for bounds. After move_watch removed a node, the stale clone kept re-reading the same node index, causing an infinite loop on large dependency sets (e.g. laravel/laravel). Now re-fetch the live chain each iteration, matching Composer's SplDoublyLinkedList semantics where remove() advances the iterator. Co-Authored-By: Claude Opus 4.6 --- crates/mozart-registry/src/resolver.rs | 2 -- 1 file changed, 2 deletions(-) (limited to 'crates/mozart-registry/src/resolver.rs') diff --git a/crates/mozart-registry/src/resolver.rs b/crates/mozart-registry/src/resolver.rs index fe59824..e3cc1f6 100644 --- a/crates/mozart-registry/src/resolver.rs +++ b/crates/mozart-registry/src/resolver.rs @@ -497,7 +497,6 @@ pub async fn resolve(request: &ResolveRequest) -> Result, R // Explore transitive dependencies while let Some(name) = builder.next_pending() { if PackageName(name.clone()).is_platform() { - // Platform package: already added if available, skip fetching continue; } @@ -531,7 +530,6 @@ pub async fn resolve(request: &ResolveRequest) -> Result, R // Build the pool let mut pool = builder.build(); - // Collect fixed package IDs let mut fixed_ids: Vec = Vec::new(); for pkg in pool.packages() { -- cgit v1.3.1