mirror of
https://github.com/astral-sh/uv.git
synced 2025-07-07 21:35:00 +00:00

## Summary This PR enables the proof-of-concept resolver to backtrack by way of using the `pubgrub-rs` crate. Rather than using PubGrub as a _framework_ (implementing the `DependencyProvider` trait, letting PubGrub call us), I've instead copied over PubGrub's primary solver hook (which is only ~100 lines or so) and modified it for our purposes (e.g., made it async). There's a lot to improve here, but it's a start that will let us understand PubGrub's appropriateness for this problem space. A few observations: - In simple cases, the resolver is slower than our current (naive) resolver. I think it's just that the pipelining isn't as efficient as in the naive case, where we can just stream package and version fetches concurrently without any bottlenecks. - A lot of the code here relates to bridging PubGrub with our own abstractions -- so we need a `PubGrubPackage`, a `PubGrubVersion`, etc.
24 lines
907 B
Rust
24 lines
907 B
Rust
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
use pubgrub::range::Range;
|
|
use pubgrub::solver::{resolve, OfflineDependencyProvider};
|
|
use pubgrub::version::NumberVersion;
|
|
|
|
// `root` depends on `menu` and `icons`
|
|
// `menu` depends on `dropdown`
|
|
// `dropdown` depends on `icons`
|
|
// `icons` has no dependency
|
|
#[rustfmt::skip]
|
|
fn main() {
|
|
let mut dependency_provider = OfflineDependencyProvider::<&str, NumberVersion>::new();
|
|
dependency_provider.add_dependencies(
|
|
"root", 1, vec![("menu", Range::any()), ("icons", Range::any())],
|
|
);
|
|
dependency_provider.add_dependencies("menu", 1, vec![("dropdown", Range::any())]);
|
|
dependency_provider.add_dependencies("dropdown", 1, vec![("icons", Range::any())]);
|
|
dependency_provider.add_dependencies("icons", 1, vec![]);
|
|
|
|
// Run the algorithm.
|
|
let solution = resolve(&dependency_provider, "root", 1);
|
|
println!("Solution: {:?}", solution);
|
|
}
|