use anyhow::{Result, anyhow};
use crate::pkg::{self};
pub fn run(
package_name: &str,
yes: bool,
plugin_manager: Option<&crate::pkg::plugin::PluginManager>
) -> Result<()> {
let request = pkg::resolve::parse_source_string(package_name)?;
let mut candidates = Vec::new();
for scope in [
pkg::types::Scope::User,
pkg::types::Scope::System,
pkg::types::Scope::Project
] {
candidates.extend(pkg::local::find_installed_manifests_matching(
&request, scope
)?);
}
if candidates.is_empty() {
return Err(anyhow!("Package '{package_name}' is not installed."));
}
let chosen = crate::cmd::installed_select::choose_installed_manifest(
package_name,
&candidates,
yes
)?;
if let Some(pm) = plugin_manager {
pm.set_context(chosen.scope)?;
pm.trigger_hook("on_rollback", None)?;
}
pkg::rollback::run(&pkg::local::installed_manifest_source(&chosen), yes)
}