mirror of
https://github.com/astral-sh/uv.git
synced 2025-07-07 21:35:00 +00:00
Break choose_version
into three methods (#4543)
`ResolverState::choose_version` had become huge, with an odd match due to the url handling from #4435. This refactoring breaks it into `choose_version`, `choose_version_registry` and `choose_version_url`. No functional changes.
This commit is contained in:
parent
2ef34bd65b
commit
b677a06aba
1 changed files with 206 additions and 191 deletions
|
@ -726,10 +726,10 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
|||
Ok(())
|
||||
}
|
||||
|
||||
/// Given a set of candidate packages, choose the next package (and version) to add to the
|
||||
/// partial solution.
|
||||
/// Given a candidate package, choose the next version in range to try.
|
||||
///
|
||||
/// Returns [None] when there are no versions in the given range.
|
||||
/// Returns `None` when there are no versions in the given range, rejecting the current partial
|
||||
/// solution.
|
||||
#[instrument(skip_all, fields(%package))]
|
||||
fn choose_version(
|
||||
&self,
|
||||
|
@ -740,28 +740,41 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
|||
visited: &mut FxHashSet<PackageName>,
|
||||
request_sink: &Sender<Request>,
|
||||
) -> Result<Option<ResolverVersion>, ResolveError> {
|
||||
let url = package.name().and_then(|name| fork_urls.get(name));
|
||||
match (&**package, url) {
|
||||
(PubGrubPackageInner::Root(_), _) => {
|
||||
match &**package {
|
||||
PubGrubPackageInner::Root(_) => {
|
||||
Ok(Some(ResolverVersion::Available(MIN_VERSION.clone())))
|
||||
}
|
||||
|
||||
(PubGrubPackageInner::Python(_), _) => {
|
||||
PubGrubPackageInner::Python(_) => {
|
||||
// Dependencies on Python are only added when a package is incompatible; as such,
|
||||
// we don't need to do anything here.
|
||||
// we don't need to do anything here.
|
||||
Ok(None)
|
||||
}
|
||||
|
||||
(
|
||||
PubGrubPackageInner::Marker { name, .. }
|
||||
| PubGrubPackageInner::Extra { name, .. }
|
||||
| PubGrubPackageInner::Dev { name, .. }
|
||||
| PubGrubPackageInner::Package { name, .. },
|
||||
Some(url),
|
||||
) => {
|
||||
| PubGrubPackageInner::Package { name, .. } => {
|
||||
if let Some(url) = package.name().and_then(|name| fork_urls.get(name)) {
|
||||
self.choose_version_url(name, range, url)
|
||||
} else {
|
||||
self.choose_version_registry(name, range, package, pins, visited, request_sink)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Select a version for a URL requirement. Since there is only one version per URL, we return
|
||||
/// that version if it is in range and `None` otherwise.
|
||||
fn choose_version_url(
|
||||
&self,
|
||||
name: &PackageName,
|
||||
range: &Range<Version>,
|
||||
url: &VerbatimParsedUrl,
|
||||
) -> Result<Option<ResolverVersion>, ResolveError> {
|
||||
debug!(
|
||||
"Searching for a compatible version of {package} @ {} ({range})",
|
||||
"Searching for a compatible version of {name} @ {} ({range})",
|
||||
url.verbatim
|
||||
);
|
||||
|
||||
|
@ -846,13 +859,17 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
|||
Ok(Some(ResolverVersion::Available(version.clone())))
|
||||
}
|
||||
|
||||
(
|
||||
PubGrubPackageInner::Marker { name, .. }
|
||||
| PubGrubPackageInner::Extra { name, .. }
|
||||
| PubGrubPackageInner::Dev { name, .. }
|
||||
| PubGrubPackageInner::Package { name, .. },
|
||||
None,
|
||||
) => {
|
||||
/// Given a candidate registry requirement, choose the next version in range to try, or `None`
|
||||
/// if there is no version in this range.
|
||||
fn choose_version_registry(
|
||||
&self,
|
||||
name: &PackageName,
|
||||
range: &Range<Version>,
|
||||
package: &PubGrubPackage,
|
||||
pins: &mut FilePins,
|
||||
visited: &mut FxHashSet<PackageName>,
|
||||
request_sink: &Sender<Request>,
|
||||
) -> Result<Option<ResolverVersion>, ResolveError> {
|
||||
// Wait for the metadata to be available.
|
||||
let versions_response = self
|
||||
.index
|
||||
|
@ -918,7 +935,7 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
|||
|
||||
debug!(
|
||||
"Selecting: {}=={} ({})",
|
||||
package,
|
||||
name,
|
||||
candidate.version(),
|
||||
filename,
|
||||
);
|
||||
|
@ -939,8 +956,6 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
|
|||
|
||||
Ok(Some(ResolverVersion::Available(version)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Given a candidate package and version, return its dependencies.
|
||||
#[instrument(skip_all, fields(%package, %version))]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue