用转速术语来说,2.el5
是释放场; 2 和 el5 不是单独的字段。然而,发布不需要有.
正如你的例子所示。放下\.(.*)
从最后一枪捕捉释放场。
现在您有了包名称、版本和发行版。比较它们的最简单方法是使用 rpm 的 python 模块:
import rpm
# t1 and t2 are tuples of (version, release)
def compare(t1, t2):
v1, r1 = t1
v2, r2 = t2
return rpm.labelCompare(('1', v1, r1), ('1', v2, r2))
那额外的是什么'1'
, 你问?这是纪元,它优先于其他版本比较考虑因素。此外,它通常在文件名中不可用。在这里,出于本练习的目的,我们将其假装为“1”,但这可能根本不准确。如果您仅使用文件名,那么这是您的逻辑会出错的两个原因之一。
您的逻辑可能不同于的另一个原因rpm
是Obsoletes
字段,它允许将包升级为具有完全不同名称的包。如果您同意这些限制,请继续。
如果您没有rpm
手头的 python 库,以下是比较每个发行版、版本和纪元的逻辑rpm 4.4.2.3
:
- 在每个字符串中搜索字母字段
[a-zA-Z]+
和数字字段[0-9]+
被垃圾隔开[^a-zA-Z0-9]*
.
- 每个字符串中的连续字段会相互比较。
- 字母部分按字典顺序比较,数字部分按数字进行比较。
- 如果出现一个字段为数字字段而另一个字段为字母字段的不匹配情况,则数字字段始终被视为更大(较新)。
- 在一个字符串用完字段的情况下,另一个字符串始终被认为更大(更新)。
See lib/rpmvercmp.c
在 RPM 源中了解血淋淋的细节。