过滤出已安装的,最新版本的 rpm 包

Signed-off-by: Jia Chao <jiachao2130@126.com>
This commit is contained in:
Jia Chao 2024-07-23 10:06:35 +08:00
parent f7374af85c
commit b4c6fe6a01
2 changed files with 41 additions and 0 deletions

View File

@ -1,3 +1,10 @@
use rpm_rs::rpm::{
get_installed_packages,
Package,
};
use rpm_rs::rpmio::rpmvercmp;
use crate::cli::Cli; use crate::cli::Cli;
pub mod db; pub mod db;
@ -35,5 +42,36 @@ fn repoter(cli: &Cli) -> crate::Result<()> {
} }
fn summary(cli: &Cli) -> crate::Result<()> { fn summary(cli: &Cli) -> crate::Result<()> {
// 当前系统所有已安装的 rpm 包
let installed = get_installed_packages();
// installed 已被消费掉
// latest_installed 是所有最新版本软件包的 Vec
let latest_installed: Vec<Package> = 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(()) 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
}
}

View File

@ -11,5 +11,8 @@ pub type Result<T> = std::result::Result<T, Error>;
pub fn cumain() -> Result<()> { pub fn cumain() -> Result<()> {
let cli = cli::parse(); let cli = cli::parse();
// 初始化使用 rpm 默认配置
rpm_rs::configure();
analyzer::cuvat_run(&cli) analyzer::cuvat_run(&cli)
} }