diff --git a/src/apt.rs b/src/apt.rs new file mode 100644 index 00000000..e0d064cc --- /dev/null +++ b/src/apt.rs @@ -0,0 +1,5 @@ +//! APT compatibility module +//! +//! This module provides APT package management functionality for OSTree systems. + +pub use crate::apt_compat::*; diff --git a/src/apt_database.rs b/src/apt_database.rs index f280a870..56c815a5 100644 --- a/src/apt_database.rs +++ b/src/apt_database.rs @@ -11,7 +11,7 @@ use serde::{Deserialize, Serialize}; use chrono; use tracing::{info, warn, debug}; use crate::error::AptOstreeResult; -use crate::apt_ostree_integration::DebPackageMetadata; +use crate::dependency_resolver::DebPackageMetadata; /// APT database state for OSTree deployments #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/src/apt_ostree_integration.rs b/src/apt_ostree_integration.rs new file mode 100644 index 00000000..70e942d4 --- /dev/null +++ b/src/apt_ostree_integration.rs @@ -0,0 +1,68 @@ +//! APT-OSTree Integration Module +//! +//! This module provides the essential types and structures needed for APT-OSTree integration. + +use std::path::{Path, PathBuf}; +use serde::{Serialize, Deserialize}; +use crate::error::AptOstreeResult; +use crate::dependency_resolver::DebPackageMetadata; + +/// OSTree-specific APT configuration +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct OstreeAptConfig { + /// APT database location (read-only in OSTree deployments) + pub apt_db_path: PathBuf, + /// Package cache location (OSTree repository) + pub package_cache_path: PathBuf, + /// Script execution environment + pub script_env_path: PathBuf, + /// Temporary working directory for package operations + pub temp_work_path: PathBuf, + /// OSTree repository path + pub ostree_repo_path: PathBuf, + /// Current deployment path + pub deployment_path: PathBuf, +} + +impl Default for OstreeAptConfig { + fn default() -> Self { + Self { + apt_db_path: PathBuf::from("/usr/share/apt"), + package_cache_path: PathBuf::from("/var/lib/apt-ostree/cache"), + script_env_path: PathBuf::from("/var/lib/apt-ostree/scripts"), + temp_work_path: PathBuf::from("/var/lib/apt-ostree/temp"), + ostree_repo_path: PathBuf::from("/var/lib/apt-ostree/repo"), + deployment_path: PathBuf::from("/var/lib/apt-ostree/deployments"), + } + } +} + +/// Package to OSTree conversion manager +pub struct PackageOstreeConverter { + config: OstreeAptConfig, +} + +impl PackageOstreeConverter { + /// Create a new package to OSTree converter + pub fn new(config: OstreeAptConfig) -> Self { + Self { config } + } + + /// Extract metadata from DEB package + pub async fn extract_deb_metadata(&self, _deb_path: &Path) -> AptOstreeResult { + // TODO: Implement actual DEB metadata extraction + // For now, return a placeholder + Ok(DebPackageMetadata { + name: "placeholder".to_string(), + version: "0.0.0".to_string(), + architecture: "amd64".to_string(), + description: "Placeholder package description".to_string(), + depends: vec![], + conflicts: vec![], + provides: vec![], + breaks: vec![], + replaces: vec![], + scripts: std::collections::HashMap::new(), + }) + } +} diff --git a/src/dependency_resolver.rs b/src/dependency_resolver.rs index 24687f09..d9dfe7c7 100644 --- a/src/dependency_resolver.rs +++ b/src/dependency_resolver.rs @@ -15,11 +15,13 @@ pub struct DebPackageMetadata { pub name: String, pub version: String, pub architecture: String, + pub description: String, pub depends: Vec, pub conflicts: Vec, pub provides: Vec, pub breaks: Vec, pub replaces: Vec, + pub scripts: std::collections::HashMap, } /// Dependency relationship types diff --git a/src/filesystem_assembly.rs b/src/filesystem_assembly.rs index 5799e27c..d94cb16d 100644 --- a/src/filesystem_assembly.rs +++ b/src/filesystem_assembly.rs @@ -14,7 +14,7 @@ use std::pin::Pin; use std::future::Future; use crate::error::AptOstreeResult; -use crate::apt_ostree_integration::DebPackageMetadata; +use crate::dependency_resolver::DebPackageMetadata; /// Filesystem assembly manager pub struct FilesystemAssembler { diff --git a/src/lib.rs b/src/lib.rs index a8045ee1..a339aca9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,12 +2,25 @@ //! //! A Debian/Ubuntu equivalent of rpm-ostree for managing packages in OSTree-based systems. +pub mod apt; pub mod apt_compat; pub mod error; pub mod dependency_resolver; pub mod ostree_integration; pub mod error_recovery; +pub mod package_manager; +pub mod ostree; +pub mod test_support; +pub mod apt_database; +pub mod bubblewrap_sandbox; +pub mod ostree_commit_manager; +pub mod apt_ostree_integration; +pub mod filesystem_assembly; +pub mod script_execution; pub use apt_compat::AptManager; pub use error::{AptOstreeError, AptOstreeResult}; pub use dependency_resolver::{DependencyResolver, DependencyConstraint, DependencyRelation, DependencyGraph, ResolvedDependencies}; +pub use package_manager::PackageManager; +pub use ostree::OstreeManager; +pub use test_support::{TestResult, TestConfig}; diff --git a/src/ostree_commit_manager.rs b/src/ostree_commit_manager.rs index 953ba72b..a8af356a 100644 --- a/src/ostree_commit_manager.rs +++ b/src/ostree_commit_manager.rs @@ -9,7 +9,7 @@ use serde::{Serialize, Deserialize}; use chrono::{DateTime, Utc}; use crate::error::{AptOstreeError, AptOstreeResult}; -use crate::apt_ostree_integration::DebPackageMetadata; +use crate::dependency_resolver::DebPackageMetadata; /// OSTree commit metadata #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/src/package_manager.rs b/src/package_manager.rs index f7bd344a..9e9d24a0 100644 --- a/src/package_manager.rs +++ b/src/package_manager.rs @@ -15,7 +15,7 @@ use crate::ostree::OstreeManager; use crate::apt_database::{AptDatabaseManager, AptDatabaseConfig, InstalledPackage}; use crate::bubblewrap_sandbox::{ScriptSandboxManager, BubblewrapConfig}; use crate::ostree_commit_manager::{OstreeCommitManager, CommitOptions, DeploymentType}; -use crate::apt_ostree_integration::DebPackageMetadata; +use crate::dependency_resolver::DebPackageMetadata; use crate::filesystem_assembly::FilesystemAssembler; use crate::dependency_resolver::DependencyResolver; use crate::script_execution::{ScriptOrchestrator, ScriptConfig}; @@ -391,7 +391,21 @@ impl PackageManager { let mut resolved_packages = Vec::new(); for package_name in package_names { - let package_metadata = self.apt_manager.get_package_metadata_by_name(package_name).await?; + let package_info = self.apt_manager.get_package_metadata_by_name(package_name).await?; + + // Convert PackageInfo to DebPackageMetadata + let package_metadata = DebPackageMetadata { + name: package_info.name, + version: package_info.version, + architecture: package_info.architecture, + description: package_info.description, + depends: package_info.depends, + conflicts: package_info.conflicts, + provides: package_info.provides, + breaks: vec![], + replaces: vec![], + scripts: package_info.scripts, + }; // Resolve dependencies first if !package_metadata.depends.is_empty() { @@ -400,7 +414,20 @@ impl PackageManager { // Convert resolved dependencies back to metadata for package_name in &dependencies.packages { let metadata = self.apt_manager.get_package_metadata_by_name(package_name).await?; - resolved_packages.push(metadata); + // Convert PackageInfo to DebPackageMetadata + let deb_metadata = DebPackageMetadata { + name: metadata.name, + version: metadata.version, + architecture: metadata.architecture, + description: metadata.description, + depends: metadata.depends, + conflicts: metadata.conflicts, + provides: metadata.provides, + breaks: vec![], + replaces: vec![], + scripts: metadata.scripts, + }; + resolved_packages.push(deb_metadata); } } diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index ed96a2f1..c6ebccfd 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -79,11 +79,13 @@ async fn run_package_installation_test(temp_dir: &TempDir) -> AptOstreeResult<() name: "test-package".to_string(), version: "1.0.0".to_string(), architecture: "amd64".to_string(), + description: "Test package for dependency resolution".to_string(), depends: vec![], // No dependencies to avoid complex resolution conflicts: vec![], provides: vec![], breaks: vec![], replaces: vec![], + scripts: std::collections::HashMap::new(), }; resolver.add_available_packages(vec![test_package]); @@ -116,22 +118,26 @@ async fn run_dependency_resolution_test() -> AptOstreeResult<()> { name: "package-a".to_string(), version: "1.0.0".to_string(), architecture: "amd64".to_string(), + description: "Package A with dependency on Package B".to_string(), depends: vec!["package-b".to_string()], conflicts: vec![], provides: vec![], breaks: vec![], replaces: vec![], + scripts: std::collections::HashMap::new(), }; let package_b = DebPackageMetadata { name: "package-b".to_string(), version: "1.0.0".to_string(), architecture: "amd64".to_string(), + description: "Package B with dependency on Package A".to_string(), depends: vec!["package-a".to_string()], conflicts: vec![], provides: vec![], breaks: vec![], replaces: vec![], + scripts: std::collections::HashMap::new(), }; resolver.add_available_packages(vec![package_a, package_b]);