diff options
| -rw-r--r-- | src/cli.rs | 15 | ||||
| -rw-r--r-- | tests/cli.rs | 34 |
2 files changed, 45 insertions, 4 deletions
@@ -101,8 +101,17 @@ pub fn run(cli: Cli) -> Result<()> { } fn load_artifact(path: &std::path::Path) -> Result<ArtifactManifest> { - match path.extension().and_then(|extension| extension.to_str()) { - Some("toml") => ArtifactManifest::load(path), - _ => ArtifactManifest::collect_archive(path), + if matches!(path.extension().and_then(|extension| extension.to_str()), Some("toml")) { + return ArtifactManifest::load(path); + } + + // A completed native build writes richer package and initramfs facts beside + // its tarball. Prefer that project-owned semantic record while retaining + // direct legacy-tar inspection when no companion is available. + let companion = ArtifactManifest::path_beside(path)?; + if companion.is_file() { + ArtifactManifest::load(companion) + } else { + ArtifactManifest::collect_archive(path) } } diff --git a/tests/cli.rs b/tests/cli.rs index b800e68..648962b 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -1,7 +1,11 @@ +use std::fs; use std::path::PathBuf; -use alt_controller_image::cli::{Cli, Command}; +use alt_controller_image::archive::NativeTarWriter; +use alt_controller_image::cli::{run, Cli, Command}; +use alt_controller_image::manifest::{ArtifactManifest, PackageRecord}; use clap::Parser; +use tempfile::tempdir; #[test] fn parses_plan_with_an_explicit_spec_path() { @@ -69,3 +73,31 @@ fn parses_compare_with_explicit_artifact_paths() { if left == PathBuf::from("legacy.tar") && right == PathBuf::from("native.tar") )); } + +#[test] +fn compare_uses_companion_manifests_for_tar_artifacts() { + let fixture = tempdir().expect("temporary directory"); + let rootfs = fixture.path().join("rootfs"); + fs::create_dir_all(&rootfs).expect("create rootfs"); + let left = fixture.path().join("left.tar"); + let right = fixture.path().join("right.tar"); + NativeTarWriter::new().write(&rootfs, &left).expect("write left archive"); + NativeTarWriter::new().write(&rootfs, &right).expect("write right archive"); + ArtifactManifest::new( + vec![PackageRecord::new("controller", "1.0")], vec![], None, vec![], vec![], + ) + .expect("left manifest") + .write_beside(&left) + .expect("write left companion manifest"); + ArtifactManifest::new( + vec![PackageRecord::new("controller", "2.0")], vec![], None, vec![], vec![], + ) + .expect("right manifest") + .write_beside(&right) + .expect("write right companion manifest"); + + let error = run(Cli { command: Command::Compare { left, right } }) + .expect_err("companion package difference must be reported"); + + assert!(error.to_string().contains("artifacts differ semantically")); +} |