[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