[devel] сравнение версий в rpm

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Сб Дек 20 12:00:53 MSK 2008


On Thu, Dec 18, 2008 at 10:58:02AM +0300, Kirill Maslinsky wrote:
> On Thu, Dec 18, 2008 at 01:06:09AM +0600, Mikhail Gusarov wrote:
> > 
> > Twas brillig at 01:05:21 18.12.2008 UTC+06 when dottedmag на altlinux.org did gyre and gimble:
> > 
> >  PS>> А нельзя не язвить, а подсказать человек ссылочку, объяснить :)
> > 
> >  MG> http://www.altlinux.org/Spec#Epoch
> > 
> > Ну и вообще предполагается, что майнтайнер документацию по RPM прочёл,
> > преждем чем начал спеки писать :-P
> 
> Думаю, нам не хватает отдельного HOWTO по RPM-версионированию. 
> 
> С примерно такими разделами:
>  - общие принципы 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 не определён.

rpmevrcmp использовать не следует.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?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/86ef899e/attachment.bin>


Подробная информация о списке рассылки Devel