summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/manifest.rs16
-rw-r--r--tests/compare.rs23
2 files changed, 37 insertions, 2 deletions
diff --git a/src/manifest.rs b/src/manifest.rs
index afbf5d6..b3e489d 100644
--- a/src/manifest.rs
+++ b/src/manifest.rs
@@ -136,7 +136,13 @@ impl ArtifactManifest {
}
}
- Self::new(Vec::new(), files, initrd, services, archive_members)
+ Self::new(
+ Vec::new(),
+ files,
+ initrd,
+ coalesce_enabled_services(services),
+ archive_members,
+ )
}
}
@@ -176,7 +182,13 @@ fn collect_services(rootfs: &Path) -> Result<Vec<ServiceRecord>> {
services.push(ServiceRecord::new(name, true));
}
}
- Ok(services)
+ Ok(coalesce_enabled_services(services))
+}
+
+fn coalesce_enabled_services(mut services: Vec<ServiceRecord>) -> Vec<ServiceRecord> {
+ services.sort_by(|left, right| left.name.cmp(&right.name));
+ services.dedup_by(|left, right| left.name == right.name);
+ services
}
fn collect_archive_members(archive_path: &Path) -> Result<Vec<ArchiveMemberRecord>> {
diff --git a/tests/compare.rs b/tests/compare.rs
index 0bb2fff..fded37f 100644
--- a/tests/compare.rs
+++ b/tests/compare.rs
@@ -289,3 +289,26 @@ fn native_manifest_collection_excludes_internal_members_from_its_archive_facts()
.iter()
.all(|record| !record.path.starts_with(".host/") && !record.path.starts_with(".fakedata/")));
}
+
+#[test]
+fn archive_collection_coalesces_a_service_enabled_by_multiple_targets() {
+ let fixture = tempdir().expect("temporary directory");
+ let rootfs = fixture.path().join("rootfs");
+ for target in ["multi-user.target.wants", "graphical.target.wants"] {
+ let wants = rootfs.join("etc/systemd/system").join(target);
+ fs::create_dir_all(&wants).expect("create service state directory");
+ symlink(
+ "/usr/lib/systemd/system/controller.service",
+ wants.join("controller.service"),
+ )
+ .expect("enable service");
+ }
+ let artifact = fixture.path().join("controller.tar");
+ NativeTarWriter::new()
+ .write(&rootfs, &artifact)
+ .expect("write native archive");
+
+ let manifest = ArtifactManifest::collect_archive(&artifact).expect("collect archive facts");
+
+ assert_eq!(manifest.services, vec![ServiceRecord::new("controller.service", true)]);
+}