- ✅ Successfully compiled with apt-pkg-native for Debian Trixie compatibility - ✅ Replaced rust-apt with apt-pkg-native to resolve C++ standard issues - ✅ Simplified project structure: removed unused binaries, focused on core functionality - ✅ Basic commands working: help, list, search, info - ✅ Created apt_compat.rs compatibility layer - ✅ Updated debian packaging for libapt-pkg7.0 compatibility - ✅ Removed complex dependencies and simplified main.rs - 🎯 Next: Implement core package management commands (install, remove, upgrade) - 🎯 Architecture: Ready for atomic package management with OSTree integration
149 lines
4.7 KiB
Rust
149 lines
4.7 KiB
Rust
use std::env;
|
|
use tracing::{info, error};
|
|
|
|
mod apt_compat;
|
|
mod error;
|
|
|
|
use apt_compat::AptManager;
|
|
use error::{AptOstreeError, AptOstreeResult};
|
|
|
|
#[tokio::main]
|
|
async fn main() -> AptOstreeResult<()> {
|
|
// Initialize logging
|
|
tracing_subscriber::fmt::init();
|
|
|
|
info!("apt-ostree starting...");
|
|
|
|
let args: Vec<String> = env::args().collect();
|
|
if args.len() < 2 {
|
|
println!("Usage: {} <command> [options]", args[0]);
|
|
println!("Commands:");
|
|
println!(" search <query> - Search for packages");
|
|
println!(" list - List all packages");
|
|
println!(" installed - List installed packages");
|
|
println!(" info <package> - Show package information");
|
|
println!(" help - Show this help");
|
|
return Ok(());
|
|
}
|
|
|
|
let command = &args[1];
|
|
|
|
match command.as_str() {
|
|
"search" => {
|
|
if args.len() < 3 {
|
|
error!("Search command requires a query");
|
|
return Err(AptOstreeError::InvalidArgument("Search query required".to_string()));
|
|
}
|
|
let query = &args[2];
|
|
search_packages(query).await?;
|
|
}
|
|
"list" => {
|
|
list_packages().await?;
|
|
}
|
|
"installed" => {
|
|
list_installed_packages().await?;
|
|
}
|
|
"info" => {
|
|
if args.len() < 3 {
|
|
error!("Info command requires a package name");
|
|
return Err(AptOstreeError::InvalidArgument("Package name required".to_string()));
|
|
}
|
|
let package_name = &args[2];
|
|
show_package_info(package_name).await?;
|
|
}
|
|
"help" => {
|
|
println!("apt-ostree - Debian/Ubuntu equivalent of rpm-ostree");
|
|
println!("");
|
|
println!("Commands:");
|
|
println!(" search <query> - Search for packages");
|
|
println!(" list - List all packages");
|
|
println!(" installed - List installed packages");
|
|
println!(" info <package> - Show package information");
|
|
println!(" help - Show this help");
|
|
}
|
|
_ => {
|
|
error!("Unknown command: {}", command);
|
|
return Err(AptOstreeError::InvalidArgument(format!("Unknown command: {}", command)));
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
async fn search_packages(query: &str) -> AptOstreeResult<()> {
|
|
info!("Searching for packages matching: {}", query);
|
|
|
|
let mut apt_manager = AptManager::new()?;
|
|
let packages = apt_manager.search_packages(query).await?;
|
|
|
|
if packages.is_empty() {
|
|
println!("No packages found matching '{}'", query);
|
|
} else {
|
|
println!("Found {} packages matching '{}':", packages.len(), query);
|
|
for package in packages {
|
|
println!(" {}", package);
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
async fn list_packages() -> AptOstreeResult<()> {
|
|
info!("Listing all packages");
|
|
|
|
let mut apt_manager = AptManager::new()?;
|
|
let packages = apt_manager.list_packages();
|
|
|
|
println!("Total packages: {}", packages.len());
|
|
for package in packages.iter().take(20) { // Show first 20
|
|
println!(" {} ({})", package.name(), package.arch());
|
|
}
|
|
if packages.len() > 20 {
|
|
println!(" ... and {} more", packages.len() - 20);
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
async fn list_installed_packages() -> AptOstreeResult<()> {
|
|
info!("Listing installed packages");
|
|
|
|
let mut apt_manager = AptManager::new()?;
|
|
let packages = apt_manager.list_installed_packages();
|
|
|
|
println!("Installed packages: {}", packages.len());
|
|
for package in packages.iter().take(20) { // Show first 20
|
|
println!(" {} ({})", package.name(), package.arch());
|
|
}
|
|
if packages.len() > 20 {
|
|
println!(" ... and {} more", packages.len() - 20);
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
async fn show_package_info(package_name: &str) -> AptOstreeResult<()> {
|
|
info!("Getting package info for: {}", package_name);
|
|
|
|
let apt_manager = AptManager::new()?;
|
|
let package_info = apt_manager.get_package_info(package_name).await?;
|
|
|
|
println!("Package: {}", package_info.name);
|
|
println!("Version: {}", package_info.version);
|
|
println!("Architecture: {}", package_info.architecture);
|
|
println!("Description: {}", package_info.description);
|
|
|
|
if !package_info.depends.is_empty() {
|
|
println!("Depends: {}", package_info.depends.join(", "));
|
|
}
|
|
|
|
if !package_info.conflicts.is_empty() {
|
|
println!("Conflicts: {}", package_info.conflicts.join(", "));
|
|
}
|
|
|
|
if !package_info.provides.is_empty() {
|
|
println!("Provides: {}", package_info.provides.join(", "));
|
|
}
|
|
|
|
Ok(())
|
|
}
|