Как я сравниваю версии об/мин в Python

Я пытаюсь узнать, как я могу сравнить 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

Но ни один, они работают, например, если я не повреждаю некоторых других, которые работали прежде..

  • wvdial-1.54.0-3
  • xdelta-1.1.3-20
  • xdelta-1.1.3-20_2
  • xmlsec1-1.2.6-3
  • xmlsec1-1.2.6-3_2
  • ypbind-1.17.2-13
  • ypbind-1.17.2-8
  • ypserv-2.13-14
  • zip-2.3-27
  • zlib-1.2.3-3
  • zlib-1.2.3-3_2
  • zsh-4.2.6-1
11
задан CharlesB 24 September 2011 в 07:01
поделиться

1 ответ

На языке 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 для получения подробных сведений.

15
ответ дан 3 December 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: