Invalidate uv.lock when virtual dev-dependencies change (#6291)

## Summary

For non-virtual workspaces, these are covered by the _members_. But for
virtual workspaces, they aren't captured anywhere else in the lock. So,
we weren't invalidating `uv.lock` when the dev dependencies changed,
which led to a panic.

Closes https://github.com/astral-sh/uv/issues/6288
This commit is contained in:
Charlie Marsh 2024-08-20 21:25:38 -04:00 committed by GitHub
parent 6f34a251e6
commit 2e02d579a0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 224 additions and 9 deletions

View file

@ -567,6 +567,26 @@ impl Lock {
);
}
if !self.manifest.requirements.is_empty() {
let requirements = self
.manifest
.requirements
.iter()
.map(|requirement| {
serde::Serialize::serialize(
&requirement,
toml_edit::ser::ValueSerializer::new(),
)
})
.collect::<Result<Vec<_>, _>>()?;
let requirements = match requirements.as_slice() {
[] => Array::new(),
[requirement] => Array::from_iter([requirement]),
requirements => each_element_on_its_line_array(requirements.iter()),
};
manifest_table.insert("requirements", value(requirements));
}
if !self.manifest.constraints.is_empty() {
let constraints = self
.manifest
@ -657,6 +677,7 @@ impl Lock {
&self,
workspace: &Workspace,
members: &[PackageName],
requirements: &[Requirement],
constraints: &[Requirement],
overrides: &[Requirement],
indexes: Option<&IndexLocations>,
@ -679,6 +700,29 @@ impl Lock {
}
}
// Validate that the lockfile was generated with the same requirements.
{
let expected: BTreeSet<_> = requirements
.iter()
.cloned()
.map(|requirement| normalize_requirement(requirement, workspace))
.collect::<Result<_, _>>()?;
let actual: BTreeSet<_> = self
.manifest
.requirements
.iter()
.cloned()
.map(|requirement| normalize_requirement(requirement, workspace))
.collect::<Result<_, _>>()?;
if expected != actual {
debug!(
"Mismatched requirements:\n expected: {:?}\n found: {:?}",
expected, actual
);
return Ok(SatisfiesResult::MismatchedConstraints(expected, actual));
}
}
// Validate that the lockfile was generated with the same constraints.
{
let expected: BTreeSet<_> = constraints
@ -901,6 +945,8 @@ pub enum SatisfiesResult<'lock> {
Satisfied,
/// The lockfile uses a different set of workspace members.
MismatchedMembers(BTreeSet<PackageName>, &'lock BTreeSet<PackageName>),
/// The lockfile uses a different set of requirements.
MismatchedRequirements(BTreeSet<Requirement>, BTreeSet<Requirement>),
/// The lockfile uses a different set of constraints.
MismatchedConstraints(BTreeSet<Requirement>, BTreeSet<Requirement>),
/// The lockfile uses a different set of overrides.
@ -947,6 +993,9 @@ pub struct ResolverManifest {
/// The workspace members included in the lockfile.
#[serde(default)]
members: BTreeSet<PackageName>,
/// The requirements provided to the resolver, exclusive of the workspace members.
#[serde(default)]
requirements: BTreeSet<Requirement>,
/// The constraints provided to the resolver.
#[serde(default)]
constraints: BTreeSet<Requirement>,
@ -958,11 +1007,13 @@ pub struct ResolverManifest {
impl ResolverManifest {
pub fn new(
members: impl IntoIterator<Item = PackageName>,
requirements: impl IntoIterator<Item = Requirement>,
constraints: impl IntoIterator<Item = Requirement>,
overrides: impl IntoIterator<Item = Requirement>,
) -> Self {
Self {
members: members.into_iter().collect(),
requirements: requirements.into_iter().collect(),
constraints: constraints.into_iter().collect(),
overrides: overrides.into_iter().collect(),
}

View file

@ -79,6 +79,7 @@ Ok(
},
manifest: ResolverManifest {
members: {},
requirements: {},
constraints: {},
overrides: {},
},

View file

@ -86,6 +86,7 @@ Ok(
},
manifest: ResolverManifest {
members: {},
requirements: {},
constraints: {},
overrides: {},
},

View file

@ -82,6 +82,7 @@ Ok(
},
manifest: ResolverManifest {
members: {},
requirements: {},
constraints: {},
overrides: {},
},

View file

@ -141,6 +141,7 @@ Ok(
},
manifest: ResolverManifest {
members: {},
requirements: {},
constraints: {},
overrides: {},
},

View file

@ -141,6 +141,7 @@ Ok(
},
manifest: ResolverManifest {
members: {},
requirements: {},
constraints: {},
overrides: {},
},

View file

@ -141,6 +141,7 @@ Ok(
},
manifest: ResolverManifest {
members: {},
requirements: {},
constraints: {},
overrides: {},
},

View file

@ -63,6 +63,7 @@ Ok(
},
manifest: ResolverManifest {
members: {},
requirements: {},
constraints: {},
overrides: {},
},

View file

@ -59,6 +59,7 @@ Ok(
},
manifest: ResolverManifest {
members: {},
requirements: {},
constraints: {},
overrides: {},
},

View file

@ -49,6 +49,7 @@ Ok(
},
manifest: ResolverManifest {
members: {},
requirements: {},
constraints: {},
overrides: {},
},

View file

@ -49,6 +49,7 @@ Ok(
},
manifest: ResolverManifest {
members: {},
requirements: {},
constraints: {},
overrides: {},
},