mirror of
https://github.com/astral-sh/uv.git
synced 2025-10-15 21:09:46 +00:00
34 lines
1.3 KiB
Rust
34 lines
1.3 KiB
Rust
use rustc_hash::FxHashMap;
|
|
|
|
use uv_distribution_types::{CompatibleDist, ResolvedDist};
|
|
use uv_normalize::PackageName;
|
|
|
|
use crate::candidate_selector::Candidate;
|
|
|
|
/// A set of package versions pinned to specific files.
|
|
///
|
|
/// For example, given `Flask==3.0.0`, the [`FilePins`] would contain a mapping from `Flask` to
|
|
/// `3.0.0` to the specific wheel or source distribution archive that was pinned for that version.
|
|
#[derive(Clone, Debug, Default)]
|
|
pub(crate) struct FilePins(FxHashMap<(PackageName, uv_pep440::Version), ResolvedDist>);
|
|
|
|
// Inserts are common (every time we select a version) while reads are rare (converting the
|
|
// final resolution).
|
|
impl FilePins {
|
|
/// Pin a candidate package.
|
|
pub(crate) fn insert(&mut self, candidate: &Candidate, dist: &CompatibleDist) {
|
|
self.0
|
|
.entry((candidate.name().clone(), candidate.version().clone()))
|
|
// Avoid the expensive clone when a version is selected again.
|
|
.or_insert_with(|| dist.for_installation().to_owned());
|
|
}
|
|
|
|
/// Return the pinned file for the given package name and version, if it exists.
|
|
pub(crate) fn get(
|
|
&self,
|
|
name: &PackageName,
|
|
version: &uv_pep440::Version,
|
|
) -> Option<&ResolvedDist> {
|
|
self.0.get(&(name.clone(), version.clone()))
|
|
}
|
|
}
|