Refactor to remove some cruft from ExcludeNewer propagation (#16641)

I think using a wire here is less convoluted.
This commit is contained in:
Zanie Blue 2025-11-08 09:44:17 -06:00 committed by GitHub
parent e0ae518e95
commit 5983a8876b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 103 additions and 58 deletions

View file

@ -59,8 +59,8 @@ pub use crate::lock::tree::TreeDisplay;
use crate::resolution::{AnnotatedDist, ResolutionGraphNode};
use crate::universal_marker::{ConflictMarker, UniversalMarker};
use crate::{
ExcludeNewer, ExcludeNewerTimestamp, InMemoryIndex, MetadataResponse, PrereleaseMode,
ResolutionMode, ResolverOutput,
ExcludeNewer, ExcludeNewerPackage, ExcludeNewerTimestamp, InMemoryIndex, MetadataResponse,
PrereleaseMode, ResolutionMode, ResolverOutput,
};
mod export;
@ -342,23 +342,12 @@ impl Lock {
}
let packages = packages.into_values().collect();
let (exclude_newer, exclude_newer_package) = {
let exclude_newer = &resolution.options.exclude_newer;
let global_exclude_newer = exclude_newer.global;
let package_exclude_newer = if exclude_newer.package.is_empty() {
None
} else {
Some(exclude_newer.package.clone().into_inner())
};
(global_exclude_newer, package_exclude_newer)
};
let options = ResolverOptions {
resolution_mode: resolution.options.resolution_mode,
prerelease_mode: resolution.options.prerelease_mode,
fork_strategy: resolution.options.fork_strategy,
exclude_newer,
exclude_newer_package,
exclude_newer: resolution.options.exclude_newer.clone().into(),
};
let lock = Self::new(
VERSION,
@ -818,7 +807,9 @@ impl Lock {
/// Returns the exclude newer setting used to generate this lock.
pub fn exclude_newer(&self) -> ExcludeNewer {
self.options.exclude_newer()
// TODO(zanieb): It'd be nice not to hide this clone here, but I am hesitant to introduce
// a whole new `ExcludeNewerRef` type just for this
self.options.exclude_newer.clone().into()
}
/// Returns the conflicting groups that were used to generate this lock.
@ -1065,7 +1056,7 @@ impl Lock {
value(self.options.fork_strategy.to_string()),
);
}
let exclude_newer = &self.options.exclude_newer();
let exclude_newer = ExcludeNewer::from(self.options.exclude_newer.clone());
if !exclude_newer.is_empty() {
// Always serialize global exclude-newer as a string
if let Some(global) = exclude_newer.global {
@ -2131,24 +2122,34 @@ struct ResolverOptions {
/// The [`ForkStrategy`] used to generate this lock.
#[serde(default)]
fork_strategy: ForkStrategy,
/// The global [`ExcludeNewer`] timestamp.
exclude_newer: Option<ExcludeNewerTimestamp>,
/// Package-specific [`ExcludeNewer`] timestamps.
exclude_newer_package: Option<FxHashMap<PackageName, ExcludeNewerTimestamp>>,
/// The [`ExcludeNewer`] setting used to generate this lock.
#[serde(flatten)]
exclude_newer: ExcludeNewerWire,
}
impl ResolverOptions {
/// Get the combined exclude-newer configuration.
fn exclude_newer(&self) -> ExcludeNewer {
ExcludeNewer::from_args(
self.exclude_newer,
self.exclude_newer_package
.clone()
.unwrap_or_default()
.into_iter()
.map(Into::into)
.collect(),
)
#[derive(Clone, Debug, Default, serde::Deserialize, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
struct ExcludeNewerWire {
exclude_newer: Option<ExcludeNewerTimestamp>,
#[serde(default, skip_serializing_if = "ExcludeNewerPackage::is_empty")]
exclude_newer_package: ExcludeNewerPackage,
}
impl From<ExcludeNewerWire> for ExcludeNewer {
fn from(wire: ExcludeNewerWire) -> Self {
Self {
global: wire.exclude_newer,
package: wire.exclude_newer_package,
}
}
}
impl From<ExcludeNewer> for ExcludeNewerWire {
fn from(exclude_newer: ExcludeNewer) -> Self {
Self {
exclude_newer: exclude_newer.global,
exclude_newer_package: exclude_newer.package,
}
}
}

View file

@ -36,8 +36,12 @@ Ok(
resolution_mode: Highest,
prerelease_mode: IfNecessaryOrExplicit,
fork_strategy: RequiresPython,
exclude_newer: None,
exclude_newer_package: None,
exclude_newer: ExcludeNewerWire {
exclude_newer: None,
exclude_newer_package: ExcludeNewerPackage(
{},
),
},
},
packages: [
Package {

View file

@ -36,8 +36,12 @@ Ok(
resolution_mode: Highest,
prerelease_mode: IfNecessaryOrExplicit,
fork_strategy: RequiresPython,
exclude_newer: None,
exclude_newer_package: None,
exclude_newer: ExcludeNewerWire {
exclude_newer: None,
exclude_newer_package: ExcludeNewerPackage(
{},
),
},
},
packages: [
Package {

View file

@ -36,8 +36,12 @@ Ok(
resolution_mode: Highest,
prerelease_mode: IfNecessaryOrExplicit,
fork_strategy: RequiresPython,
exclude_newer: None,
exclude_newer_package: None,
exclude_newer: ExcludeNewerWire {
exclude_newer: None,
exclude_newer_package: ExcludeNewerPackage(
{},
),
},
},
packages: [
Package {

View file

@ -36,8 +36,12 @@ Ok(
resolution_mode: Highest,
prerelease_mode: IfNecessaryOrExplicit,
fork_strategy: RequiresPython,
exclude_newer: None,
exclude_newer_package: None,
exclude_newer: ExcludeNewerWire {
exclude_newer: None,
exclude_newer_package: ExcludeNewerPackage(
{},
),
},
},
packages: [
Package {

View file

@ -36,8 +36,12 @@ Ok(
resolution_mode: Highest,
prerelease_mode: IfNecessaryOrExplicit,
fork_strategy: RequiresPython,
exclude_newer: None,
exclude_newer_package: None,
exclude_newer: ExcludeNewerWire {
exclude_newer: None,
exclude_newer_package: ExcludeNewerPackage(
{},
),
},
},
packages: [
Package {

View file

@ -36,8 +36,12 @@ Ok(
resolution_mode: Highest,
prerelease_mode: IfNecessaryOrExplicit,
fork_strategy: RequiresPython,
exclude_newer: None,
exclude_newer_package: None,
exclude_newer: ExcludeNewerWire {
exclude_newer: None,
exclude_newer_package: ExcludeNewerPackage(
{},
),
},
},
packages: [
Package {

View file

@ -36,8 +36,12 @@ Ok(
resolution_mode: Highest,
prerelease_mode: IfNecessaryOrExplicit,
fork_strategy: RequiresPython,
exclude_newer: None,
exclude_newer_package: None,
exclude_newer: ExcludeNewerWire {
exclude_newer: None,
exclude_newer_package: ExcludeNewerPackage(
{},
),
},
},
packages: [
Package {

View file

@ -36,8 +36,12 @@ Ok(
resolution_mode: Highest,
prerelease_mode: IfNecessaryOrExplicit,
fork_strategy: RequiresPython,
exclude_newer: None,
exclude_newer_package: None,
exclude_newer: ExcludeNewerWire {
exclude_newer: None,
exclude_newer_package: ExcludeNewerPackage(
{},
),
},
},
packages: [
Package {

View file

@ -36,8 +36,12 @@ Ok(
resolution_mode: Highest,
prerelease_mode: IfNecessaryOrExplicit,
fork_strategy: RequiresPython,
exclude_newer: None,
exclude_newer_package: None,
exclude_newer: ExcludeNewerWire {
exclude_newer: None,
exclude_newer_package: ExcludeNewerPackage(
{},
),
},
},
packages: [
Package {

View file

@ -36,8 +36,12 @@ Ok(
resolution_mode: Highest,
prerelease_mode: IfNecessaryOrExplicit,
fork_strategy: RequiresPython,
exclude_newer: None,
exclude_newer_package: None,
exclude_newer: ExcludeNewerWire {
exclude_newer: None,
exclude_newer_package: ExcludeNewerPackage(
{},
),
},
},
packages: [
Package {

View file

@ -36,8 +36,12 @@ Ok(
resolution_mode: Highest,
prerelease_mode: IfNecessaryOrExplicit,
fork_strategy: RequiresPython,
exclude_newer: None,
exclude_newer_package: None,
exclude_newer: ExcludeNewerWire {
exclude_newer: None,
exclude_newer_package: ExcludeNewerPackage(
{},
),
},
},
packages: [
Package {

View file

@ -18,7 +18,7 @@ pub(crate) struct LatestClient<'env> {
pub(crate) client: &'env RegistryClient,
pub(crate) capabilities: &'env IndexCapabilities,
pub(crate) prerelease: PrereleaseMode,
pub(crate) exclude_newer: ExcludeNewer,
pub(crate) exclude_newer: &'env ExcludeNewer,
pub(crate) tags: Option<&'env Tags>,
pub(crate) requires_python: &'env RequiresPython,
}

View file

@ -111,7 +111,7 @@ pub(crate) async fn pip_list(
client: &client,
capabilities: &capabilities,
prerelease,
exclude_newer,
exclude_newer: &exclude_newer,
tags: Some(tags),
requires_python: &requires_python,
};

View file

@ -113,7 +113,7 @@ pub(crate) async fn pip_tree(
client: &client,
capabilities: &capabilities,
prerelease,
exclude_newer,
exclude_newer: &exclude_newer,
tags: Some(tags),
requires_python: &requires_python,
};

View file

@ -229,7 +229,7 @@ pub(crate) async fn tree(
client: &client,
capabilities: &capabilities,
prerelease: lock.prerelease_mode(),
exclude_newer: lock.exclude_newer(),
exclude_newer: &lock.exclude_newer(),
requires_python: lock.requires_python(),
tags: None,
};