Я пытаюсь узнать, как я могу сравнить 2 списка RPMS (В настоящее время устанавливаемый) и (Доступный в локальном репозитории) и видеть, какие RPMS устарели. Я переделывал regex, но существует столько различных стандартов именования для RPMS, с которым я не могу заставить хороший список работать. У меня нет фактического RPMS на моем диске, таким образом, я не могу сделать об/мин-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 не являются отдельными полями. Однако выпуск не обязательно должен иметь .
в нем, как показывают ваши примеры. Бросьте \. (. *)
с конца, чтобы захватить поле выброса одним выстрелом.
Итак, теперь у вас есть имя пакета, версия и выпуск. Самый простой способ сравнить их - использовать модуль python rpm:
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
, которое позволяет обновить пакет до пакета с совершенно другим именем. Если вас устраивают эти ограничения, продолжайте.
Если у вас нет библиотеки Python rpm
под рукой, вот логика для сравнения каждого выпуска, версии и эпохи на rpm 4.4.2.3
:
[a-zA-Z] +
и числовые поля [0-9] +
, разделенные спамом [^ a-zA-Z0- 9] *
. См. lib / rpmvercmp.c
в источнике RPM для получения подробных сведений.