Как происходит процесс распознавания последней версии пакета RPM в репозитории RPM?

Я просто пытаюсь понять, как RPM распознает последнюю версию некоторого пакета. Скажем, у меня есть:

package-0.1-SNAPSHOT201212031
package-0.2-SNAPSHOT201212030

Будет ли менеджер rpm сравнивать их так же, как строки, или за этим стоит еще какая-то логика? Или другой пример: распознает ли он, что 0.10.1 новее 0.1.1? (сравнение строк здесь не поможет).


person Soid    schedule 04.12.2012    source источник


Ответы (2)


Единственное жесткое правило заключается в том, что в поле RELEASE не должно быть дефисов.

Рассмотреть возможность:

rpm -qi hwdata

с последующим

$ rpm -q hwdata --queryformat '%10{NAME} %20{VERSION} %20{RELEASE} %20{ARCH}\n'
hwdata             0.213.22                1.el5               noarch

См. раздел Тег выпуска этого документа для получения справки по правила выпуска тегов.

Примечание: для справки: иногда я программно вставляю вещи в описание rpm, если нет rpm-tag для него в specfile. Ваш пробег может отличаться, и я не рекомендую это для пакетов, которым суждено вернуться в сообщество, поскольку это неудобно. Просто указываю на это как на обходной путь, чтобы не тормозить различные инструменты, работающие на оборотах.

Примечание 2: общепринятой практикой является использование контрольных номеров версий в поле RELEASE. Хотя это немного отходит от соглашения об оборотах. (изменение этого поля означает, что изменился спецификационный файл... а не его содержимое). Это удобное поле для использования, потому что оно не нарушает работу инструментов rpm и дает прямую ссылку на версию содержимого. Кроме того... если у вас есть содержимое rpm, зарегистрированное в системе контроля версий, это в любом случае уже немного выходит за рамки модели rpm. т.е. Исходные обороты становятся ненужными.

person Jeff Sheffield    schedule 04.12.2012

Старый пост, но я пытался его зафиксировать и подумал, что поделюсь тем, что у меня работает. Я использую ruby-скрипт с расширением класса String.

class String
  def explode
    self.split(/-|_|\./).collect {|i| if i == "0" || i.to_i > 0; then i = i.to_i; end; i}
  end
end

Это разбивает заданную строку на массив, где группа чисел преобразуется в сортируемое числовое значение (а не остается в виде строки).

Например:

ruby -r./string_ext.rb -e ' puts %Q{package-0.1-SNAPSHOT201212031}.explode.inspect'
#=> ["package", 0, 1, "SNAPSHOT201212031"]

ruby -r./string_ext.rb -e ' puts %Q{package-0.2-SNAPSHOT201212031}.explode.inspect'
#=> ["package", 0, 2, "SNAPSHOT201212031"]

# the comparison of the resulting arrays is then very straight forward
ruby -r./string_ext.rb -e ' puts %Q{package-0.1-SNAPSHOT201212031}.explode <=> %Q{package-0.2-SNAPSHOT201212030}.explode'
#=> -1

Где -1 означает, что первый элемент меньше второго, 0 означает, что они равны, а 1 означает, что второй элемент меньше первого.

1 <=> 2 #=> -1
2 <=> 2 #=> 0
3 <=> 2 #=> 1

Используя этот подход, довольно просто получить наибольшее значение из массива похожих элементов (например, массива rpm, связанного с одним и тем же пакетом).

person BenH    schedule 04.03.2015