diff --git a/src/commands/compose/composer.rs b/src/commands/compose/composer.rs
index 92302ed7..dbb36207 100644
--- a/src/commands/compose/composer.rs
+++ b/src/commands/compose/composer.rs
@@ -24,7 +24,7 @@ impl TreeComposer {
let package_manager = PackageManager::new(options)?;
let ostree_integration = OstreeIntegration::new(options.repo.as_deref(), &workdir)?;
- let container_generator = ContainerGenerator::new(&workdir, &std::path::PathBuf::from(options.repo.as_deref().unwrap_or("/var/lib/apt-ostree/repo")));
+ let container_generator = ContainerGenerator::new(&workdir, &workdir.join("repo"));
Ok(Self {
workdir,
@@ -41,9 +41,12 @@ impl TreeComposer {
// Step 1: Set up build environment
self.setup_build_environment(treefile).await?;
- // Step 2: Initialize base system
+ // Step 2: Initialize base system FIRST (this creates the build root with basic tools)
if let Some(base_image) = &treefile.base_image {
self.package_manager.initialize_base_system(base_image).await?;
+ } else {
+ // Use default base image if none specified
+ self.package_manager.initialize_base_system("trixie").await?;
}
// Step 3: Configure package sources
@@ -51,17 +54,17 @@ impl TreeComposer {
self.package_manager.setup_package_sources(&treefile.repositories).await?;
}
- // Step 4: Update package cache
+ // Step 4: Update package cache (now that we have apt-get in the build root)
self.package_manager.update_cache().await?;
// Step 5: Install base packages
if let Some(packages) = &treefile.packages.base {
- self.install_packages(packages, "base").await?;
+ self.package_manager.install_packages(packages, "base").await?;
}
// Step 6: Install additional packages
if let Some(packages) = &treefile.packages.additional {
- self.install_packages(packages, "additional").await?;
+ self.package_manager.install_packages(packages, "additional").await?;
}
// Step 7: Apply customizations
@@ -76,18 +79,22 @@ impl TreeComposer {
self.package_manager.update_package_database().await?;
// Step 10: Initialize OSTree repository
- self.ostree_integration.init_repository().await?;
+ let mut ostree_integration = OstreeIntegration::new(
+ Some(&self.workdir.join("repo").to_string_lossy()),
+ &self.workdir
+ )?;
+ ostree_integration.init_repository().await?;
// Step 11: Create OSTree commit
let parent_ref = self.get_parent_reference(treefile).await?;
- let build_root = self.workdir.join("build-root");
- let commit_hash = self.ostree_integration.create_commit(&treefile.metadata, parent_ref.as_deref(), &build_root).await?;
+ let build_root = self.package_manager.get_build_root();
+ let commit_hash = ostree_integration.create_commit(&treefile.metadata, parent_ref.as_deref(), build_root).await?;
// Step 12: Update reference
- self.ostree_integration.update_reference(&treefile.metadata.ref_name, &commit_hash).await?;
+ ostree_integration.update_reference(&treefile.metadata.ref_name, &commit_hash).await?;
// Step 13: Create repository summary
- self.ostree_integration.create_summary().await?;
+ ostree_integration.create_summary().await?;
// Step 14: Generate container image if requested
if let Some(output_config) = &treefile.output {
@@ -98,147 +105,97 @@ impl TreeComposer {
println!("✅ Tree composition completed successfully");
println!("Commit hash: {}", commit_hash);
- println!("Reference: {}", treefile.metadata.ref_name);
-
- // Step 15: Clean up build artifacts (after everything is done)
- self.cleanup_build_artifacts().await?;
Ok(commit_hash)
}
-
+
/// Set up the build environment
- async fn setup_build_environment(&self, treefile: &Treefile) -> AptOstreeResult<()> {
+ async fn setup_build_environment(&self, _treefile: &Treefile) -> AptOstreeResult<()> {
println!("Setting up build environment...");
- // Create working directory
+ // Ensure working directory exists
std::fs::create_dir_all(&self.workdir)
- .map_err(|e| AptOstreeError::System(format!("Failed to create work directory: {}", e)))?;
+ .map_err(|e| AptOstreeError::System(format!("Failed to create workdir: {}", e)))?;
- // Create build root directory
+ // Create subdirectories
let build_root = self.workdir.join("build-root");
- if build_root.exists() {
- std::fs::remove_dir_all(&build_root)
- .map_err(|e| AptOstreeError::System(format!("Failed to clean build root: {}", e)))?;
- }
- std::fs::create_dir_all(&build_root)
- .map_err(|e| AptOstreeError::System(format!("Failed to create build root: {}", e)))?;
+ let repo_dir = self.workdir.join("repo");
- // Initialize base system using debootstrap (this creates the actual system with APT tools)
- println!("Initializing base system with debootstrap...");
- self.package_manager.initialize_base_system("debian:trixie").await?;
+ std::fs::create_dir_all(&build_root)
+ .map_err(|e| AptOstreeError::System(format!("Failed to create build-root: {}", e)))?;
+
+ std::fs::create_dir_all(&repo_dir)
+ .map_err(|e| AptOstreeError::System(format!("Failed to create repo: {}", e)))?;
println!("✅ Build environment set up successfully");
Ok(())
}
-
- /// Install packages
- async fn install_packages(&self, packages: &[String], category: &str) -> AptOstreeResult<()> {
- println!("Installing {} packages: {:?}", category, packages);
-
- // Resolve dependencies first
- let all_packages = self.package_manager.resolve_dependencies(packages).await?;
- println!("Resolved {} packages (including dependencies)", all_packages.len());
-
- // Install packages
- for (i, package) in all_packages.iter().enumerate() {
- println!("[{}/{}] Installing {}", i + 1, all_packages.len(), package);
- self.package_manager.install_package(package).await?;
- }
-
- println!("✅ {} packages installed successfully", category);
- Ok(())
+
+ /// Get parent reference for incremental builds
+ async fn get_parent_reference(&self, treefile: &Treefile) -> AptOstreeResult