LINUX.ORG.RU

Как корректно анализировать версии пакетов?


0

1

Во FreeBSD, к примеру можно получить версии пакетов в виде

$pkg_glob quagga
quagga-0.99.17_8
В Gentoo же версия выводится в виде:
$equery l git | cat
dev-vcs/git-1.7.3.4-r1

Достаточно ли такой универсальной обработки?

<версия пакета> |  cut -d"/" -f2 | cut -d"-" -f2 | cut -d"_" -f1

$ equery l git |  cut -d"/" -f2 | cut -d"-" -f2 | cut -d"_" -f1
1.7.3.4
$ pkg_glob quagga | cut -d"/" -f2 | cut -d"-" -f2 | cut -d"_" -f1
0.99.17

Кто сталкивался с подобными задачами? Может, я делаю велосипед?

Может, я делаю велосипед?

Да.

Man dpkg

       --compare-versions ver1 op ver2
              Compare version numbers, where op is a  binary  operator.  dpkg  returns  success  (zero
              result) if the specified condition is satisfied, and failure (nonzero result) otherwise.
              There are two groups of operators, which differ in how they treat an empty ver1 or ver2.
              These treat an empty version as earlier than any version: lt le eq ne ge gt. These treat
              an empty version as later than any version: lt-nl le-nl ge-nl gt-nl. These are  provided
              only for compatibility with control file syntax: < << <= = >= >> >.
drull ★☆☆☆
()

Используй регулярные выражения. Имя пакета == category/name-version.

vurdalak ★★★★★
()
Ответ на: комментарий от drull

Не подходит. Это мне надо будет ставить dpkg на генту или фряху? %)

Хотя можно будет просмотреть исходники.

Chaser_Andrey ★★★★★
() автор топика
Ответ на: комментарий от Chaser_Andrey

Я кажется не совсем понял что тебе нужно. Если тебе требуется только вытянуть версии пакетов - то cut и sed тебе в помощь. А если нужно эти версии еще и сравнить - то ставь dpkg :-)

Пример:

drull@drull-netbook:~$ if dpkg --compare-versions 1.2.3-1 gt 1.2.3; then echo sss; fi;
sss
drull@drull-netbook:~$ if dpkg --compare-versions 1.2 gt 1.2.3; then echo sss; fi;
drull@drull-netbook:~$ if dpkg --compare-versions 1.2.0.1 gt 1.2.3; then echo sss; fi;
drull@drull-netbook:~$ if dpkg --compare-versions 1.3.0.1 gt 1.2.0.1; then echo sss; fi;
sss

drull ★☆☆☆
()

Вы делаете Unix-Way. Как по мне, всё правильно.

pimiento
()

Универсальная обработка вряд-ли получится, потому что разные системы лепят свои префиксы/постфиксы со своими разделителями. Под FreeBSD, например, если нужна чистая версия пакета, нужно откусить по меньшей мере '(_[0-9]+)?(,[0-9]+)?$', а версию пакета от имени по первому минусу просто так не откусишь, потому что есть пакеты с минусом в названии (xorg-fonts-100dpi), и более того - с числом (liblqr-1 причем 1 не входи в версию).

Кажется, это работает:

pkg_info | perl -Mv5.12 -ne '(split(/\s+/, $_, ))[0] =~ /-([^-_,]+)(_[0-9]+)?(,[0-9]+$)?$/ && say $1 || say «Cannot parse $_»;'

у меня из 600 пакетов всё распарсилось.

В других системах ситуация не проще - скажем, в дебиан какие-то невменяемые постфиксы лепят, или вот под Maemo есть версия 1:0.4.0-180+maemo2

Если нужно именно сравнивать версии, то лучше использовать инструменты системы - где-то есть dpkg, под FreeBSD есть pkg_version -t

slovazap ★★★★★
()
Ответ на: комментарий от k_andy

> Суффиксы бывают и вменяемые

Ага, очень ценное замечание. Только если есть невменяемые, их придётся уметь обрабатывать. А вообще мысль заключалась в том что надо смотреть какие схемы на целевых системах используются и от них плясать. Универсальной обработки не получится, и уж тем более не будет работать дубовый способ типа «откусить всё до минуса и после _».

slovazap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.