apt-ostree/src/main.rs
joe 5b604fc3fa
Some checks failed
Build apt-ostree Package / Build apt-ostree Package (push) Failing after 3m15s
Test apt-ostree Build / Test apt-ostree Build (with existing libostree) (push) Has been cancelled
Major apt-ostree refactor: Simplified architecture, Debian Trixie compatibility
-  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
2025-08-13 13:11:26 -07:00

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(())
}