Files
uv/crates/uv-resolver/src/yanks.rs
T
Charlie Marsh 792a917a97 Restrict observed requirements to direct when --no-deps is specified (#3191)
## Summary

This PR avoids: (1) using the lookahead resolver when `--no-deps` is
specified (we'll never use those requirements), and (2) including any
transitive requirements when searching for allowed URLs, etc., when
`--no-deps` is specified.

Closes https://github.com/astral-sh/uv/issues/3183.
2024-04-22 17:17:58 +00:00

52 lines
1.7 KiB
Rust

use rustc_hash::{FxHashMap, FxHashSet};
use pep440_rs::Version;
use pep508_rs::{MarkerEnvironment, VersionOrUrl};
use uv_normalize::PackageName;
use crate::{DependencyMode, Manifest, Preference};
/// A set of package versions that are permitted, even if they're marked as yanked by the
/// relevant index.
#[derive(Debug, Default, Clone)]
pub struct AllowedYanks(FxHashMap<PackageName, FxHashSet<Version>>);
impl AllowedYanks {
pub fn from_manifest(
manifest: &Manifest,
markers: &MarkerEnvironment,
dependencies: DependencyMode,
) -> Self {
let mut allowed_yanks = FxHashMap::<PackageName, FxHashSet<Version>>::default();
for requirement in manifest
.requirements(markers, dependencies)
.chain(manifest.preferences.iter().map(Preference::requirement))
{
let Some(VersionOrUrl::VersionSpecifier(specifiers)) = &requirement.version_or_url
else {
continue;
};
let [specifier] = specifiers.as_ref() else {
continue;
};
if matches!(
specifier.operator(),
pep440_rs::Operator::Equal | pep440_rs::Operator::ExactEqual
) {
allowed_yanks
.entry(requirement.name.clone())
.or_default()
.insert(specifier.version().clone());
}
}
Self(allowed_yanks)
}
/// Returns versions for the given package which are allowed even if marked as yanked by the
/// relevant index.
pub fn allowed_versions(&self, package_name: &PackageName) -> Option<&FxHashSet<Version>> {
self.0.get(package_name)
}
}