Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions rust/agama-software/src/model/software_selection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,15 @@ 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<String, Vec<Resolvable>>);

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<Resolvable>) {
self.0.insert(id.to_string(), resolvables);
Expand Down
95 changes: 67 additions & 28 deletions rust/agama-software/src/model/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
},
);
}
}
Expand Down Expand Up @@ -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,
},
);
}
}
Expand Down Expand Up @@ -362,15 +368,19 @@ impl<'a> SoftwareStateBuilder<'a> {
resolvables.add_or_replace(
pattern,
ResolvableType::Pattern,
ResolvableSelection::AutoSelected { optional: false },
ResolvableSelection::AutoSelected {
skip_if_missing: false,
},
);
}

for pattern in &software.optional_patterns {
resolvables.add_or_replace(
pattern,
ResolvableType::Pattern,
ResolvableSelection::AutoSelected { optional: true },
ResolvableSelection::AutoSelected {
skip_if_missing: true,
},
);
}

Expand All @@ -390,15 +400,19 @@ impl<'a> SoftwareStateBuilder<'a> {
resolvables.add_or_replace(
package,
ResolvableType::Package,
ResolvableSelection::AutoSelected { optional: false },
ResolvableSelection::AutoSelected {
skip_if_missing: false,
},
);
}

for package in &software.optional_packages {
resolvables.add_or_replace(
package,
ResolvableType::Package,
ResolvableSelection::AutoSelected { optional: true },
ResolvableSelection::AutoSelected {
skip_if_missing: true,
},
);
}

Expand Down Expand Up @@ -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;
}
}
Expand Down Expand Up @@ -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
Expand All @@ -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,
}
}
Expand All @@ -572,7 +587,7 @@ impl From<ResolvableSelection> 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,
Expand Down Expand Up @@ -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(),
Expand All @@ -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
}
)
]
);
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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
}
)
]
);
Expand Down Expand Up @@ -1028,7 +1065,9 @@ mod tests {
Some((
"kernel-default".to_string(),
ResolvableType::Package,
ResolvableSelection::AutoSelected { optional: false }
ResolvableSelection::AutoSelected {
skip_if_missing: false
}
))
);
}
Expand Down
13 changes: 8 additions & 5 deletions rust/agama-software/src/zypp_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 => {
Expand Down Expand Up @@ -472,14 +472,17 @@ impl ZyppServer {
name: &str,
r#type: ResolvableType,
reason: zypp_agama::ResolvableSelected,
optional: bool,
skip_if_missing: bool,
) -> Vec<Issue> {
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(
Expand Down
Loading