Transition to disttag: различия между версиями

Материал из ALT Linux Wiki
м (→‎Особенности поведения "нового" и "старого" rpm ("rpm-install") в отношении disttag: отказался тестирования вручную, смотрю результаты прогона тестов)
Строка 27: Строка 27:
Так что выбор между двумя возможностям (как записать такие <code>Conflicts</code>, <code>Obsoletes</code>; такой <code>Requires</code> бесполезен) может быть сделан на основе более желательного поведения "старого" rpm ("rpm-install") при столкновении с такими пакетами.
Так что выбор между двумя возможностям (как записать такие <code>Conflicts</code>, <code>Obsoletes</code>; такой <code>Requires</code> бесполезен) может быть сделан на основе более желательного поведения "старого" rpm ("rpm-install") при столкновении с такими пакетами.


===Проверка Conflicts старым rpm===
===Проверка старым rpm===


====Проверка Conflicts: N > E:V-R (без disttag)====
Есть тесты [http://git.altlinux.org/gears/r/rpminstall-tests.git?p=rpminstall-tests.git;a=blob;f=constraints.mk;h=469eeb6e1e63e110c4eaf17231d32844f1b86d1b;hb=404599cfee78def05ec960cb92f34ea9c3fa795e constraints.mk], где проверяется удовлетворение требований разного вида (<code>Requires</code>, <code>Provides</code>), разных знаков (<code>>, <, =</code>) и разной точности (с указанием disttag и без, с указанием epoch и без, а также с указанием только версии). (В релизе 1.0-alt2.M70P.1 пакета {{pkg|rpminstall-tests}} тесты, в которых есть новые зависимости с disttag-ом, помечены как возможно неуспешные и имеют специальное примечание, чтобы было легче изучать результаты при использовании старого rpm.)


В качестве примера пакета с таким Conflicts возьмём {{pkg|wireshark}}, известный из {{altbug|35930}}:
Ожидаемое поведение соответствует логике нового rpm. Результаты запуска на старом rpm как раз могут дать информацию для выбора предпочтительной формы записи требований в новых пакетах, чтобы разумно обрабатываться старым rpm. Желательно выбрать такую форму, которая не вызовет непрохождение теста на старом rpm.


$ curlftpfs -o allow_other,kernel_cache ftp://ftp.altlinux.org/pub/distributions/archive /home/user/MNT/ALT/repo
Вот результаты запуска на старом rpm (список непрошедших тестов):
$ rpm -qp /home/user/MNT/ALT/repo/sisyphus/date/2019/01/18/x86_64/RPMS.classic/wireshark-base-2.6.6-alt1.x86_64.rpm --conflicts
libwiretap < 2.6.6-alt1
libwiretap > 2.6.6-alt1
$ rpm -qp /home/user/MNT/ALT/repo/sisyphus/date/2019/01/18/x86_64/RPMS.classic/libwiretap-2.6.6-alt1.x86_64.rpm --conflicts
$ rpm -qp /home/user/MNT/ALT/repo/sisyphus/date/2019/01/18/x86_64/RPMS.classic/libwiretap-2.6.6-alt1.x86_64.rpm --provides
libwiretap.so.8()(64bit) = set:ld8aYWy1b4sDqBG48DBFCfoLMB7ddqH0djoHz6nkgZxZg0U6Z4hcDibrGMxjeHecL0Im93t540UZhZkWksc6JQSTO5f5MsjHo0otcB67zHX9QF2Aib0Ju7PlbxYsbdSJXxzl9F0s39w1pgg5cHY2sOk4EayatUUDZE6rlcCvCChZdGIJymMi7r6HhL7fFnngAeD3W9u1aZ6XojbFT0s1B70TZma8q98f1K4wqAjqjV3yuVTgZwVQusUpqRSzmGE8AfCSuuYcPgn6ccnLwZJfEUcm30faIAHtdvZ1oARYoa0
libwiretap = 2.6.6-alt1:sisyphus+219299.100.2.1
$


В качестве примера пакета с конфликтом будет {{pkg|wireshark-base}}.
<pre>
В качестве пакета с <code>N = E:V-R:D</code> будет {{pkg|libwiretap}} с <code>libwiretap = 2.6.6-alt1:sisyphus+219299.100.2.1</code>.
XFailed tests:
noninstallable_dummyDisttag_with_reqGreaterEpoch (external dep & future pkg )
noninstallable_dummyDisttag_before_reqGreaterEpoch (external dep & future pkg )
noninstallable_virtDummyDisttag_with_reqGreaterEpoch (external dep & future pkg )
noninstallable_virtDummyDisttag_before_reqGreaterEpoch (external dep & future pkg)
installable_dummyDisttag_with_conflGreaterEpoch (external dep & future pkg )
installable_dummyDisttag_before_conflGreaterEpoch (external dep & future pkg)
installable_dummyDisttag_after_conflGreaterEpoch (external dep & future pkg )
installable_virtDummyDisttag_with_conflGreaterEpoch (external dep & future pkg )
installable_virtDummyDisttag_before_conflGreaterEpoch (external dep & future pkg)
installable_virtDummyDisttag_after_conflGreaterEpoch (external dep & future pkg)
installable_dummyDisttag_with_reqEqualEpoch (external/strict-old-old dep & future pkg )
installable_dummyDisttag_before_reqEqualEpoch (external/strict-old-old dep & future pkg)
noninstallable_dummyDisttag_with_conflEqualEpoch (external/strict-old-old dep & future pkg )
noninstallable_dummyDisttag_before_conflEqualEpoch (external/strict-old-old dep & future pkg)
noninstallable_dummyDisttag_after_conflEqualEpoch (external/strict-old-old dep & future pkg)
installable_virtDummyDisttag_with_reqEqualEpoch (external/strict-old-old dep & future pkg )
installable_virtDummyDisttag_before_reqEqualEpoch (external/strict-old-old dep & future pkg)
noninstallable_virtDummyDisttag_with_conflEqualEpoch (external/strict-old-old dep & future pkg )
noninstallable_virtDummyDisttag_before_conflEqualEpoch (external/strict-old-old dep & future pkg)
noninstallable_virtDummyDisttag_after_conflEqualEpoch (external/strict-old-old dep & future pkg)
noninstallable_dummyDisttag_with_reqGreater (elusive external dep & future pkg )
noninstallable_dummyDisttag_before_reqGreater (elusive external dep & future pkg )
noninstallable_virtDummyDisttag_with_reqGreater (elusive external dep & future pkg )
noninstallable_virtDummyDisttag_before_reqGreater (elusive external dep & future pkg)
installable_dummyDisttag_with_conflGreater (elusive external dep & future pkg )
installable_dummyDisttag_before_conflGreater (elusive external dep & future pkg)
installable_dummyDisttag_after_conflGreater (elusive external dep & future pkg )
installable_virtDummyDisttag_with_conflGreater (elusive external dep & future pkg )
installable_virtDummyDisttag_before_conflGreater (elusive external dep & future pkg)
installable_virtDummyDisttag_after_conflGreater (elusive external dep & future pkg)
installable_dummyDisttag_with_reqEqual (elusive external/strict-old-old dep & future pkg )
installable_dummyDisttag_before_reqEqual (elusive external/strict-old-old dep & future pkg)
noninstallable_dummyDisttag_with_conflEqual (elusive external/strict-old-old dep & future pkg )
noninstallable_dummyDisttag_before_conflEqual (elusive external/strict-old-old dep & future pkg)
noninstallable_dummyDisttag_after_conflEqual (elusive external/strict-old-old dep & future pkg)
installable_virtDummyDisttag_with_reqEqual (elusive external/strict-old-old dep & future pkg )
installable_virtDummyDisttag_before_reqEqual (elusive external/strict-old-old dep & future pkg)
noninstallable_virtDummyDisttag_with_conflEqual (elusive external/strict-old-old dep & future pkg )
noninstallable_virtDummyDisttag_before_conflEqual (elusive external/strict-old-old dep & future pkg)
noninstallable_virtDummyDisttag_after_conflEqual (elusive external/strict-old-old dep & future pkg)
noninstallable_dummy_with_reqLessEpochDisttag (bogus future dep & old pkg )
noninstallable_dummy_before_reqLessEpochDisttag (bogus future dep & old pkg )
noninstallable_virtDummy_with_reqLessEpochDisttag (bogus future dep & old pkg )
noninstallable_virtDummy_before_reqLessEpochDisttag (bogus future dep & old pkg)
installable_dummy_with_conflLessEpochDisttag (bogus future dep & old pkg )
installable_dummy_before_conflLessEpochDisttag (bogus future dep & old pkg)
installable_dummy_after_conflLessEpochDisttag (bogus future dep & old pkg )
installable_virtDummy_with_conflLessEpochDisttag (bogus future dep & old pkg )
installable_virtDummy_before_conflLessEpochDisttag (bogus future dep & old pkg)
installable_virtDummy_after_conflLessEpochDisttag (bogus future dep & old pkg)
nonobsoleted_dummy_with_obsolLessEpochDisttag (bogus future dep & old pkg )
nonobsoleted_dummy_updated_with_obsolLessEpochDisttag (bogus future dep & old pkg )
nonobsoleted_dummy_before_obsolLessEpochDisttag (bogus future dep & old pkg )
nonobsoleted_dummy_after_obsolLessEpochDisttag (bogus future dep & old pkg )
nonobsoleted_dummyDisttag_with_obsolLessEpochDisttag (bogus future dep & future pkg )
nonobsoleted_dummyDisttag_updated_with_obsolLessEpochDisttag (bogus future dep & future pkg )
nonobsoleted_dummyDisttag_before_obsolLessEpochDisttag (bogus future dep & future pkg )
nonobsoleted_dummyDisttag_after_obsolLessEpochDisttag (bogus future dep & future pkg )
obsoleted_dummyDisttag_before_obsolEqualEpochDisttag (unrealistic obsoleting disttag )
noninstallable_dummy_with_reqLessDisttag (elusive bogus future dep )
noninstallable_dummy_before_reqLessDisttag (elusive bogus future dep )
noninstallable_virtDummy_with_reqLessDisttag (elusive bogus future dep )
noninstallable_virtDummy_before_reqLessDisttag (elusive bogus future dep )
installable_dummy_with_conflLessDisttag (elusive bogus future dep )
installable_dummy_before_conflLessDisttag (elusive bogus future dep)
installable_dummy_after_conflLessDisttag (elusive bogus future dep )
installable_virtDummy_with_conflLessDisttag (elusive bogus future dep )
installable_virtDummy_before_conflLessDisttag (elusive bogus future dep)
installable_virtDummy_after_conflLessDisttag (elusive bogus future dep )
nonobsoleted_dummy_with_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummy_updated_with_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummy_before_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummy_after_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummyDisttag_with_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummyDisttag_updated_with_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummyDisttag_before_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummyDisttag_after_obsolLessDisttag (elusive bogus future dep )
obsoleted_dummyDisttag_before_obsolEqualDisttag (unrealistic obsoleting disttag )
installable_provVR3Disttag_with_reqEq_VR3 (elusive external/strict-old-old dep & future pkg )
installable_provVR3Disttag_before_reqEq_VR3 (elusive external/strict-old-old dep & future pkg)
Failed tests:
noninstallable_provOnlyV_with_reqVR
noninstallable_provOnlyV_before_reqVR
installable_provOnlyV_with_conflVR
installable_provOnlyV_before_conflVR
make: *** [/home/user/wip/2019-01-rpm-disttag/rpminstall-tests/Makefile:29: all_tests] Error 1
</pre>


Это подпакеты одного исходного пакета, поэтому есть возможность в <code>Conflicts</code> вставить disttag той же самой сборки.


====={{fail}}Если ставится одновременно с пакетом N = E:V-R:D=====
Ещё можно рассмотреть случай (не описанный в тестах constraints.mk), когда пакет с требованием с указанием disttag-а <code>E:V-R:D</code> ставится с пакетом <code>N = E:V-R:D1</code> (тем же именем, но с другим disttag-ом).
 
# rpm -U /home/user/MNT/ALT/repo/sisyphus/date/2019/01/18/x86_64/RPMS.classic/{libwiretap,wireshark-base}-2.6.6-alt1.x86_64.rpm --test
error: Failed dependencies:
libwiretap > 2.6.6-alt1 conflicts with wireshark-base-2.6.6-alt1.x86_64
 
Эффект объясним тем, что <code>2.6.6-alt1:sisyphus+219299.100.2.1</code> лексикографически больше <code>2.6.6-alt1</code> (для "старого" rpm ("rpm-install"), который не отделяет disttag).
 
====={{ok}}Если ставится одновременно с пакетом N = E:V-R=====
 
Это совпадает со старой ситуацией, когда disttag-а нет ни в <code>Provides</code>, ни в <code>Conflicts</code>; поэтому не буду проверять.
 
====={{fail}}Если ставится в систему с пакетом N = E:V-R:D=====
 
# rpm -U /home/user/MNT/ALT/repo/sisyphus/date/2019/01/18/x86_64/RPMS.classic/libwiretap-2.6.6-alt1.x86_64.rpm --nodeps
# rpm -U /home/user/MNT/ALT/repo/sisyphus/date/2019/01/18/x86_64/RPMS.classic/wireshark-base-2.6.6-alt1.x86_64.rpm --test
error: Failed dependencies:
libwiretap > 2.6.6-alt1 conflicts with wireshark-base-2.6.6-alt1.x86_64
# rpm -q libwiretap
libwiretap-2.6.6-alt1.x86_64
# rpm -q libwiretap --provides
libwiretap.so.8()(64bit) =
set:ld8aYWy1b4sDqBG48DBFCfoLMB7ddqH0djoHz6nkgZxZg0U6Z4hcDibrGMxjeHecL0Im93t540UZhZkWksc6JQSTO5f5MsjHo0otcB67zHX9QF2Aib0Ju7PlbxYsbdSJXxzl9F0s39w1pgg5cHY2sOk4EayatUUDZE6rlcCvCChZdGIJymMi7r6HhL7fFnngAeD3W9u1aZ6XojbFT0s1B70TZma8q98f1K4wqAjqjV3yuVTgZwVQusUpqRSzmGE8AfCSuuYcPgn6ccnLwZJfEUcm30faIAHtdvZ1oARYoa0
libwiretap = 2.6.6-alt1:sisyphus+219299.100.2.1
#
 
====={{ok}}Если ставится в систему с пакетом N = E:V-R=====
 
Это совпадает со старой ситуацией, когда disttag-а нет ни в <code>Provides</code>, ни в <code>Conflicts</code>; поэтому не буду проверять.
 
====={{fail}}Если уже стоит, а ставится пакет N = E:V-R:D=====
 
В качестве примера пакета с конфликтом будет {{pkg|wireshark-base}}.
 
# rpm -U /home/user/MNT/ALT/repo/sisyphus/date/2019/01/18/x86_64/RPMS.classic/wireshark-base-2.6.6-alt1.x86_64.rpm --nodeps
# rpm -q wireshark-base --conflicts
libwiretap < 2.6.6-alt1
libwiretap > 2.6.6-alt1
# rpm -U /home/user/MNT/ALT/repo/sisyphus/date/2019/01/18/x86_64/RPMS.classic/libwiretap-2.6.6-alt1.x86_64.rpm --test
error: Failed dependencies:
libwiretap > 2.6.6-alt1 conflicts with (installed) wireshark-base-2.6.6-alt1.x86_64
#
 
====={{ok}}Если уже стоит, а ставится пакет N = E:V-R=====
 
Это совпадает со старой ситуацией, когда disttag-а нет ни в <code>Provides</code>, ни в <code>Conflicts</code>; поэтому не буду проверять.
 
====Проверка Conflicts: N > E:V-R:D====
 
В качестве примера пакета с таким Conflicts возьмём {{pkg|wireshark}}, известный из {{altbug|35930}}, но пересобранный так, чтобы в <code>Conflicts</code> попал disttag:
 
# rpm -qp /home/user/hasher/repo/x86_64/RPMS.hasher/wireshark-base-2.6.6-alt1.x86_64.rpm --conflicts
libwiretap < 2.6.6-alt1:zzz+777
libwiretap > 2.6.6-alt1:zzz+777
# rpm -qp /home/user/hasher/repo/x86_64/RPMS.hasher/libwiretap-2.6.6-alt1.x86_64.rpm --conflicts
# rpm -qp /home/user/hasher/repo/x86_64/RPMS.hasher/libwiretap-2.6.6-alt1.x86_64.rpm --provides
libwiretap.so.8()(64bit) =
set:ld8aYWy1b4sDqBG48DBFCfoLMB7ddqH0djoHz6nkgZxZg0U6Z4hcDibrGMxjeHecL0Im93t540UZhZkWksc6JQSTO5f5MsjHo0otcB67zHX9QF2Aib0Ju7PlbxYsbdSJXxzl9F0s39w1pgg5cHY2sOk4EayatUUDZE6rlcCvCChZdGIJymMi7r6HhL7fFnngAeD3W9u1aZ6XojbFT0s1B70TZma8q98f1K4wqAjqjV3yuVTgZwVQusUpqRSzmGE8AfCSuuYcPgn6ccnLwZJfEUcm30faIAHtdvZ1oARYoa0
libwiretap = 2.6.6-alt1:zzz+777
 
В качестве примера пакета с конфликтом будет {{pkg|wireshark-base}}.
В качестве пакета с <code>N = E:V-R:D</code> будет {{pkg|libwiretap}} с <code>libwiretap = 2.6.6-alt1:zzz+777</code>.
 
Это подпакеты одного исходного пакета, поэтому есть возможность в <code>Conflicts</code> вставить disttag той же самой сборки.
 
====={{ok}}Если ставится одновременно с пакетом N = E:V-R:D=====
 
# rpm -U /home/user/hasher/repo/x86_64/RPMS.hasher/{libwiretap,wireshark-base}-2.6.6-alt1.x86_64.rpm --test; echo $?
0
 
====={{fail}}Если ставится одновременно с пакетом N = E:V-R:D1 (другим)=====
 
(Такой пакет возьмём из архива.)
 
$ curlftpfs -o allow_other,kernel_cache ftp://ftp.altlinux.org/pub/distributions/archive /home/user/MNT/ALT/repo
# rpm -qp /home/user/MNT/ALT/repo/sisyphus/date/2019/01/18/x86_64/RPMS.classic/libwiretap-2.6.6-alt1.x86_64.rpm --provides
libwiretap.so.8()(64bit) = set:ld8aYWy1b4sDqBG48DBFCfoLMB7ddqH0djoHz6nkgZxZg0U6Z4hcDibrGMxjeHecL0Im93t540UZhZkWksc6JQSTO5f5MsjHo0otcB67zHX9QF2Aib0Ju7PlbxYsbdSJXxzl9F0s39w1pgg5cHY2sOk4EayatUUDZE6rlcCvCChZdGIJymMi7r6HhL7fFnngAeD3W9u1aZ6XojbFT0s1B70TZma8q98f1K4wqAjqjV3yuVTgZwVQusUpqRSzmGE8AfCSuuYcPgn6ccnLwZJfEUcm30faIAHtdvZ1oARYoa0
libwiretap = 2.6.6-alt1:sisyphus+219299.100.2.1
# rpm -U /home/user/MNT/ALT/repo/sisyphus/date/2019/01/18/x86_64/RPMS.classic/libwiretap-2.6.6-alt1.x86_64.rpm /home/user/hasher/repo/x86_64/RPMS.hasher/wireshark-base-2.6.6-alt1.x86_64.rpm --test; echo $?
error: Failed dependencies:
wireshark-base = 2.6.6-alt1:sisyphus+219299.100.2.1 is needed by libwiretap-2.6.6-alt1.x86_64
libwiretap = 2.6.6-alt1:zzz+777 is needed by wireshark-base-2.6.6-alt1.x86_64
libwiretap < 2.6.6-alt1:zzz+777 conflicts with wireshark-base-2.6.6-alt1.x86_64
2
 
(Тут подействовал <code>Conflicts</code> со знаком <, но мог подействовать и > при другом значении.)
 
=====Если ставится одновременно с пакетом N = E:V-R=====
 
(Такой пакет возьмём позже из другой сборки.)
 
====={{ok}}Если ставится в систему с пакетом N = E:V-R:D=====
 
# rpm -U /home/user/hasher/repo/x86_64/RPMS.hasher/libwiretap-2.6.6-alt1.x86_64.rpm --nodeps
# rpm -q libwiretap --provides
libwiretap.so.8()(64bit) = set:ld8aYWy1b4sDqBG48DBFCfoLMB7ddqH0djoHz6nkgZxZg0U6Z4hcDibrGMxjeHecL0Im93t540UZhZkWksc6JQSTO5f5MsjHo0otcB67zHX9QF2Aib0Ju7PlbxYsbdSJXxzl9F0s39w1pgg5cHY2sOk4EayatUUDZE6rlcCvCChZdGIJymMi7r6HhL7fFnngAeD3W9u1aZ6XojbFT0s1B70TZma8q98f1K4wqAjqjV3yuVTgZwVQusUpqRSzmGE8AfCSuuYcPgn6ccnLwZJfEUcm30faIAHtdvZ1oARYoa0
libwiretap = 2.6.6-alt1:zzz+777
# rpm -U /home/user/hasher/repo/x86_64/RPMS.hasher/wireshark-base-2.6.6-alt1.x86_64.rpm --test; echo $?
0
 
====={{fail}}Если ставится в систему с пакетом N = E:V-R:D1 (disstag другой)=====
 
# rpm -U /home/user/MNT/ALT/repo/sisyphus/date/2019/01/18/x86_64/RPMS.classic/libwiretap-2.6.6-alt1.x86_64.rpm --nodeps
# rpm -q libwiretap --provides
libwiretap.so.8()(64bit) = set:ld8aYWy1b4sDqBG48DBFCfoLMB7ddqH0djoHz6nkgZxZg0U6Z4hcDibrGMxjeHecL0Im93t540UZhZkWksc6JQSTO5f5MsjHo0otcB67zHX9QF2Aib0Ju7PlbxYsbdSJXxzl9F0s39w1pgg5cHY2sOk4EayatUUDZE6rlcCvCChZdGIJymMi7r6HhL7fFnngAeD3W9u1aZ6XojbFT0s1B70TZma8q98f1K4wqAjqjV3yuVTgZwVQusUpqRSzmGE8AfCSuuYcPgn6ccnLwZJfEUcm30faIAHtdvZ1oARYoa0
libwiretap = 2.6.6-alt1:sisyphus+219299.100.2.1
# rpm -U /home/user/hasher/repo/x86_64/RPMS.hasher/wireshark-base-2.6.6-alt1.x86_64.rpm --test; echo $?
error: Failed dependencies:
libwiretap = 2.6.6-alt1:zzz+777 is needed by wireshark-base-2.6.6-alt1.x86_64
libwiretap < 2.6.6-alt1:zzz+777 conflicts with wireshark-base-2.6.6-alt1.x86_64
1
#
 
 
=====Если ставится в систему с пакетом N = E:V-R=====
 
(Такой пакет возьмём позже из другой сборки.)
 
=====Если уже стоит, а ставится пакет N = E:V-R:D=====
 
=====Если уже стоит, а ставится пакет N = E:V-R:D1 (disstag другой)=====
 
=====Если уже стоит, а ставится пакет N = E:V-R=====
 
(Такой пакет возьмём позже из другой сборки.)
 
====Проверка Conflicts: N < E:V-R (без disttag)====
 
(Вообще, это неинтересный вариант, потому что мы ожидаем, что всё получится, т.е. в отличие от [[#Проверка Conflicts: N > E:V-R (без disttag)]] он не выявляет никаких ошибок и неявляется исследованием нового предложния.)
 
Точно так же, как в [[#Проверка Conflicts: N > E:V-R (без disttag)]]:
 
В качестве примера пакета с конфликтом будет {{pkg|wireshark-base}} (с только одним оставленным конфлкиктом в результате пересборки, в отличие от примера из [[#Проверка Conflicts: N > E:V-R (без disttag)]]).
 
В качестве пакета с <code>N = E:V-R:D</code> будет {{pkg|libwiretap}} с <code>libwiretap = 2.6.6-alt1:zzz+777</code>.
 
Это подпакеты одного исходного пакета.
 
$ rpm -qp /home/user/hasher/repo/x86_64/RPMS.hasher/wireshark-base-2.6.6-alt1.x86_64.rpm --conflicts
libwiretap < 2.6.6-alt1
$ rpm -qp /home/user/hasher/repo/x86_64/RPMS.hasher/libwiretap-2.6.6-alt1.x86_64.rpm
libwiretap-2.6.6-alt1.x86_64
$ rpm -qp /home/user/hasher/repo/x86_64/RPMS.hasher/libwiretap-2.6.6-alt1.x86_64.rpm --provides
libwiretap.so.8()(64bit) = set:ld8aYWy1b4sDqBG48DBFCfoLMB7ddqH0djoHz6nkgZxZg0U6Z4hcDibrGMxjeHecL0Im93t540UZhZkWksc6JQSTO5f5MsjHo0otcB67zHX9QF2Aib0Ju7PlbxYsbdSJXxzl9F0s39w1pgg5cHY2sOk4EayatUUDZE6rlcCvCChZdGIJymMi7r6HhL7fFnngAeD3W9u1aZ6XojbFT0s1B70TZma8q98f1K4wqAjqjV3yuVTgZwVQusUpqRSzmGE8AfCSuuYcPgn6ccnLwZJfEUcm30faIAHtdvZ1oARYoa0
libwiretap = 2.6.6-alt1:zzz+777
$
 
====={{ok}}Если ставится одновременно с пакетом N = E:V-R:D=====
 
Как и ожидалось (по лексикографическому сравнению):
 
# rpm -U /home/user/hasher/repo/x86_64/RPMS.hasher/{libwiretap,wireshark-base}-2.6.6-alt1.x86_64.rpm --test
# echo $?
0
 
====={{ok}}Если ставится одновременно с пакетом N = E:V-R=====
 
Это совпадает со старой ситуацией, когда disttag-а нет ни в <code>Provides</code>, ни в <code>Conflicts</code>; поэтому не буду проверять.
 
====={{ok}}Если ставится в систему с пакетом N = E:V-R:D=====
 
Как и ожидалось (по лексикографическому сравнению):
 
# rpm -U /home/user/hasher/repo/x86_64/RPMS.hasher/libwiretap-2.6.6-alt1.x86_64.rpm --nodeps
# rpm -U /home/user/hasher/repo/x86_64/RPMS.hasher/wireshark-base-2.6.6-alt1.x86_64.rpm --test; echo $?
0
 
====={{ok}}Если ставится в систему с пакетом N = E:V-R=====
 
Это совпадает со старой ситуацией, когда disttag-а нет ни в <code>Provides</code>, ни в <code>Conflicts</code>; поэтому не буду проверять.
 
====={{ok}}Если уже стоит, а ставится пакет N = E:V-R:D=====
 
Как и ожидалось (по лексикографическому сравнению):
 
# rpm -U /home/user/hasher/repo/x86_64/RPMS.hasher/wireshark-base-2.6.6-alt1.x86_64.rpm --nodeps
# rpm -U /home/user/hasher/repo/x86_64/RPMS.hasher/libwiretap-2.6.6-alt1.x86_64.rpm --test; echo $?
0
 
====={{ok}}Если уже стоит, а ставится пакет N = E:V-R=====
 
Это совпадает со старой ситуацией, когда disttag-а нет ни в <code>Provides</code>, ни в <code>Conflicts</code>; поэтому не буду проверять.
 
====Проверка Conflicts: N < E:V-R:D====
 
=====Если ставится одновременно с пакетом N = E:V-R:D=====
 
=====Если ставится одновременно с пакетом N = E:V-R=====
 
=====Если ставится в систему с пакетом N = E:V-R:D=====
 
=====Если ставится в систему с пакетом N = E:V-R=====
 
=====Если уже стоит, а ставится пакет N = E:V-R:D=====
 
=====Если уже стоит, а ставится пакет N = E:V-R=====

Версия от 09:23, 17 февраля 2019


В "идентификаторах" пакетов (основных Provides) появился disttag (D: N-E:V-R:D), который различает разные сборки пакета из одних и тех же исходников (E:V-R). Disttag имеет особую семантику при участии в удовлетворении зависимостей и т.п., а также при принятии решения об обновлении (какая сборка пакета будет предпочтительна).

Желаемое поведение

Желаемое поведение rpm ("rpm-install") в отношении disttag вот такое:

...

Мы полагаем, что такое поведение уже реализовано в "новом" rpm ("rpm-install"), а именно 4.13.0.1-alt5.

Особенности поведения "нового" и "старого" rpm ("rpm-install") в отношении disttag

Здесь нас особенно волнует поведение "старого" rpm ("rpm-install"), а именно 4.13.0.1-alt4 или старого из p8 и пр., при столкновении с пакетом, где уже используется disttag (был добавлен туда "новым" rpm-build).

Что касается "нового" rpm ("rpm-install"), то он задуман так, что требования N > E:V-R:D и N > E:V-R (без disttag) будут удволетворяться одним и тем же множеством пакетов (потому что disttag-и несравнимы), а значит, будут иметь одинаковый эффект:

  • Requires: N > E:V-R:D и Requires: N > E:V-R (без disttag);
  • Conflicts: N > E:V-R:D и Conflicts: N > E:V-R (без disttag);
  • Obsoletes: N > E:V-R:D и Obsoletes: N > E:V-R (без disttag).

То же самое верно для другого строгого знака: требования N < E:V-R:D и N < E:V-R (без disttag) будут удволетворяться одним и тем же множеством пакетов.

Внимание! К сожалению, с появлением обработки disttag-ов в новом rpm Conflicts уже ни в каком виде больше не смогут гарантировать то, что мейнтейнер хотел выразить в некоторых случаях: что не могут одновременно стоять пакеты из разных сборок. (Но всё же возможно потребовать, чтобы они были из одних исходников, а именно релиза пакета.)


Так что выбор между двумя возможностям (как записать такие Conflicts, Obsoletes; такой Requires бесполезен) может быть сделан на основе более желательного поведения "старого" rpm ("rpm-install") при столкновении с такими пакетами.

Проверка старым rpm

Есть тесты constraints.mk, где проверяется удовлетворение требований разного вида (Requires, Provides), разных знаков (>, <, =) и разной точности (с указанием disttag и без, с указанием epoch и без, а также с указанием только версии). (В релизе 1.0-alt2.M70P.1 пакета rpminstall-tests тесты, в которых есть новые зависимости с disttag-ом, помечены как возможно неуспешные и имеют специальное примечание, чтобы было легче изучать результаты при использовании старого rpm.)

Ожидаемое поведение соответствует логике нового rpm. Результаты запуска на старом rpm как раз могут дать информацию для выбора предпочтительной формы записи требований в новых пакетах, чтобы разумно обрабатываться старым rpm. Желательно выбрать такую форму, которая не вызовет непрохождение теста на старом rpm.

Вот результаты запуска на старом rpm (список непрошедших тестов):

XFailed tests:
noninstallable_dummyDisttag_with_reqGreaterEpoch (external dep & future pkg )
noninstallable_dummyDisttag_before_reqGreaterEpoch (external dep & future pkg )
noninstallable_virtDummyDisttag_with_reqGreaterEpoch (external dep & future pkg )
noninstallable_virtDummyDisttag_before_reqGreaterEpoch (external dep & future pkg)
installable_dummyDisttag_with_conflGreaterEpoch (external dep & future pkg )
installable_dummyDisttag_before_conflGreaterEpoch (external dep & future pkg)
installable_dummyDisttag_after_conflGreaterEpoch (external dep & future pkg )
installable_virtDummyDisttag_with_conflGreaterEpoch (external dep & future pkg )
installable_virtDummyDisttag_before_conflGreaterEpoch (external dep & future pkg)
installable_virtDummyDisttag_after_conflGreaterEpoch (external dep & future pkg)
installable_dummyDisttag_with_reqEqualEpoch (external/strict-old-old dep & future pkg )
installable_dummyDisttag_before_reqEqualEpoch (external/strict-old-old dep & future pkg)
noninstallable_dummyDisttag_with_conflEqualEpoch (external/strict-old-old dep & future pkg )
noninstallable_dummyDisttag_before_conflEqualEpoch (external/strict-old-old dep & future pkg)
noninstallable_dummyDisttag_after_conflEqualEpoch (external/strict-old-old dep & future pkg)
installable_virtDummyDisttag_with_reqEqualEpoch (external/strict-old-old dep & future pkg )
installable_virtDummyDisttag_before_reqEqualEpoch (external/strict-old-old dep & future pkg)
noninstallable_virtDummyDisttag_with_conflEqualEpoch (external/strict-old-old dep & future pkg )
noninstallable_virtDummyDisttag_before_conflEqualEpoch (external/strict-old-old dep & future pkg)
noninstallable_virtDummyDisttag_after_conflEqualEpoch (external/strict-old-old dep & future pkg)
noninstallable_dummyDisttag_with_reqGreater (elusive external dep & future pkg )
noninstallable_dummyDisttag_before_reqGreater (elusive external dep & future pkg )
noninstallable_virtDummyDisttag_with_reqGreater (elusive external dep & future pkg )
noninstallable_virtDummyDisttag_before_reqGreater (elusive external dep & future pkg)
installable_dummyDisttag_with_conflGreater (elusive external dep & future pkg )
installable_dummyDisttag_before_conflGreater (elusive external dep & future pkg)
installable_dummyDisttag_after_conflGreater (elusive external dep & future pkg )
installable_virtDummyDisttag_with_conflGreater (elusive external dep & future pkg )
installable_virtDummyDisttag_before_conflGreater (elusive external dep & future pkg)
installable_virtDummyDisttag_after_conflGreater (elusive external dep & future pkg)
installable_dummyDisttag_with_reqEqual (elusive external/strict-old-old dep & future pkg )
installable_dummyDisttag_before_reqEqual (elusive external/strict-old-old dep & future pkg)
noninstallable_dummyDisttag_with_conflEqual (elusive external/strict-old-old dep & future pkg )
noninstallable_dummyDisttag_before_conflEqual (elusive external/strict-old-old dep & future pkg)
noninstallable_dummyDisttag_after_conflEqual (elusive external/strict-old-old dep & future pkg)
installable_virtDummyDisttag_with_reqEqual (elusive external/strict-old-old dep & future pkg )
installable_virtDummyDisttag_before_reqEqual (elusive external/strict-old-old dep & future pkg)
noninstallable_virtDummyDisttag_with_conflEqual (elusive external/strict-old-old dep & future pkg )
noninstallable_virtDummyDisttag_before_conflEqual (elusive external/strict-old-old dep & future pkg)
noninstallable_virtDummyDisttag_after_conflEqual (elusive external/strict-old-old dep & future pkg)
noninstallable_dummy_with_reqLessEpochDisttag (bogus future dep & old pkg )
noninstallable_dummy_before_reqLessEpochDisttag (bogus future dep & old pkg )
noninstallable_virtDummy_with_reqLessEpochDisttag (bogus future dep & old pkg )
noninstallable_virtDummy_before_reqLessEpochDisttag (bogus future dep & old pkg)
installable_dummy_with_conflLessEpochDisttag (bogus future dep & old pkg )
installable_dummy_before_conflLessEpochDisttag (bogus future dep & old pkg)
installable_dummy_after_conflLessEpochDisttag (bogus future dep & old pkg )
installable_virtDummy_with_conflLessEpochDisttag (bogus future dep & old pkg )
installable_virtDummy_before_conflLessEpochDisttag (bogus future dep & old pkg)
installable_virtDummy_after_conflLessEpochDisttag (bogus future dep & old pkg)
nonobsoleted_dummy_with_obsolLessEpochDisttag (bogus future dep & old pkg )
nonobsoleted_dummy_updated_with_obsolLessEpochDisttag (bogus future dep & old pkg )
nonobsoleted_dummy_before_obsolLessEpochDisttag (bogus future dep & old pkg )
nonobsoleted_dummy_after_obsolLessEpochDisttag (bogus future dep & old pkg )
nonobsoleted_dummyDisttag_with_obsolLessEpochDisttag (bogus future dep & future pkg )
nonobsoleted_dummyDisttag_updated_with_obsolLessEpochDisttag (bogus future dep & future pkg )
nonobsoleted_dummyDisttag_before_obsolLessEpochDisttag (bogus future dep & future pkg )
nonobsoleted_dummyDisttag_after_obsolLessEpochDisttag (bogus future dep & future pkg )
obsoleted_dummyDisttag_before_obsolEqualEpochDisttag (unrealistic obsoleting disttag )
noninstallable_dummy_with_reqLessDisttag (elusive bogus future dep )
noninstallable_dummy_before_reqLessDisttag (elusive bogus future dep )
noninstallable_virtDummy_with_reqLessDisttag (elusive bogus future dep )
noninstallable_virtDummy_before_reqLessDisttag (elusive bogus future dep )
installable_dummy_with_conflLessDisttag (elusive bogus future dep )
installable_dummy_before_conflLessDisttag (elusive bogus future dep)
installable_dummy_after_conflLessDisttag (elusive bogus future dep )
installable_virtDummy_with_conflLessDisttag (elusive bogus future dep )
installable_virtDummy_before_conflLessDisttag (elusive bogus future dep)
installable_virtDummy_after_conflLessDisttag (elusive bogus future dep )
nonobsoleted_dummy_with_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummy_updated_with_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummy_before_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummy_after_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummyDisttag_with_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummyDisttag_updated_with_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummyDisttag_before_obsolLessDisttag (elusive bogus future dep )
nonobsoleted_dummyDisttag_after_obsolLessDisttag (elusive bogus future dep )
obsoleted_dummyDisttag_before_obsolEqualDisttag (unrealistic obsoleting disttag )
installable_provVR3Disttag_with_reqEq_VR3 (elusive external/strict-old-old dep & future pkg )
installable_provVR3Disttag_before_reqEq_VR3 (elusive external/strict-old-old dep & future pkg)
Failed tests:
noninstallable_provOnlyV_with_reqVR
noninstallable_provOnlyV_before_reqVR
installable_provOnlyV_with_conflVR
installable_provOnlyV_before_conflVR
make: *** [/home/user/wip/2019-01-rpm-disttag/rpminstall-tests/Makefile:29: all_tests] Error 1


Ещё можно рассмотреть случай (не описанный в тестах constraints.mk), когда пакет с требованием с указанием disttag-а E:V-R:D ставится с пакетом N = E:V-R:D1 (тем же именем, но с другим disttag-ом).