Add two ForkState methods (#5404)

Small refactoring split out of the instability work. No functional
changes.
This commit is contained in:
konsti 2024-07-24 14:09:33 +02:00 committed by GitHub
parent 6d34f53ee5
commit 20018cd0fc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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();