Skip to content

Commit 2b72975

Browse files
committed
fix(install): handle removed packages, always show selection with --show
1 parent c6150f7 commit 2b72975

2 files changed

Lines changed: 38 additions & 13 deletions

File tree

crates/soar-cli/src/install.rs

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -344,15 +344,15 @@ fn resolve_packages(
344344
.map(|p| (p.pkg_id, p.repo_name, p.version))
345345
.collect();
346346

347-
let pkg = if repo_pkgs.len() > 1 {
348-
select_package_interactively_with_installed(
349-
repo_pkgs,
350-
&query.name.clone().unwrap_or(package.clone()),
351-
&installed_packages,
352-
)?
353-
.unwrap()
354-
} else {
355-
repo_pkgs.into_iter().next().unwrap()
347+
// Always show interactive selection when --show is used
348+
let pkg = select_package_interactively_with_installed(
349+
repo_pkgs,
350+
&query.name.clone().unwrap_or(package.clone()),
351+
&installed_packages,
352+
)?;
353+
354+
let Some(pkg) = pkg else {
355+
continue;
356356
};
357357

358358
// Check if this specific package is already installed
@@ -730,9 +730,9 @@ fn select_package(
730730
yes: bool,
731731
existing_install: &Option<soar_core::database::models::InstalledPackage>,
732732
) -> SoarResult<Option<Package>> {
733-
// If we have an existing install, use its details to find the package
733+
// If we have an existing install, try to find it in its original repo first
734734
let packages: Vec<Package> = if let Some(existing) = existing_install {
735-
metadata_mgr
735+
let existing_pkgs: Vec<Package> = metadata_mgr
736736
.query_repo(&existing.repo_name, |conn| {
737737
MetadataRepository::find_filtered(
738738
conn,
@@ -750,7 +750,32 @@ fn select_package(
750750
pkg.repo_name = existing.repo_name.clone();
751751
pkg
752752
})
753-
.collect()
753+
.collect();
754+
755+
// If package not found in original repo (repo removed or package removed),
756+
// fall back to searching all repos by package name
757+
if existing_pkgs.is_empty() {
758+
metadata_mgr.query_all_flat(|repo_name, conn| {
759+
let pkgs = MetadataRepository::find_filtered(
760+
conn,
761+
query.name.as_deref(),
762+
query.pkg_id.as_deref(),
763+
query.version.as_deref(),
764+
None,
765+
None,
766+
)?;
767+
Ok(pkgs
768+
.into_iter()
769+
.map(|p| {
770+
let mut pkg: Package = p.into();
771+
pkg.repo_name = repo_name.to_string();
772+
pkg
773+
})
774+
.collect())
775+
})?
776+
} else {
777+
existing_pkgs
778+
}
754779
} else if let Some(ref repo_name) = query.repo_name {
755780
metadata_mgr
756781
.query_repo(repo_name, |conn| {

crates/soar-cli/src/utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ pub fn select_package_interactively_with_installed<T: PackageExt>(
126126
package_name: &str,
127127
installed: &[(String, String, String)], // (pkg_id, repo_name, version)
128128
) -> SoarResult<Option<T>> {
129-
info!("Multiple packages found for {package_name}");
129+
info!("Showing available packages for {package_name}");
130130
for (idx, pkg) in pkgs.iter().enumerate() {
131131
let is_installed = installed.iter().any(|(pkg_id, repo_name, _version)| {
132132
pkg.pkg_id() == pkg_id && pkg.repo_name() == repo_name

0 commit comments

Comments
 (0)