diff --git a/src/config.rs b/src/config.rs index 71c3025..2599bfe 100644 --- a/src/config.rs +++ b/src/config.rs @@ -62,7 +62,7 @@ pub(crate) struct PackageConfig { /// Defaults to false, to produce smaller container images. #[serde(default = "docs_default")] pub(crate) docs: bool, - /// Whether to include /etc/os-release as a dependency. + /// Whether to include /etc/os-release as a dependency during dependency resolution. /// Defaults to true, so that scanning tools can detect /// the distro of images produced by rpmoci without users /// needing to add the -release package. diff --git a/src/lockfile/mod.rs b/src/lockfile/mod.rs index 4298bf0..a4269d8 100644 --- a/src/lockfile/mod.rs +++ b/src/lockfile/mod.rs @@ -132,8 +132,7 @@ impl Lockfile { .flat_map(|p| p.requires) .collect(); - Ok(self.pkg_specs == cfg.contents.packages - && self.global_key_specs == cfg.contents.gpgkeys + Ok(self.is_compatible(cfg) // Verify dependencies of all local packages && Self::read_local_rpm_deps(cfg)? == local_package_deps) } diff --git a/src/lockfile/resolve.rs b/src/lockfile/resolve.rs index 6f82551..17840e9 100644 --- a/src/lockfile/resolve.rs +++ b/src/lockfile/resolve.rs @@ -28,10 +28,12 @@ use super::{DnfOutput, Lockfile}; use crate::config::Config; use crate::config::Repository; +const ETC_OS_RELEASE: &str = "/etc/os-release"; + impl Lockfile { /// Perform dependency resolution on the given package specs pub(crate) fn resolve( - mut pkg_specs: Vec, + pkg_specs: Vec, repositories: &[Repository], gpgkeys: Vec, include_etc_os_release: bool, @@ -42,12 +44,16 @@ impl Lockfile { PyModule::from_code(py, include_str!("resolve.py"), "resolve", "resolve")?; let base = setup_base(py, repositories, &gpgkeys)?; - let etc_os_release = "/etc/os-release".to_string(); - if include_etc_os_release && !pkg_specs.contains(&etc_os_release) { - pkg_specs.push(etc_os_release); - } + let etc_os_release = ETC_OS_RELEASE.to_string(); + let specs = if include_etc_os_release && !pkg_specs.contains(&etc_os_release) { + let mut specs = pkg_specs.clone(); + specs.push(etc_os_release.to_string()); + specs + } else { + pkg_specs.clone() + }; - let args = PyTuple::new(py, &[base.to_object(py), pkg_specs.to_object(py)]); + let args = PyTuple::new(py, &[base.to_object(py), specs.to_object(py)]); // Run the resolve function, returning a json string, which we shall deserialize. let val: String = resolve.getattr("resolve")?.call1(args)?.extract()?; Ok::<_, anyhow::Error>(val)