我试图找出如何比较两个rpm列表(当前已安装)和(在本地存储库中可用)并查看哪些rpm已过期。我一直在修改regex,但是有太多不同的RPMS命名标准,我无法得到一个好的列表来使用。我的驱动器上没有实际的rpm,所以我不能做rpm-qif。
pattern1 = re.compile(r'^([a-zA-Z0-9_\-\+]*)-([a-zA-Z0-9_\.]*)-([a-zA-Z0-9_\.]*)\.(.*)')
for rpm in listOfRpms:
packageInfo = pattern1.search(rpm[0]).groups()
print packageInfo
这适用于绝大多数人,但不是所有人(2300/2400)
yum-metadata-parser-1.1.2-2.el5
('yum-metadata-parser', '1.1.2', '2', 'el5') **What I need
但这些都不起作用,比如说,除非我打破了以前起作用的其他一些。。
用RPM术语来说,
2.el5
是发布字段;2和el5不是单独的字段。但是,正如您的示例所示,release不需要包含.
。从末尾放下\.(.*)
,一次捕获释放字段。所以现在你有了一个包的名称,版本和发行版。比较它们的最简单方法是使用rpm的python模块:
你问,额外的
'1'
是什么?这是epoch,它覆盖了其他版本比较考虑事项。而且,它通常在文件名中不可用。在这里,为了这个练习的目的,我们把它伪装成'1',但这可能一点也不准确。这是如果只使用文件名,逻辑将关闭的两个原因之一。逻辑可能与
rpm
不同的另一个原因是Obsoletes
字段,该字段允许将包升级为具有完全不同名称的包。如果你能接受这些限制,那就继续吧。如果手头没有
rpm
python库,下面是比较rpm 4.4.2.3
的每个版本、版本和纪元的逻辑:[a-zA-Z]+
和数字字段[0-9]+
。有关血淋淋的详细信息,请参见RPM源中的
lib/rpmvercmp.c
。这是一个基于rpmdevtools包中
rpmdev-vercmp
的工作程序。除了yum
(它提供了rpmUtils.miscutils
python模块)之外,您不需要安装任何特殊的东西。与其他答案相比,它的优点是您不需要解析任何内容,只需输入完整的RPM名称版本字符串,如:
退出状态11表示第一个较新,12表示第二个较新。
基于Owen的出色回答,我整理了一个片段,它使用系统RPM绑定(如果可用),但返回到基于正则表达式的仿真:
请注意,我还没有对这个与C级实现的一致性进行过广泛的测试——我只是将它用作一个后备实现,它至少足以让Anitya的测试套件在系统RPM绑定不可用的环境中通过。
相关问题 更多 >
编程相关推荐