diff --git a/src/analyzer/mod.rs b/src/analyzer/mod.rs index 5560064..c934a13 100644 --- a/src/analyzer/mod.rs +++ b/src/analyzer/mod.rs @@ -1,3 +1,10 @@ +use rpm_rs::rpm::{ + get_installed_packages, + Package, +}; + +use rpm_rs::rpmio::rpmvercmp; + use crate::cli::Cli; pub mod db; @@ -35,5 +42,36 @@ fn repoter(cli: &Cli) -> crate::Result<()> { } fn summary(cli: &Cli) -> crate::Result<()> { + // 当前系统所有已安装的 rpm 包 + let installed = get_installed_packages(); + // installed 已被消费掉 + // latest_installed 是所有最新版本软件包的 Vec + let latest_installed: Vec = installed.into_iter().map(|(_, pkgs)| { + let mut latest = pkgs[0].clone(); + for pkg in pkgs.into_iter() { + latest = rpmdb_package_vercmp(latest, pkg); + } + latest + }).collect(); + + // 列出所有已安装的软件包 + // latest_installed.iter().for_each(|pkg| println!("{}", pkg.nevra())); + Ok(()) } + +// 对比两个 rpm Package 的版本,返回最新的一个 +fn rpmdb_package_vercmp(pa: Package, pb: Package) -> Package { + // 首先进行 epoch 的比较 + match (pa.epoch(), pb.epoch()) { + (Some(_), None) => return pa, + (None, Some(_)) => return pb, + _ => {}, // 继续往下对比 + } + + if rpmvercmp(&pa.evr(), &pb.evr()) > 0 { + return pa + } else { + return pb + } +} diff --git a/src/lib.rs b/src/lib.rs index 6923b34..bd7bc79 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,5 +11,8 @@ pub type Result = std::result::Result; pub fn cumain() -> Result<()> { let cli = cli::parse(); + // 初始化使用 rpm 默认配置 + rpm_rs::configure(); + analyzer::cuvat_run(&cli) }