112 lines
3.5 KiB
Rust
112 lines
3.5 KiB
Rust
//! Quirks module for handling package-specific workarounds
|
|
//!
|
|
//! This module provides functionality to read quirks from a YAML file
|
|
//! and apply them during pull and deb operations.
|
|
|
|
use lazy_static::lazy_static;
|
|
use serde::{Deserialize, Serialize};
|
|
use std::collections::HashMap;
|
|
|
|
/// Quirks configuration for a specific operation (pull or deb)
|
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
|
pub struct OperationQuirks {
|
|
/// Extra dependencies to install before the operation
|
|
#[serde(default)]
|
|
pub extra_dependencies: Vec<String>,
|
|
|
|
/// Additional parameters for the operation
|
|
#[serde(default)]
|
|
pub parameters: HashMap<String, serde_yaml::Value>,
|
|
|
|
/// Custom package directories to try when looking for the package source
|
|
/// This is useful for packages that don't follow the standard naming conventions
|
|
/// like linux packages that use directories like "linux-main" or other custom names
|
|
#[serde(default)]
|
|
pub package_directory: Vec<String>,
|
|
}
|
|
|
|
/// Quirks for a specific package
|
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
|
pub struct PackageQuirks {
|
|
/// Quirks to apply during pull operation
|
|
#[serde(default)]
|
|
pub pull: Option<OperationQuirks>,
|
|
|
|
/// Quirks to apply during deb operation
|
|
#[serde(default)]
|
|
pub deb: Option<OperationQuirks>,
|
|
}
|
|
|
|
/// Top-level quirks configuration
|
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
|
pub struct QuirksConfig {
|
|
/// Map of package names to their quirks
|
|
pub quirks: HashMap<String, PackageQuirks>,
|
|
}
|
|
|
|
const QUIRKS_YAML: &str = include_str!("../quirks.yml");
|
|
lazy_static! {
|
|
static ref QUIRKS_DATA: QuirksConfig = serde_yaml::from_str(QUIRKS_YAML).unwrap();
|
|
}
|
|
|
|
/// Get quirks for a specific package
|
|
///
|
|
/// # Arguments
|
|
/// * `config` - The quirks configuration
|
|
/// * `package` - The package name
|
|
///
|
|
/// # Returns
|
|
/// * `Option<PackageQuirks>` - The quirks for the package, or None if not found
|
|
pub fn get_package_quirks<'a>(
|
|
config: &'a QuirksConfig,
|
|
package: &str,
|
|
) -> Option<&'a PackageQuirks> {
|
|
config.quirks.get(package)
|
|
}
|
|
|
|
/// Get deb-time extra dependencies for a package
|
|
///
|
|
/// This function returns the list of extra dependencies that should be installed
|
|
/// before building a package, as defined in the quirks configuration.
|
|
///
|
|
/// # Arguments
|
|
/// * `package` - The package name
|
|
///
|
|
/// # Returns
|
|
/// * `Vec<String>` - List of extra dependencies, or empty vector if none
|
|
pub fn get_deb_extra_dependencies(package: &str) -> Vec<String> {
|
|
if let Some(quirks) = &get_package_quirks(&QUIRKS_DATA, package).unwrap().deb {
|
|
return quirks.extra_dependencies.clone();
|
|
}
|
|
|
|
Vec::new()
|
|
}
|
|
|
|
/// Get package directories from quirks configuration
|
|
///
|
|
/// This function returns the list of custom package directories to try
|
|
/// when looking for the package source directory.
|
|
///
|
|
/// # Arguments
|
|
/// * `package` - The package name
|
|
///
|
|
/// # Returns
|
|
/// * `Vec<String>` - List of package directories to try, or empty vector if none
|
|
pub fn get_package_directories(package: &str) -> Vec<String> {
|
|
if let Some(quirks) = get_package_quirks(&QUIRKS_DATA, package) {
|
|
// Check deb quirks first, then pull quirks
|
|
if let Some(deb_quirks) = &quirks.deb
|
|
&& !deb_quirks.package_directory.is_empty()
|
|
{
|
|
return deb_quirks.package_directory.clone();
|
|
}
|
|
if let Some(pull_quirks) = &quirks.pull
|
|
&& !pull_quirks.package_directory.is_empty()
|
|
{
|
|
return pull_quirks.package_directory.clone();
|
|
}
|
|
}
|
|
|
|
Vec::new()
|
|
}
|