mirror of
https://github.com/astral-sh/uv.git
synced 2025-11-03 21:23:54 +00:00
Add two ForkState methods (#5404)
Small refactoring split out of the instability work. No functional changes.
This commit is contained in:
parent
6d34f53ee5
commit
20018cd0fc
1 changed files with 55 additions and 32 deletions
|
|
@ -316,17 +316,13 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
|||
|
||||
let root = PubGrubPackage::from(PubGrubPackageInner::Root(self.project.clone()));
|
||||
let mut prefetcher = BatchPrefetcher::default();
|
||||
let state = ForkState {
|
||||
pubgrub: State::init(root.clone(), MIN_VERSION.clone()),
|
||||
next: root,
|
||||
pins: FilePins::default(),
|
||||
fork_urls: ForkUrls::default(),
|
||||
priorities: PubGrubPriorities::default(),
|
||||
added_dependencies: FxHashMap::default(),
|
||||
markers: self.markers.clone(),
|
||||
python_requirement: self.python_requirement.clone(),
|
||||
requires_python: self.requires_python.clone(),
|
||||
};
|
||||
let state = ForkState::new(
|
||||
State::init(root.clone(), MIN_VERSION.clone()),
|
||||
root,
|
||||
self.markers.clone(),
|
||||
self.python_requirement.clone(),
|
||||
self.requires_python.clone(),
|
||||
);
|
||||
let mut preferences = self.preferences.clone();
|
||||
let mut forked_states = vec![state];
|
||||
let mut resolutions = vec![];
|
||||
|
|
@ -667,31 +663,12 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
|||
let forks_len = forks.len();
|
||||
forks.into_iter().enumerate().map(move |(i, fork)| {
|
||||
let is_last = i == forks_len - 1;
|
||||
let mut forked_state = cur_state.take().unwrap();
|
||||
let forked_state = cur_state.take().unwrap();
|
||||
if !is_last {
|
||||
cur_state = Some(forked_state.clone());
|
||||
}
|
||||
|
||||
let combined_markers = forked_state.markers.and(fork.markers);
|
||||
let combined_markers =
|
||||
normalize(combined_markers, None).expect("Fork markers are universal");
|
||||
|
||||
// If the fork contains a narrowed Python requirement, apply it.
|
||||
let python_requirement = requires_python_marker(&combined_markers)
|
||||
.and_then(|marker| forked_state.python_requirement.narrow(&marker));
|
||||
if let Some(python_requirement) = python_requirement {
|
||||
if let Some(target) = python_requirement.target() {
|
||||
debug!("Narrowed `requires-python` bound to: {target}");
|
||||
}
|
||||
forked_state.requires_python = if forked_state.requires_python.is_some() {
|
||||
python_requirement.to_marker_tree()
|
||||
} else {
|
||||
None
|
||||
};
|
||||
forked_state.python_requirement = python_requirement;
|
||||
}
|
||||
|
||||
forked_state.markers = ResolverMarkers::Fork(combined_markers);
|
||||
let mut forked_state = forked_state.with_markers(fork.markers);
|
||||
forked_state.add_package_version_dependencies(
|
||||
for_package,
|
||||
version,
|
||||
|
|
@ -2052,6 +2029,26 @@ struct ForkState {
|
|||
}
|
||||
|
||||
impl ForkState {
|
||||
fn new(
|
||||
pubgrub: State<UvDependencyProvider>,
|
||||
root: PubGrubPackage,
|
||||
markers: ResolverMarkers,
|
||||
python_requirement: PythonRequirement,
|
||||
requires_python: Option<MarkerTree>,
|
||||
) -> Self {
|
||||
Self {
|
||||
pubgrub,
|
||||
next: root,
|
||||
pins: FilePins::default(),
|
||||
fork_urls: ForkUrls::default(),
|
||||
priorities: PubGrubPriorities::default(),
|
||||
added_dependencies: FxHashMap::default(),
|
||||
markers,
|
||||
python_requirement,
|
||||
requires_python,
|
||||
}
|
||||
}
|
||||
|
||||
/// Add the dependencies for the selected version of the current package, checking for
|
||||
/// self-dependencies, and handling URLs and locals.
|
||||
fn add_package_version_dependencies(
|
||||
|
|
@ -2199,6 +2196,32 @@ impl ForkState {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
/// Subset the current markers with the new markers and update the python requirements fields
|
||||
/// accordingly.
|
||||
fn with_markers(mut self, markers: MarkerTree) -> Self {
|
||||
let combined_markers = self.markers.and(markers);
|
||||
let combined_markers =
|
||||
normalize(combined_markers, None).expect("Fork markers are universal");
|
||||
|
||||
// If the fork contains a narrowed Python requirement, apply it.
|
||||
let python_requirement = requires_python_marker(&combined_markers)
|
||||
.and_then(|marker| self.python_requirement.narrow(&marker));
|
||||
if let Some(python_requirement) = python_requirement {
|
||||
if let Some(target) = python_requirement.target() {
|
||||
debug!("Narrowed `requires-python` bound to: {target}");
|
||||
}
|
||||
self.requires_python = if self.requires_python.is_some() {
|
||||
python_requirement.to_marker_tree()
|
||||
} else {
|
||||
None
|
||||
};
|
||||
self.python_requirement = python_requirement;
|
||||
}
|
||||
|
||||
self.markers = ResolverMarkers::Fork(combined_markers);
|
||||
self
|
||||
}
|
||||
|
||||
fn into_resolution(self) -> Resolution {
|
||||
let solution = self.pubgrub.partial_solution.extract_solution();
|
||||
let mut dependencies: FxHashSet<ResolutionDependencyEdge> = FxHashSet::default();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue