Support empty requires

This commit is contained in:
konstin 2025-10-10 19:15:00 +02:00 committed by Charlie Marsh
parent 371fa662e3
commit 7e69f62093
4 changed files with 12 additions and 3 deletions

View File

@ -695,7 +695,7 @@ impl<'a, Context: BuildContext> DistributionDatabase<'a, Context> {
} else {
Err(Error::VariantLockMissing {
variant_lock: PathBuf::from(variant_lock_path),
requires: provider.requires.clone(),
requires: provider.requires.clone().unwrap_or_default(),
plugin_api: provider.plugin_api.clone().unwrap_or_default().clone(),
})
}
@ -1548,7 +1548,10 @@ fn satisfies_provider_requires(
{
return false;
}
requested_provider.requires.iter().all(|requested| {
let Some(requires) = &requested_provider.requires else {
return true;
};
requires.iter().all(|requested| {
static_provider.resolved.iter().any(|resolved| {
// We ignore extras for simplicity.
&requested.name == resolved.name()

View File

@ -23,6 +23,8 @@ pub enum Error {
RequirementsInstall(&'static str, #[source] AnyErrorBuild),
#[error("Failed to create temporary virtualenv")]
Virtualenv(#[from] uv_virtualenv::Error),
#[error("Provider plugin `{0}` is missing `requires`")]
MissingRequires(String),
#[error("Failed to run `{0}`")]
CommandFailed(PathBuf, #[source] io::Error),
#[error("The build backend returned an error")]

View File

@ -85,6 +85,8 @@ impl VariantBuild {
// Resolve and install the provider requirements.
let requirements = backend
.requires
.as_ref()
.ok_or_else(|| Error::MissingRequires(backend_name.clone()))?
.iter()
.cloned()
.map(Requirement::from)
@ -158,6 +160,8 @@ impl VariantBuild {
let requires = self
.backend
.requires
.as_ref()
.ok_or_else(|| Error::MissingRequires(self.backend_name.clone()))?
.iter()
.filter(|requirement| {
requirement.evaluate_markers(

View File

@ -178,7 +178,7 @@ pub struct Provider {
)]
pub enable_if: MarkerTree,
/// Dependency specifiers for how to install the plugin
pub requires: Vec<Requirement<VerbatimParsedUrl>>,
pub requires: Option<Vec<Requirement<VerbatimParsedUrl>>>,
/// Whether this plugin is run at install time.
pub plugin_use: Option<PluginUse>,
}