Great, this works now
This commit is contained in:
parent
d115716d45
commit
57105f17f3
131
src/main.rs
131
src/main.rs
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue