Как rpm определяет, является ли пакет обновлением?

Как rpm определяет, является ли пакет обновлением?

Возможно, этот вопрос немного странный, но у меня возникли трудности.

По каким критериям rpm определяет, является ли пакет обновлением или нет?

Версия и релиз — это строка и т. д., ее нельзя сравнивать с другими версиями. Для определения версии есть три флага: эпоха, версия и релиз. Проверяет ли rpm (и yum, dnf, ...) время сборки, чтобы определить, является ли пакет обновлением? Я едва могу в это поверить, но больше ничего не могу придумать.

Я не настолько опытен, чтобы самостоятельно найти расположение этой функции в исходном коде. Может быть, кто-то сможет помочь.

Большое спасибо.

решение1

Пакеты RPM имеют определенный формат:[$epoch:]$name-$version-$release.$arch

$epochэто целое число, которое можно легко сравнить. Существуют пакеты, которые его не используют, и оно просто опускается. $name— это просто строка, которая не должна меняться между версиями. $version— это строка версии в формате, который можно анализировать и сравнивать (обычно это целые числа, разделенные точками). $release— это строка, которая обычно начинается с целого числа, но также может содержать информацию о том, для какого дистрибутива она была создана.

Если все $epoch, $name, и $verionодинаковы, то $releaseсравнивается, чтобы определить, является ли это обновлением. Если $versions различны, они анализируются, и обновлением является тот, что выше. Если $epochотличается, обновлением является тот, что выше.

Исходный код для сравнения обновлений RPM, я полагаю, можно найти здесьздесьв функциях parseEVRи rpmdsCompareEVR.

Связанный контент