Great, this works now

This commit is contained in:
Russell 2025-07-28 19:07:04 +02:00
parent d115716d45
commit 57105f17f3
1 changed files with 107 additions and 32 deletions

View File

@ -64,6 +64,10 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
let cli = Cli::parse(); let cli = Cli::parse();
let managers = detect_available_managers(); let managers = detect_available_managers();
if managers.is_empty() {
eprintln!("Warning: No package managers detected");
}
match cli.command { match cli.command {
Commands::Tree { depth, package, source } => { Commands::Tree { depth, package, source } => {
handle_tree_command(&managers, depth, package, source)?; handle_tree_command(&managers, depth, package, source)?;
@ -92,23 +96,54 @@ fn handle_tree_command(
managers: &[Box<dyn PackageManager>], managers: &[Box<dyn PackageManager>],
_depth: Option<usize>, _depth: Option<usize>,
package_filter: Option<String>, package_filter: Option<String>,
_source_filter: Option<String> source_filter: Option<String>
) -> Result<(), Box<dyn std::error::Error>> { ) -> Result<(), Box<dyn std::error::Error>> {
if let Some(dnf) = managers.iter().find(|m| m.name() == "dnf") { let target_managers: Vec<&Box<dyn PackageManager>> = if let Some(source_name) = source_filter {
// Filter to specific manager
managers.iter().filter(|m| m.name().to_lowercase() == source_name.to_lowercase()).collect()
} else {
// Use all managers
managers.iter().collect()
};
if target_managers.is_empty() {
println!("No suitable package managers found");
return Ok(());
}
if let Some(package_name) = package_filter { if let Some(package_name) = package_filter {
// Show tree for specific package // Show tree for specific package across all managers
cli::tree::print_package_tree(dnf.as_ref(), &package_name)?; let mut found = false;
} else { for manager in &target_managers {
// Show tree for first few packages as demo match manager.get_package_info(&package_name) {
println!("Package file trees (first 5 packages):"); Ok(Some(_)) => {
let packages = dnf.get_installed_packages()?; println!("Package '{}' from {}:", package_name, manager.name());
for package in packages.iter().take(5) { cli::tree::print_package_tree(manager.as_ref(), &package_name)?;
cli::tree::print_package_tree(dnf.as_ref(), &package.name)?; found = true;
println!(); // Empty line between packages println!();
}
Ok(None) => continue,
Err(e) => eprintln!("Error checking {} in {}: {}", package_name, manager.name(), e),
} }
} }
if !found {
println!("Package '{}' not found in any package manager", package_name);
}
} else { } else {
println!("No DNF package manager found"); // Show tree for first few packages from each manager as demo
for manager in &target_managers {
match manager.get_installed_packages() {
Ok(packages) => {
println!("{} package file trees (first 3 packages):", manager.name());
for package in packages.iter().take(3) {
println!(" Package: {}", package.name);
cli::tree::print_package_tree(manager.as_ref(), &package.name)?;
println!();
}
}
Err(e) => eprintln!("Error getting packages from {}: {}", manager.name(), e),
}
}
} }
Ok(()) Ok(())
} }
@ -117,10 +152,13 @@ fn handle_package_command(
managers: &[Box<dyn PackageManager>], managers: &[Box<dyn PackageManager>],
name: &str name: &str
) -> Result<(), Box<dyn std::error::Error>> { ) -> Result<(), Box<dyn std::error::Error>> {
if let Some(dnf) = managers.iter().find(|m| m.name() == "dnf") { let mut found = false;
match dnf.get_package_info(name) {
// Search all managers for the package
for manager in managers {
match manager.get_package_info(name) {
Ok(Some(info)) => { Ok(Some(info)) => {
println!("Package: {}", info.name); println!("Package: {} (from {})", info.name, manager.name());
println!("Version: {}", info.version); println!("Version: {}", info.version);
println!("Source: {}", info.source.name()); println!("Source: {}", info.source.name());
println!("Install time: {}", info.install_time); println!("Install time: {}", info.install_time);
@ -128,18 +166,25 @@ fn handle_package_command(
// Show file tree for this package // Show file tree for this package
println!("\nFiles:"); println!("\nFiles:");
cli::tree::print_package_tree(dnf.as_ref(), name)?; cli::tree::print_package_tree(manager.as_ref(), name)?;
found = true;
println!();
} }
Ok(None) => println!("Package '{}' not found", name), Ok(None) => continue,
Err(e) => println!("Error: {}", e), Err(e) => eprintln!("Error checking {} in {}: {}", name, manager.name(), e),
} }
} }
if !found {
println!("Package '{}' not found in any package manager", name);
}
Ok(()) Ok(())
} }
fn handle_packages_command( fn handle_packages_command(
managers: &[Box<dyn PackageManager>], managers: &[Box<dyn PackageManager>],
source_filter: Option<String> // Removed the underscore! source_filter: Option<String>
) -> Result<(), Box<dyn std::error::Error>> { ) -> Result<(), Box<dyn std::error::Error>> {
if let Some(source_name) = source_filter { if let Some(source_name) = source_filter {
// Filter by specific source // Filter by specific source
@ -187,13 +232,32 @@ fn handle_file_command(
managers: &[Box<dyn PackageManager>], managers: &[Box<dyn PackageManager>],
path: &str path: &str
) -> Result<(), Box<dyn std::error::Error>> { ) -> Result<(), Box<dyn std::error::Error>> {
if let Some(dnf) = managers.iter().find(|m| m.name() == "dnf") { let path_obj = std::path::Path::new(path);
match dnf.get_file_owner(std::path::Path::new(path)) { let mut owners = Vec::new();
Ok(Some(owner)) => println!("{} is owned by package: {}", path, owner),
Ok(None) => println!("{} is not owned by any package", path), // Check all managers for file ownership
Err(e) => println!("Error checking {}: {}", path, e), for manager in managers {
match manager.get_file_owner(path_obj) {
Ok(Some(owner)) => {
owners.push((manager.name(), owner));
}
Ok(None) => continue,
Err(e) => eprintln!("Warning: Error checking {} in {}: {}", path, manager.name(), e),
} }
} }
if owners.is_empty() {
println!("{} is not owned by any package", path);
} else if owners.len() == 1 {
let (manager, owner) = &owners[0];
println!("{} is owned by package: {} ({})", path, owner, manager);
} else {
println!("{} is owned by multiple packages:", path);
for (manager, owner) in owners {
println!(" {} ({} package manager)", owner, manager);
}
}
Ok(()) Ok(())
} }
@ -204,16 +268,27 @@ fn handle_find_command(
_size: Option<String> _size: Option<String>
) -> Result<(), Box<dyn std::error::Error>> { ) -> Result<(), Box<dyn std::error::Error>> {
if let Some(package_name) = package { if let Some(package_name) = package {
if let Some(dnf) = managers.iter().find(|m| m.name() == "dnf") { let mut found = false;
match dnf.get_package_files(&package_name) {
// Search all managers for the package
for manager in managers {
match manager.get_package_files(&package_name) {
Ok(files) => { Ok(files) => {
println!("Files in package '{}':", package_name); if !files.is_empty() {
println!("Files in package '{}' from {}:", package_name, manager.name());
for file in files { for file in files {
println!(" {}", file.display()); println!(" {}", file.display());
} }
found = true;
println!();
} }
Err(e) => println!("Error: {}", e),
} }
Err(e) => eprintln!("Error checking {} in {}: {}", package_name, manager.name(), e),
}
}
if !found {
println!("Package '{}' not found in any package manager", package_name);
} }
} else { } else {
println!("Find command needs more specific criteria"); println!("Find command needs more specific criteria");