From 38adc62aaf0f15101ef79dfe54aeac3d43a0a59e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=9C=88?= Date: Wed, 11 Dec 2024 11:07:56 +0800 Subject: [PATCH] Add dupes packages check --- src/utils/config.py | 3 ++- src/utils/localcheck.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/utils/config.py b/src/utils/config.py index f3b4ae0..a92d037 100644 --- a/src/utils/config.py +++ b/src/utils/config.py @@ -43,7 +43,8 @@ class BaseConfig(): # localcheck LOCAL_CHECK_ERROR_INFO = { 1001:'The current system has dependency missing packages. Please verify the packages requires', - 1002:'The current system has conflicts packages. Please verify the packages' + 1002:'The current system has conflicts packages. Please verify the packages', + 1003:'The current system has dupes packages. Please verify the packages' } # util diff --git a/src/utils/localcheck.py b/src/utils/localcheck.py index cff1a51..971084a 100644 --- a/src/utils/localcheck.py +++ b/src/utils/localcheck.py @@ -73,6 +73,37 @@ class LocalCheck(object): pkgs_conflicts_dict[k] = v return pkgs_conflicts_dict + @classmethod + def check_pkgsdupes(cls): + """ + 获取本地已安装软件包中,重复安装的软件包; + 重复的软件包是多次强制安装相同名称但不同版本的软件包导致的,会造成资源浪费、依赖混乱等问题; + Returns: + dupes_dict: 重复软件包字典,键是软件包名称,值是该软件包的重复版本列表 + """ + sack = hawkey.Sack() + sack.load_system_repo(build_cache=False) + q = hawkey.Query(sack) + + packages_by_name = {} + dupes_dict = {} + + for pkg in q: + pkg_name = pkg.name + if pkg_name in packages_by_name: + # 如果已经存在该名称的软件包,则添加到重复列表中 + if pkg.evr not in packages_by_name[pkg_name]: + packages_by_name[pkg_name].append(pkg.evr) + else: + # 如果是第一次遇到该名称的软件包,则初始化列表 + packages_by_name[pkg_name] = [pkg.evr] + + for pkg_name, versions in packages_by_name.items(): + if len(versions) > 1: + dupes_dict[pkg_name] = versions + + return dupes_dict + @classmethod def check(cls): """ @@ -89,4 +120,9 @@ class LocalCheck(object): if pkgs_conflicts_dict: print("{} : {}".format(BaseConfig.LOCAL_CHECK_ERROR_INFO.get(1002,''), str(pkgs_conflicts_dict))) + # 本地软件包多版本重复检查 + pkgs_dupes_dict = cls.check_pkgsdupes() + if pkgs_dupes_dict: + print("{} : {}".format(BaseConfig.LOCAL_CHECK_ERROR_INFO.get(1003,''), str(pkgs_dupes_dict))) + return True \ No newline at end of file -- Gitee