[devel] сравнение версий в rpm
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Сб Дек 20 12:17:28 MSK 2008
On Sat, Dec 20, 2008 at 12:00:53PM +0300, Alexey Tourbin wrote:
> > С примерно такими разделами:
> > - общие принципы rpm-версий
> > + разъяснение принципа версий ("целочисленные сегменты", а не десятичные
> > числа, как в соседнем треде разъяснил at@),
>
> Это нужно понимать так. Версия есть строка; так что мы сравниваем
> версии, имя две строки: str1 и str2. Строки разбиваются на сегменты.
> Далее сравнение версий происходит по сегментам, до первого неодинакового
> результата.
>
> версия := сегмент сегмент*
>
> При исчерпании сегментов сравнение происходит как в strcmp(3),
> если букву считать за сегмент (то есть подстрока меньше строки).
>
> Сегмент может быть целочисленным или нецелочисленным.
>
> целочисленный_сегмент := [0-9][0-9]* (жадно)
> нецелочисленный_сегемент := [^0-9][^0-9]* (жадно)
>
> Сравнение двух целочисленных сегментов определено естественным образом.
> Сравнение целочисленного и нецелочисленного сегментов не определено (не
> надо спрашивать, какая версия больше, "RC" или "33"). Сравнение двух
> нецелочисленных семгенов либо определено, либо не определено.
>
> Сравнение двух нецелочисленных сегментов по умолчанию не определено.
> Тем не менее, литеральное совпадение означает равенсто нецелочисленных
> сегментов. Это позволяет считать, что "1.0" = "1.0", потому что точки
> литерально совпадают (и оба целочисленных сегмента также совпадют: 1==1
> и 0==0). Равно и "alt1" = "alt1". Но не следует, например, ставить
> вопрос о сравнении версий 1.0 и 1_0 (то есть не следует надеяться, что
> одна из этих версий больше другой, или же что они равны).
>
> Сравнение нецелочисленных сегментов в некоторых случаях также
> доопределяется лексикографически, но только в пределах регистра.
> Так, "1a" < 1b", потому что 1==1 и 'a'<'b'. Вместе с тем, не следует
> сравнивать версии "1a" и "1.0", а также "1a" и "1B" (здесь разный
> регистр букв).
>
> > + структура rpm-версии (Epoch-версия-релиз)
>
> Epoch влияет следующим образом. Нужно иметь в ввиду два обстоятельства:
> 1) эпоха может быть только целочисленной, так что результат сравнения
> эпох всегда определён; 2) эпоха либо есть, либо её нет.
>
> Если есть обе эпохи, то сравниваются сначала эпохи, а потом версии.
> Если обеих эпох эпох нет, то сравниваются только версии.
> В остальных случаях большей считается та версия, которая имеет эпоху.
>
> Если одна из версий имеет эпоху 0, а другая версия эпохи не имеет,
> то результат сравнения не определён.
>
> > + утилиты для сравнения версий (rpmvercmp)
>
> rpmvercmp сравнивает только версии, без эпох.
Дополнение: версия не может содержать знак "-", и релиз тоже не может
содержать знак "-". Поэтому можно использовать rpmvercpm для сравнения
строк вида V-R. Сначал будут сравниваться версии V. Если они равны,
то знак "-" означает литеральное совпадение, и далее будет сравнение
релизов R.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 197 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20081220/2c6881a5/attachment.bin>
Подробная информация о списке рассылки Devel