* [devel] RFC: perl deps versioning
@ 2004-12-01 19:33 Alexey Tourbin
2004-12-01 23:15 ` [devel] " Michael Shigorin
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Alexey Tourbin @ 2004-12-01 19:33 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 3343 bytes --]
Здравствуйте,
Напомню суть проблемы: для проверки версии требуемого модуля в перле
используются числа с десятичной точкой (напр. `use Data::Dumper 2.121',
в данном случае это текущая версия Data::Dumper). При этом точность
требуемой версии (число знаков после точки) может не совпадать
с точностью версии, указанной в самом этом модуле (напр. новая версия
Data::Dumper может иметь версию 2.20 (хм... колбасная версия:))).
RPM использует другой алгоритм сравнения версий: разбивает версию как
строку на цифровые и буквенные сегменты, после чего цифровые сегменты
сравниваются как целые числа, а буквенные -- как строки.
В результате без корректировки точности версий возможны следующие
казусы:
1) перебор в смысле Requires, в результате которого получается unmet
dependency:
Requires: perl(Data/Dumper) >= 0:2.121
Provides: perl(Data/Dumper) = 0:2.20
2) перебор в смысле Provides, в результате которого необходимая
зависимость фактически теряется:
Requires: perl(Data/Dumper) >= 0:2.12
Provides: perl(Data/Dumper) = 0:2.100
Простым и действенным решением этой проблемы мне представляется
ограничение как Requires, так и Provides с точностью до двух знаков
после точки. Обоснование: статистика текущего использования такого
рода зависимостей.
$ rpm -qa --requires --provides |grep 'perl(' |grep = >perl_ver_deps
(У меня на машине установлены далеко не все пакеты, но большинство
перловых всё же установлено.)
Зависимости Requires с одним знаками после точки:
$ perl -ne 'print if />= 0:\d+\.\d$/' perl_ver_deps
perl(Chart/Base.pm) >= 0:2.0
perl(Socket.pm) >= 0:1.3
perl(HTTP/Request.pm) >= 0:1.3
perl(File/Spec.pm) >= 0:0.8
perl(Socket.pm) >= 0:1.3
perl(File/Spec.pm) >= 0:0.8
$
Зависимости Requires с двумя знаками после точки:
$ perl -ne 'print if />= 0:\d+\.\d\d$/' perl_ver_deps
perl(HTML/Element.pm) >= 0:3.15
perl(Config/General.pm) >= 0:1.18
perl(IO/Pty.pm) >= 0:0.97
perl(Pod/Escapes.pm) >= 0:1.03
perl(HTML/Element.pm) >= 0:3.05
perl(HTML/TreeBuilder.pm) >= 0:3.01
perl(Getopt/Long.pm) >= 0:2.17
perl(HTML/Parser.pm) >= 0:2.19
perl(HTML/Tagset.pm) >= 0:3.02
perl(Convert/ASN1.pm) >= 0:0.07
perl(HTML/Parser.pm) >= 0:3.24
perl(Convert/ASN1.pm) >= 0:0.07
perl(LWP.pm) >= 0:5.76
perl(Net/SSLeay.pm) >= 0:1.08
perl(Search/Dict.pm) >= 0:1.02
perl(Tie/IxHash.pm) >= 0:1.21
perl(Pod/Usage.pm) >= 0:1.12
perl(XML/Stream.pm) >= 0:1.18
perl(MIME/Base64.pm) >= 0:2.04
perl(MIME/QuotedPrint.pm) >= 0:2.03
perl(Mail/Field.pm) >= 0:1.05
perl(Mail/Header.pm) >= 0:1.09
perl(Mail/Internet.pm) >= 0:1.28
perl(XML/LibXML.pm) >= 0:1.57
perl(Crypt/DES.pm) >= 0:2.03
perl(Digest/HMAC.pm) >= 0:1.00
perl(Digest/MD5.pm) >= 0:2.11
perl(Digest/SHA1.pm) >= 0:1.02
$
Зависимости Requires с тремя и более знаками после точки:
$ perl -ne 'print if />= 0:\d+\.\d\d\d+$/' perl_ver_deps
perl(Text/Wrap.pm) >= 0:98.112902
perl(LWP/UserAgent.pm) >= 0:2.003
perl(IO/Lines.pm) >= 0:1.108
perl(IO/Scalar.pm) >= 0:1.117
perl(IO/ScalarArray.pm) >= 0:1.114
$
Т.е. наиболее востребованный формат указания зависимостей -- с двумя
знаками после точки.
PS: зависимость может быть также указана с помощью v-string (такие
зависимости имеют Serial:1), в этом случае проблем не возникает.
Однако появляется проблема сопоставления версии v-string и десятичной
версии.
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* [devel] Re: RFC: perl deps versioning
2004-12-01 19:33 [devel] RFC: perl deps versioning Alexey Tourbin
@ 2004-12-01 23:15 ` Michael Shigorin
2004-12-02 0:57 ` Alexey Tourbin
2004-12-01 23:49 ` [devel] " Mikhail Zabaluev
2004-12-02 15:29 ` Alexey Tourbin
2 siblings, 1 reply; 9+ messages in thread
From: Michael Shigorin @ 2004-12-01 23:15 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 467 bytes --]
On Wed, Dec 01, 2004 at 10:33:08PM +0300, Alexey Tourbin wrote:
> Простым и действенным решением этой проблемы мне представляется
> ограничение как Requires, так и Provides с точностью до двух
> знаков после точки. Обоснование: статистика текущего
> использования такого рода зависимостей.
В конце концов, _необходимо_ более точные можно и руками сказать.
--
---- WBR, Michael Shigorin <mike@altlinux.ru>
------ Linux.Kiev http://www.linux.kiev.ua/
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] RFC: perl deps versioning
2004-12-01 19:33 [devel] RFC: perl deps versioning Alexey Tourbin
2004-12-01 23:15 ` [devel] " Michael Shigorin
@ 2004-12-01 23:49 ` Mikhail Zabaluev
2004-12-02 1:33 ` [devel] " Alexey Tourbin
2004-12-02 15:29 ` Alexey Tourbin
2 siblings, 1 reply; 9+ messages in thread
From: Mikhail Zabaluev @ 2004-12-01 23:49 UTC (permalink / raw)
To: ALT Devel discussion list
В Срд, 01/12/2004 в 22:33 +0300, Alexey Tourbin пишет:
> Напомню суть проблемы: для проверки версии требуемого модуля в перле
> используются числа с десятичной точкой (напр. `use Data::Dumper 2.121',
> в данном случае это текущая версия Data::Dumper). При этом точность
> требуемой версии (число знаков после точки) может не совпадать
> с точностью версии, указанной в самом этом модуле (напр. новая версия
> Data::Dumper может иметь версию 2.20 (хм... колбасная версия:))).
>
> RPM использует другой алгоритм сравнения версий: разбивает версию как
> строку на цифровые и буквенные сегменты, после чего цифровые сегменты
> сравниваются как целые числа, а буквенные -- как строки.
>
> В результате без корректировки точности версий возможны следующие
> казусы:
>
> 1) перебор в смысле Requires, в результате которого получается unmet
> dependency:
> Requires: perl(Data/Dumper) >= 0:2.121
> Provides: perl(Data/Dumper) = 0:2.20
>
> 2) перебор в смысле Provides, в результате которого необходимая
> зависимость фактически теряется:
> Requires: perl(Data/Dumper) >= 0:2.12
> Provides: perl(Data/Dumper) = 0:2.100
По-моему, правильнее будет унифицировать все числа до трех знаков после
точки, дополняя нулями. Решим проблему почти для всех случаев без потери
точности.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [devel] Re: RFC: perl deps versioning
2004-12-01 23:15 ` [devel] " Michael Shigorin
@ 2004-12-02 0:57 ` Alexey Tourbin
0 siblings, 0 replies; 9+ messages in thread
From: Alexey Tourbin @ 2004-12-02 0:57 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 658 bytes --]
On Thu, Dec 02, 2004 at 01:15:42AM +0200, Michael Shigorin wrote:
> On Wed, Dec 01, 2004 at 10:33:08PM +0300, Alexey Tourbin wrote:
> > Простым и действенным решением этой проблемы мне представляется
> > ограничение как Requires, так и Provides с точностью до двух
> > знаков после точки. Обоснование: статистика текущего
> > использования такого рода зависимостей.
>
> В конце концов, _необходимо_ более точные можно и руками сказать.
Только на основной пакет, а не на виртуаальный, т.к. Requires и Provides
будут одинаково урезаться.
> --
> ---- WBR, Michael Shigorin <mike@altlinux.ru>
> ------ Linux.Kiev http://www.linux.kiev.ua/
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* [devel] Re: RFC: perl deps versioning
2004-12-01 23:49 ` [devel] " Mikhail Zabaluev
@ 2004-12-02 1:33 ` Alexey Tourbin
2004-12-02 1:54 ` Alexey Tourbin
2004-12-03 3:36 ` Alexey Tourbin
0 siblings, 2 replies; 9+ messages in thread
From: Alexey Tourbin @ 2004-12-02 1:33 UTC (permalink / raw)
To: ALT Devel discussion list
[-- Attachment #1: Type: text/plain, Size: 1394 bytes --]
On Thu, Dec 02, 2004 at 02:49:23AM +0300, Mikhail Zabaluev wrote:
> > 1) перебор в смысле Requires, в результате которого получается unmet
> > dependency:
> > Requires: perl(Data/Dumper) >= 0:2.121
> > Provides: perl(Data/Dumper) = 0:2.20
> >
> > 2) перебор в смысле Provides, в результате которого необходимая
> > зависимость фактически теряется:
> > Requires: perl(Data/Dumper) >= 0:2.12
> > Provides: perl(Data/Dumper) = 0:2.100
>
> По-моему, правильнее будет унифицировать все числа до трех знаков после
> точки, дополняя нулями. Решим проблему почти для всех случаев без потери
> точности.
Без потери точности нужно унифицировать до шести цифр, тогда можно будет
отказаться от версий типа 1:x.y.z и конвертировать их в 0:x.00y.00z.
На уровне перла это автоматически так и происходит:
$ grep 'VERSION =' /usr/lib/perl5/vendor_perl/Net/SNMP.pm
our $VERSION = v4.1.2;
$ perl -e 'use Net::SNMP 4.1'
Net::SNMP version 4.1 required--this is only version 4.001002 at -e line 1
BEGIN failed--compilation aborted at -e line 1.
$
Тем более что зависимости 1: в общем-то harmful, т.к. Serial перекрывает
любую версию. Так что здесь тоже возможны казусы. Однако же v-strings
deprecated. Правда, будут какие-то version objects.
Да, наверное три знака -- тоже неплохо (тогда для v-strings сохранится
один знак после точки, если отказаться от 1: зависимостей).
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* [devel] Re: RFC: perl deps versioning
2004-12-02 1:33 ` [devel] " Alexey Tourbin
@ 2004-12-02 1:54 ` Alexey Tourbin
2004-12-02 12:16 ` Dmitry V. Levin
2004-12-03 3:36 ` Alexey Tourbin
1 sibling, 1 reply; 9+ messages in thread
From: Alexey Tourbin @ 2004-12-02 1:54 UTC (permalink / raw)
To: ALT Devel discussion list
[-- Attachment #1: Type: text/plain, Size: 394 bytes --]
On Thu, Dec 02, 2004 at 04:33:49AM +0300, Alexey Tourbin wrote:
> Тем более что зависимости 1: в общем-то harmful, т.к. Serial перекрывает
> любую версию. Так что здесь тоже возможны казусы. Однако же v-strings
> deprecated. Правда, будут какие-то version objects.
Хм... а rpmvercmp Serial умеет понимать?
$ rpmvercmp 3.1 3:2
-1
$ rpmvercmp 3.2 3:2
0
$ rpmvercmp 3.3 3:2
1
$
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] Re: RFC: perl deps versioning
2004-12-02 1:54 ` Alexey Tourbin
@ 2004-12-02 12:16 ` Dmitry V. Levin
0 siblings, 0 replies; 9+ messages in thread
From: Dmitry V. Levin @ 2004-12-02 12:16 UTC (permalink / raw)
To: ALT Devel discussion list
[-- Attachment #1: Type: text/plain, Size: 680 bytes --]
On Thu, Dec 02, 2004 at 04:54:16AM +0300, Alexey Tourbin wrote:
> On Thu, Dec 02, 2004 at 04:33:49AM +0300, Alexey Tourbin wrote:
> > Тем более что зависимости 1: в общем-то harmful, т.к. Serial перекрывает
> > любую версию. Так что здесь тоже возможны казусы. Однако же v-strings
> > deprecated. Правда, будут какие-то version objects.
>
> Хм... а rpmvercmp Serial умеет понимать?
>
> $ rpmvercmp 3.1 3:2
> -1
> $ rpmvercmp 3.2 3:2
> 0
> $ rpmvercmp 3.3 3:2
> 1
> $
Нет, он сравнивает элементы.
Для того, чтобы сравнивать [serial:]version-release, есть rpmevrcmp:
$ rpmevrcmp 3.1 3:2
-1
$ rpmevrcmp 3.2 3:2
-1
$ rpmevrcmp 3.3 3:2
-1
--
ldv
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* [devel] Re: RFC: perl deps versioning
2004-12-01 19:33 [devel] RFC: perl deps versioning Alexey Tourbin
2004-12-01 23:15 ` [devel] " Michael Shigorin
2004-12-01 23:49 ` [devel] " Mikhail Zabaluev
@ 2004-12-02 15:29 ` Alexey Tourbin
2 siblings, 0 replies; 9+ messages in thread
From: Alexey Tourbin @ 2004-12-02 15:29 UTC (permalink / raw)
To: devel
[-- Attachment #1: Type: text/plain, Size: 227 bytes --]
On Wed, Dec 01, 2004 at 10:33:08PM +0300, Alexey Tourbin wrote:
> Здравствуйте,
Вот оно -- зацените: http://www.nntp.perl.org/group/perl.perl5.porters/96442
Любое благое намерение очень быстро оборачивается segfault'ами.
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* [devel] Re: RFC: perl deps versioning
2004-12-02 1:33 ` [devel] " Alexey Tourbin
2004-12-02 1:54 ` Alexey Tourbin
@ 2004-12-03 3:36 ` Alexey Tourbin
1 sibling, 0 replies; 9+ messages in thread
From: Alexey Tourbin @ 2004-12-03 3:36 UTC (permalink / raw)
To: ALT Devel discussion list
[-- Attachment #1: Type: text/plain, Size: 2299 bytes --]
On Thu, Dec 02, 2004 at 04:33:49AM +0300, Alexey Tourbin wrote:
> Тем более что зависимости 1: в общем-то harmful, т.к. Serial перекрывает
> любую версию. Так что здесь тоже возможны казусы. Однако же v-strings
> deprecated. Правда, будут какие-то version objects.
>
> Да, наверное три знака -- тоже неплохо (тогда для v-strings сохранится
> один знак после точки, если отказаться от 1: зависимостей).
Думаю остановиться на 3 цифрах и отказаться от Serial.
Т.е. сейчас выполняются следующие тесты:
cmp_ok "$d >= 2.0", 'eq', grok qq(use $m 2;);
cmp_ok "$d >= 2.0", 'eq', grok qq(use $m 2.0;);
cmp_ok "$d >= 2.0", 'eq', grok qq(use $m 2.00;);
cmp_ok "$d >= 2.0", 'eq', grok qq(use $m 2.000998;);
cmp_ok "$d >= 2.001", 'eq', grok qq(use $m 2.000999;);
cmp_ok "$d >= 2.010", 'eq', grok qq(use $m 2.01;);
cmp_ok "$d >= 2.012", 'eq', grok qq(use $m 2.012;);
cmp_ok "$d >= 2.019", 'eq', grok qq(use $m 2.0199;);
cmp_ok "$d >= 2.0", 'eq', grok qq(use $m v2;);
cmp_ok "$d >= 2.0", 'eq', grok qq(use $m v2.0;);
cmp_ok "$d >= 2.0", 'eq', grok qq(use $m v2.0.998;);
cmp_ok "$d >= 2.001", 'eq', grok qq(use $m v2.0.999;);
cmp_ok "$d >= 2.001", 'eq', grok qq(use $m 2.1.1;);
cmp_ok "$d >= 2.001", 'eq', grok qq(use $m v2.1.1;);
При этом для геренации версии отрабатывает следующий код:
sub version ($) {
my $sv = shift;
my $class = class($sv);
if ($class eq "IV" or $class eq "PVIV") {
return verf($sv->int_value);
}
if ($class eq "NV" or $class eq "PVNV") {
return verf($sv->NV);
}
if ($class eq "PVMG") {
my @v;
for (my $mg = $sv->MAGIC; $mg; $mg = $mg->MOREMAGIC) {
next if $mg->TYPE ne "V";
@v = $mg->PTR =~ /(\d+)/g;
last;
}
@v = map ord, split //, $sv->PV unless @v;
return verf($v[0] + $v[1] / 1000 + $v[2] / 1000 / 1000);
}
return undef;
}
sub verf($) {
my $v = shift;
$v = sprintf("%.3f", int($v * 1000 + 1e-3) / 1000 + 1e-6);
$v =~ s/\.000$/.0/g;
return $v;
}
Подробности: sprintf "%.3f" может округлить в верхнюю сторону, а это не
очень хорошо. Казалось бы, отрубить цифры после заданной -- нет
проблем, однако же возникает казус:
$ perl -le 'print 2.01 * 1000'
2010
$ perl -le 'print int(2.01 * 1000)'
2009
$
Поэтому в ход пошли 1e-3 и 1e-6.
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2004-12-03 3:36 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-12-01 19:33 [devel] RFC: perl deps versioning Alexey Tourbin
2004-12-01 23:15 ` [devel] " Michael Shigorin
2004-12-02 0:57 ` Alexey Tourbin
2004-12-01 23:49 ` [devel] " Mikhail Zabaluev
2004-12-02 1:33 ` [devel] " Alexey Tourbin
2004-12-02 1:54 ` Alexey Tourbin
2004-12-02 12:16 ` Dmitry V. Levin
2004-12-03 3:36 ` Alexey Tourbin
2004-12-02 15:29 ` Alexey Tourbin
ALT Linux Team development discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
public-inbox-index devel
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.devel
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git