uv
f865406a - uv-resolver: implement merging of forked resolutions

Commit
1 year ago
uv-resolver: implement merging of forked resolutions This commit is a pretty invasive change that implements the merging of resolutions created by each fork of the resolver. The main idea here is that each `SolveState` is converted into a `Resolution` (a new type) and stored on the heap after its fork completes. When all forks complete, they are all merged into a single `Resolution`. This `Resolution` is then used to build a `ResolutionGraph`. Construction of `ResolutionGraph` mostly stays the same (despite the gnarly diff due to an indent change) with one exception: the code to extract dependency edges out of PubGrub's state has been moved to `SolveState::into_resolution`. The idea here is that once a fork completes, we extract what we need from the PubGrub state and then throw it away. We store these edges in our own intermediate type which is then converted into petgraph edges in the `ResolutionGraph` constructor. One interesting change we make here is that our edge data is now a `Version` instead of a `Range<Version>`. I don't think `Range<Version>` was actually being used anywhere, so this seems okay? In any case, I think `Version` here is correct because a resolution corresponds to specific dependencies of each package. Moreover, I didn't see an easy way to make things work with `Range<Version>`. Notably, since we no longer have the guarantee that there is only one version of each package, we need to use `(PackageName, Version)` instead of just `PackageName` for inverted lookups in `ResolutionGraph::from_state`. Finally, the main resolver loop itself is changed a bit to track all forked resolutions and then merge them at the end. Note that we don't really have any dealings with markers in this commit. We'll get to that in a subsequent commit.
Author
Committer
Parents
Loading