diff --git a/rust/agama-software/src/model/software_selection.rs b/rust/agama-software/src/model/software_selection.rs index 2371dbd678..f5ef733db0 100644 --- a/rust/agama-software/src/model/software_selection.rs +++ b/rust/agama-software/src/model/software_selection.rs @@ -24,8 +24,8 @@ use crate::Resolvable; /// A selection of resolvables to be installed. /// -/// It holds a selection of patterns and packages to be installed and whether they are optional or -/// not. This class is similar to the `PackagesProposal` YaST module. +/// It holds a selection of patterns and packages to be installed and whether they should be +/// skipped if missing. This class is similar to the `PackagesProposal` YaST module. #[derive(Default)] pub struct SoftwareSelection(HashMap>); @@ -33,7 +33,6 @@ impl SoftwareSelection { /// Updates a set of resolvables. /// /// * `id` - The id of the set. - /// * `optional` - Whether the selection is optional or not. /// * `resolvables` - The resolvables included in the set. pub fn set(&mut self, id: &str, resolvables: Vec) { self.0.insert(id.to_string(), resolvables); diff --git a/rust/agama-software/src/model/state.rs b/rust/agama-software/src/model/state.rs index 291bf79a34..c97c473034 100644 --- a/rust/agama-software/src/model/state.rs +++ b/rust/agama-software/src/model/state.rs @@ -177,7 +177,9 @@ impl<'a> SoftwareStateBuilder<'a> { state.resolvables.add_or_replace( "kernel-default", ResolvableType::Package, - ResolvableSelection::AutoSelected { optional: false }, + ResolvableSelection::AutoSelected { + skip_if_missing: false, + }, ); // FIPS enabled, so add fips pattern @@ -186,7 +188,9 @@ impl<'a> SoftwareStateBuilder<'a> { state.resolvables.add_or_replace( "fips", ResolvableType::Pattern, - ResolvableSelection::AutoSelected { optional: false }, + ResolvableSelection::AutoSelected { + skip_if_missing: false, + }, ); } } @@ -318,7 +322,9 @@ impl<'a> SoftwareStateBuilder<'a> { for resolvable in selection.resolvables() { state.resolvables.add_or_replace_resolvable( &resolvable, - ResolvableSelection::AutoSelected { optional: false }, + ResolvableSelection::AutoSelected { + skip_if_missing: false, + }, ); } } @@ -362,7 +368,9 @@ impl<'a> SoftwareStateBuilder<'a> { resolvables.add_or_replace( pattern, ResolvableType::Pattern, - ResolvableSelection::AutoSelected { optional: false }, + ResolvableSelection::AutoSelected { + skip_if_missing: false, + }, ); } @@ -370,7 +378,9 @@ impl<'a> SoftwareStateBuilder<'a> { resolvables.add_or_replace( pattern, ResolvableType::Pattern, - ResolvableSelection::AutoSelected { optional: true }, + ResolvableSelection::AutoSelected { + skip_if_missing: true, + }, ); } @@ -390,7 +400,9 @@ impl<'a> SoftwareStateBuilder<'a> { resolvables.add_or_replace( package, ResolvableType::Package, - ResolvableSelection::AutoSelected { optional: false }, + ResolvableSelection::AutoSelected { + skip_if_missing: false, + }, ); } @@ -398,7 +410,9 @@ impl<'a> SoftwareStateBuilder<'a> { resolvables.add_or_replace( package, ResolvableType::Package, - ResolvableSelection::AutoSelected { optional: true }, + ResolvableSelection::AutoSelected { + skip_if_missing: true, + }, ); } @@ -487,8 +501,8 @@ impl ResolvablesState { selection: ResolvableSelection, ) { if let Some(entry) = self.0.get(&(name.to_string(), r#type)) { - if let ResolvableSelection::AutoSelected { optional: _ } = entry { - tracing::debug!("Could not modify the {name} state because it is mandatory."); + if let ResolvableSelection::AutoSelected { .. } = entry { + tracing::debug!("Could not modify the {name} state because it is auto selected."); return; } } @@ -543,17 +557,18 @@ impl ResolvablesState { pub enum ResolvableSelection { /// Selected by the user. Selected, - /// Selected by the installer itself and whether it is optional or not. - AutoSelected { optional: bool }, + /// Selected by the installer itself and whether it should be skipped if missing. + AutoSelected { skip_if_missing: bool }, /// Removed by the user. It allows to remove resolvables that might be auto-selected /// by the solver (e.g., recommended patterns). Removed, } impl ResolvableSelection { - pub fn is_optional(&self) -> bool { - if let ResolvableSelection::AutoSelected { optional } = self { - return *optional; + /// Returns true if the resolvable is auto-selected and should be skipped if missing. + pub fn skip_if_missing(&self) -> bool { + if let ResolvableSelection::AutoSelected { skip_if_missing } = self { + return *skip_if_missing; } false @@ -562,7 +577,7 @@ impl ResolvableSelection { pub fn selected(&self) -> bool { match self { ResolvableSelection::Selected => true, - ResolvableSelection::AutoSelected { optional: _ } => true, + ResolvableSelection::AutoSelected { skip_if_missing: _ } => true, _ => false, } } @@ -572,7 +587,7 @@ impl From for zypp_agama::ResolvableSelected { fn from(value: ResolvableSelection) -> Self { match value { ResolvableSelection::Selected => zypp_agama::ResolvableSelected::User, - ResolvableSelection::AutoSelected { optional: _ } => { + ResolvableSelection::AutoSelected { skip_if_missing: _ } => { zypp_agama::ResolvableSelected::Installation } ResolvableSelection::Removed => zypp_agama::ResolvableSelected::Not, @@ -704,17 +719,23 @@ mod tests { ( "NetworkManager".to_string(), ResolvableType::Package, - ResolvableSelection::AutoSelected { optional: false } + ResolvableSelection::AutoSelected { + skip_if_missing: false + } ), ( "enhanced_base".to_string(), ResolvableType::Pattern, - ResolvableSelection::AutoSelected { optional: false } + ResolvableSelection::AutoSelected { + skip_if_missing: false + } ), ( "openSUSE-repos-Tumbleweed".to_string(), ResolvableType::Package, - ResolvableSelection::AutoSelected { optional: false } + ResolvableSelection::AutoSelected { + skip_if_missing: false + } ), ( "selinux".to_string(), @@ -724,7 +745,9 @@ mod tests { ( "sudo-policy-wheel-auth-self".to_string(), ResolvableType::Package, - ResolvableSelection::AutoSelected { optional: false } + ResolvableSelection::AutoSelected { + skip_if_missing: false + } ) ] ); @@ -773,7 +796,9 @@ mod tests { ( "enhanced_base".to_string(), ResolvableType::Pattern, - ResolvableSelection::AutoSelected { optional: false } + ResolvableSelection::AutoSelected { + skip_if_missing: false + } ), ( "gnome".to_string(), @@ -848,7 +873,9 @@ mod tests { ( "enhanced_base".to_string(), ResolvableType::Pattern, - ResolvableSelection::AutoSelected { optional: false } + ResolvableSelection::AutoSelected { + skip_if_missing: false + } ), ( "selinux".to_string(), @@ -883,7 +910,9 @@ mod tests { ( "enhanced_base".to_string(), ResolvableType::Pattern, - ResolvableSelection::AutoSelected { optional: false } + ResolvableSelection::AutoSelected { + skip_if_missing: false + } ), ( "selinux".to_string(), @@ -915,7 +944,9 @@ mod tests { ( "enhanced_base".to_string(), ResolvableType::Pattern, - ResolvableSelection::AutoSelected { optional: false } + ResolvableSelection::AutoSelected { + skip_if_missing: false + } ), ( "gnome".to_string(), @@ -990,17 +1021,23 @@ mod tests { ( "NetworkManager".to_string(), ResolvableType::Package, - ResolvableSelection::AutoSelected { optional: false } + ResolvableSelection::AutoSelected { + skip_if_missing: false + } ), ( "openSUSE-repos-Tumbleweed".to_string(), ResolvableType::Package, - ResolvableSelection::AutoSelected { optional: false } + ResolvableSelection::AutoSelected { + skip_if_missing: false + } ), ( "sudo-policy-wheel-auth-self".to_string(), ResolvableType::Package, - ResolvableSelection::AutoSelected { optional: false } + ResolvableSelection::AutoSelected { + skip_if_missing: false + } ) ] ); @@ -1028,7 +1065,9 @@ mod tests { Some(( "kernel-default".to_string(), ResolvableType::Package, - ResolvableSelection::AutoSelected { optional: false } + ResolvableSelection::AutoSelected { + skip_if_missing: false + } )) ); } diff --git a/rust/agama-software/src/zypp_server.rs b/rust/agama-software/src/zypp_server.rs index d2f481402b..f52dd8a677 100644 --- a/rust/agama-software/src/zypp_server.rs +++ b/rust/agama-software/src/zypp_server.rs @@ -416,13 +416,13 @@ impl ZyppServer { } for (name, r#type, selection) in &state.resolvables.to_vec() { match selection { - ResolvableSelection::AutoSelected { optional } => { + ResolvableSelection::AutoSelected { skip_if_missing } => { issues.append(&mut self.select_resolvable( &zypp, name, *r#type, zypp_agama::ResolvableSelected::Installation, - *optional, + *skip_if_missing, )); } ResolvableSelection::Selected => { @@ -472,14 +472,17 @@ impl ZyppServer { name: &str, r#type: ResolvableType, reason: zypp_agama::ResolvableSelected, - optional: bool, + skip_if_missing: bool, ) -> Vec { let mut issues = vec![]; let result = zypp.select_resolvable(name, r#type.into(), reason); if let Err(error) = result { - if optional { - tracing::info!("Could not select '{}' but it is optional.", name); + if skip_if_missing { + tracing::info!( + "Could not select '{}' but it should be skipped if missing.", + name + ); } else { let message = format!("Could not select '{}'", name); issues.push(