
Возможно, этот вопрос немного странный, но у меня возникли трудности.
По каким критериям rpm определяет, является ли пакет обновлением или нет?
Версия и релиз — это строка и т. д., ее нельзя сравнивать с другими версиями. Для определения версии есть три флага: эпоха, версия и релиз. Проверяет ли rpm (и yum, dnf, ...) время сборки, чтобы определить, является ли пакет обновлением? Я едва могу в это поверить, но больше ничего не могу придумать.
Я не настолько опытен, чтобы самостоятельно найти расположение этой функции в исходном коде. Может быть, кто-то сможет помочь.
Большое спасибо.
решение1
Пакеты RPM имеют определенный формат:[$epoch:]$name-$version-$release.$arch
— $epoch
это целое число, которое можно легко сравнить. Существуют пакеты, которые его не используют, и оно просто опускается. $name
— это просто строка, которая не должна меняться между версиями. $version
— это строка версии в формате, который можно анализировать и сравнивать (обычно это целые числа, разделенные точками). $release
— это строка, которая обычно начинается с целого числа, но также может содержать информацию о том, для какого дистрибутива она была создана.
Если все $epoch
, $name
, и $verion
одинаковы, то $release
сравнивается, чтобы определить, является ли это обновлением. Если $version
s различны, они анализируются, и обновлением является тот, что выше. Если $epoch
отличается, обновлением является тот, что выше.
Исходный код для сравнения обновлений RPM, я полагаю, можно найти здесьздесьв функциях parseEVR
и rpmdsCompareEVR
.