mirror of
https://github.com/astral-sh/uv.git
synced 2025-08-03 10:33:49 +00:00
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:
parent
6f34a251e6
commit
2e02d579a0
14 changed files with 224 additions and 9 deletions
|
@ -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(),
|
||||
}
|
||||
|
|
|
@ -79,6 +79,7 @@ Ok(
|
|||
},
|
||||
manifest: ResolverManifest {
|
||||
members: {},
|
||||
requirements: {},
|
||||
constraints: {},
|
||||
overrides: {},
|
||||
},
|
||||
|
|
|
@ -86,6 +86,7 @@ Ok(
|
|||
},
|
||||
manifest: ResolverManifest {
|
||||
members: {},
|
||||
requirements: {},
|
||||
constraints: {},
|
||||
overrides: {},
|
||||
},
|
||||
|
|
|
@ -82,6 +82,7 @@ Ok(
|
|||
},
|
||||
manifest: ResolverManifest {
|
||||
members: {},
|
||||
requirements: {},
|
||||
constraints: {},
|
||||
overrides: {},
|
||||
},
|
||||
|
|
|
@ -141,6 +141,7 @@ Ok(
|
|||
},
|
||||
manifest: ResolverManifest {
|
||||
members: {},
|
||||
requirements: {},
|
||||
constraints: {},
|
||||
overrides: {},
|
||||
},
|
||||
|
|
|
@ -141,6 +141,7 @@ Ok(
|
|||
},
|
||||
manifest: ResolverManifest {
|
||||
members: {},
|
||||
requirements: {},
|
||||
constraints: {},
|
||||
overrides: {},
|
||||
},
|
||||
|
|
|
@ -141,6 +141,7 @@ Ok(
|
|||
},
|
||||
manifest: ResolverManifest {
|
||||
members: {},
|
||||
requirements: {},
|
||||
constraints: {},
|
||||
overrides: {},
|
||||
},
|
||||
|
|
|
@ -63,6 +63,7 @@ Ok(
|
|||
},
|
||||
manifest: ResolverManifest {
|
||||
members: {},
|
||||
requirements: {},
|
||||
constraints: {},
|
||||
overrides: {},
|
||||
},
|
||||
|
|
|
@ -59,6 +59,7 @@ Ok(
|
|||
},
|
||||
manifest: ResolverManifest {
|
||||
members: {},
|
||||
requirements: {},
|
||||
constraints: {},
|
||||
overrides: {},
|
||||
},
|
||||
|
|
|
@ -49,6 +49,7 @@ Ok(
|
|||
},
|
||||
manifest: ResolverManifest {
|
||||
members: {},
|
||||
requirements: {},
|
||||
constraints: {},
|
||||
overrides: {},
|
||||
},
|
||||
|
|
|
@ -49,6 +49,7 @@ Ok(
|
|||
},
|
||||
manifest: ResolverManifest {
|
||||
members: {},
|
||||
requirements: {},
|
||||
constraints: {},
|
||||
overrides: {},
|
||||
},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue