diff --git a/quirks.yml b/quirks.yml index d4ccc40..388a743 100644 --- a/quirks.yml +++ b/quirks.yml @@ -12,3 +12,8 @@ quirks: # - another-dependency # parameters: # key: value + + linux-riscv: + deb: + package_directory: + - linux-main diff --git a/src/deb/mod.rs b/src/deb/mod.rs index 94f46c1..06a175d 100644 --- a/src/deb/mod.rs +++ b/src/deb/mod.rs @@ -142,12 +142,26 @@ pub async fn build_binary_package( /// Find the current package directory by trying both patterns: /// - package/package /// - package/package-origversion +/// - custom directories from quirks configuration pub(crate) fn find_package_directory( parent_dir: &Path, package: &str, version: &str, ctx: &context::Context, ) -> Result> { + // Check quirks first for custom package directories + let custom_dirs = crate::quirks::get_package_directories(package); + for custom_dir in custom_dirs { + let package_dir = parent_dir.join(&custom_dir); + if ctx.exists(&package_dir)? && ctx.exists(&package_dir.join("debian"))? { + log::debug!( + "Found package directory via quirks: {}", + package_dir.display() + ); + return Ok(package_dir); + } + } + // Try package/package pattern first let package_dir = parent_dir.join(package).join(package); if ctx.exists(&package_dir)? && ctx.exists(&package_dir.join("debian"))? { diff --git a/src/quirks.rs b/src/quirks.rs index 1a32a28..1ca4a98 100644 --- a/src/quirks.rs +++ b/src/quirks.rs @@ -17,6 +17,12 @@ pub struct OperationQuirks { /// Additional parameters for the operation #[serde(default)] pub parameters: HashMap, + + /// 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, } /// Quirks for a specific package @@ -75,3 +81,31 @@ pub fn get_deb_extra_dependencies(package: &str) -> Vec { 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` - List of package directories to try, or empty vector if none +pub fn get_package_directories(package: &str) -> Vec { + 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() +}