mirror of
https://github.com/astral-sh/uv.git
synced 2025-10-02 23:04:37 +00:00
Split extra validation from graph construction (#3586)
## Summary Splits this into two loops that each handle independent cases, to make the code a little easier to reason about. No behavioral or logic changes -- just splitting the `match` across two loops.
This commit is contained in:
parent
30a7475029
commit
f4cd7d627a
1 changed files with 111 additions and 106 deletions
|
@ -75,13 +75,122 @@ impl ResolutionGraph {
|
||||||
preferences: &Preferences,
|
preferences: &Preferences,
|
||||||
editables: Editables,
|
editables: Editables,
|
||||||
) -> Result<Self, ResolveError> {
|
) -> Result<Self, ResolveError> {
|
||||||
|
// Collect and validate the extras.
|
||||||
|
let mut extras = FxHashMap::default();
|
||||||
|
let mut diagnostics = Vec::new();
|
||||||
|
for (package, version) in selection {
|
||||||
|
match package {
|
||||||
|
PubGrubPackage::Package(package_name, Some(extra), None) => {
|
||||||
|
if let Some((editable, metadata, _)) = editables.get(package_name) {
|
||||||
|
if metadata.provides_extras.contains(extra) {
|
||||||
|
extras
|
||||||
|
.entry(package_name.clone())
|
||||||
|
.or_insert_with(Vec::new)
|
||||||
|
.push(extra.clone());
|
||||||
|
} else {
|
||||||
|
let pinned_package =
|
||||||
|
Dist::from_editable(package_name.clone(), editable.clone())?;
|
||||||
|
|
||||||
|
diagnostics.push(Diagnostic::MissingExtra {
|
||||||
|
dist: pinned_package.into(),
|
||||||
|
extra: extra.clone(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let dist = PubGrubDistribution::from_registry(package_name, version);
|
||||||
|
|
||||||
|
let response = distributions.get(&dist.version_id()).unwrap_or_else(|| {
|
||||||
|
panic!(
|
||||||
|
"Every package should have metadata: {:?}",
|
||||||
|
dist.version_id()
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
|
let MetadataResponse::Found(archive) = &*response else {
|
||||||
|
panic!(
|
||||||
|
"Every package should have metadata: {:?}",
|
||||||
|
dist.version_id()
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
if archive.metadata.provides_extras.contains(extra) {
|
||||||
|
extras
|
||||||
|
.entry(package_name.clone())
|
||||||
|
.or_insert_with(Vec::new)
|
||||||
|
.push(extra.clone());
|
||||||
|
} else {
|
||||||
|
let pinned_package = pins
|
||||||
|
.get(package_name, version)
|
||||||
|
.unwrap_or_else(|| {
|
||||||
|
panic!("Every package should be pinned: {package_name:?}")
|
||||||
|
})
|
||||||
|
.clone();
|
||||||
|
|
||||||
|
diagnostics.push(Diagnostic::MissingExtra {
|
||||||
|
dist: pinned_package,
|
||||||
|
extra: extra.clone(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PubGrubPackage::Package(package_name, Some(extra), Some(url)) => {
|
||||||
|
if let Some((editable, metadata, _)) = editables.get(package_name) {
|
||||||
|
if metadata.provides_extras.contains(extra) {
|
||||||
|
extras
|
||||||
|
.entry(package_name.clone())
|
||||||
|
.or_insert_with(Vec::new)
|
||||||
|
.push(extra.clone());
|
||||||
|
} else {
|
||||||
|
let pinned_package =
|
||||||
|
Dist::from_editable(package_name.clone(), editable.clone())?;
|
||||||
|
|
||||||
|
diagnostics.push(Diagnostic::MissingExtra {
|
||||||
|
dist: pinned_package.into(),
|
||||||
|
extra: extra.clone(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let dist = PubGrubDistribution::from_url(package_name, url);
|
||||||
|
|
||||||
|
let response = distributions.get(&dist.version_id()).unwrap_or_else(|| {
|
||||||
|
panic!(
|
||||||
|
"Every package should have metadata: {:?}",
|
||||||
|
dist.version_id()
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
|
let MetadataResponse::Found(archive) = &*response else {
|
||||||
|
panic!(
|
||||||
|
"Every package should have metadata: {:?}",
|
||||||
|
dist.version_id()
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
if archive.metadata.provides_extras.contains(extra) {
|
||||||
|
extras
|
||||||
|
.entry(package_name.clone())
|
||||||
|
.or_insert_with(Vec::new)
|
||||||
|
.push(extra.clone());
|
||||||
|
} else {
|
||||||
|
let pinned_package =
|
||||||
|
Dist::from_url(package_name.clone(), url_to_precise(url.clone()))?;
|
||||||
|
|
||||||
|
diagnostics.push(Diagnostic::MissingExtra {
|
||||||
|
dist: pinned_package.into(),
|
||||||
|
extra: extra.clone(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// TODO(charlie): petgraph is a really heavy and unnecessary dependency here. We should
|
// TODO(charlie): petgraph is a really heavy and unnecessary dependency here. We should
|
||||||
// write our own graph, given that our requirements are so simple.
|
// write our own graph, given that our requirements are so simple.
|
||||||
let mut petgraph = petgraph::graph::Graph::with_capacity(selection.len(), selection.len());
|
let mut petgraph = petgraph::graph::Graph::with_capacity(selection.len(), selection.len());
|
||||||
let mut hashes =
|
let mut hashes =
|
||||||
FxHashMap::with_capacity_and_hasher(selection.len(), BuildHasherDefault::default());
|
FxHashMap::with_capacity_and_hasher(selection.len(), BuildHasherDefault::default());
|
||||||
let mut extras = FxHashMap::default();
|
|
||||||
let mut diagnostics = Vec::new();
|
|
||||||
|
|
||||||
// Add every package to the graph.
|
// Add every package to the graph.
|
||||||
let mut inverse =
|
let mut inverse =
|
||||||
|
@ -152,110 +261,6 @@ impl ResolutionGraph {
|
||||||
let index = petgraph.add_node(pinned_package.into());
|
let index = petgraph.add_node(pinned_package.into());
|
||||||
inverse.insert(package_name, index);
|
inverse.insert(package_name, index);
|
||||||
}
|
}
|
||||||
PubGrubPackage::Package(package_name, Some(extra), None) => {
|
|
||||||
// Validate that the `extra` exists.
|
|
||||||
let dist = PubGrubDistribution::from_registry(package_name, version);
|
|
||||||
|
|
||||||
if let Some((editable, metadata, _)) = editables.get(package_name) {
|
|
||||||
if metadata.provides_extras.contains(extra) {
|
|
||||||
extras
|
|
||||||
.entry(package_name.clone())
|
|
||||||
.or_insert_with(Vec::new)
|
|
||||||
.push(extra.clone());
|
|
||||||
} else {
|
|
||||||
let pinned_package =
|
|
||||||
Dist::from_editable(package_name.clone(), editable.clone())?;
|
|
||||||
|
|
||||||
diagnostics.push(Diagnostic::MissingExtra {
|
|
||||||
dist: pinned_package.into(),
|
|
||||||
extra: extra.clone(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let response = distributions.get(&dist.version_id()).unwrap_or_else(|| {
|
|
||||||
panic!(
|
|
||||||
"Every package should have metadata: {:?}",
|
|
||||||
dist.version_id()
|
|
||||||
)
|
|
||||||
});
|
|
||||||
|
|
||||||
let MetadataResponse::Found(archive) = &*response else {
|
|
||||||
panic!(
|
|
||||||
"Every package should have metadata: {:?}",
|
|
||||||
dist.version_id()
|
|
||||||
)
|
|
||||||
};
|
|
||||||
|
|
||||||
if archive.metadata.provides_extras.contains(extra) {
|
|
||||||
extras
|
|
||||||
.entry(package_name.clone())
|
|
||||||
.or_insert_with(Vec::new)
|
|
||||||
.push(extra.clone());
|
|
||||||
} else {
|
|
||||||
let pinned_package = pins
|
|
||||||
.get(package_name, version)
|
|
||||||
.unwrap_or_else(|| {
|
|
||||||
panic!("Every package should be pinned: {package_name:?}")
|
|
||||||
})
|
|
||||||
.clone();
|
|
||||||
|
|
||||||
diagnostics.push(Diagnostic::MissingExtra {
|
|
||||||
dist: pinned_package,
|
|
||||||
extra: extra.clone(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PubGrubPackage::Package(package_name, Some(extra), Some(url)) => {
|
|
||||||
// Validate that the `extra` exists.
|
|
||||||
let dist = PubGrubDistribution::from_url(package_name, url);
|
|
||||||
|
|
||||||
if let Some((editable, metadata, _)) = editables.get(package_name) {
|
|
||||||
if metadata.provides_extras.contains(extra) {
|
|
||||||
extras
|
|
||||||
.entry(package_name.clone())
|
|
||||||
.or_insert_with(Vec::new)
|
|
||||||
.push(extra.clone());
|
|
||||||
} else {
|
|
||||||
let pinned_package =
|
|
||||||
Dist::from_editable(package_name.clone(), editable.clone())?;
|
|
||||||
|
|
||||||
diagnostics.push(Diagnostic::MissingExtra {
|
|
||||||
dist: pinned_package.into(),
|
|
||||||
extra: extra.clone(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let response = distributions.get(&dist.version_id()).unwrap_or_else(|| {
|
|
||||||
panic!(
|
|
||||||
"Every package should have metadata: {:?}",
|
|
||||||
dist.version_id()
|
|
||||||
)
|
|
||||||
});
|
|
||||||
|
|
||||||
let MetadataResponse::Found(archive) = &*response else {
|
|
||||||
panic!(
|
|
||||||
"Every package should have metadata: {:?}",
|
|
||||||
dist.version_id()
|
|
||||||
)
|
|
||||||
};
|
|
||||||
|
|
||||||
if archive.metadata.provides_extras.contains(extra) {
|
|
||||||
extras
|
|
||||||
.entry(package_name.clone())
|
|
||||||
.or_insert_with(Vec::new)
|
|
||||||
.push(extra.clone());
|
|
||||||
} else {
|
|
||||||
let pinned_package =
|
|
||||||
Dist::from_url(package_name.clone(), url_to_precise(url.clone()))?;
|
|
||||||
|
|
||||||
diagnostics.push(Diagnostic::MissingExtra {
|
|
||||||
dist: pinned_package.into(),
|
|
||||||
extra: extra.clone(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
_ => {}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue