Transition to disttag
В "идентификаторах" пакетов (основных 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) будут удволетворяться одним и тем же множеством пакетов.
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 (список непрошедших тестов):
./makeme.sh ... 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)
Новый пакет (с disttag-ом) смог удовлетворить требование Requires: dummy > E:V-R
, хотя не должен был (у него как раз те же E:V-R
и disttag).
Кажется, на практике это не очень важно: зависимости вида Requires: dummy > E:V-R
скорее на практике не используются, чаще это Requires: dummy >= E:V-R
.
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)
Новый пакет с disttag-ом, а в конфликте второго пакета написано просто > E:V-R
. (Релиз
тот же самый). Ожидалось, что он поставится, но со старым rpm не так.
Такой случай и стал поводом к написанию altbug:35930. Поведение нежелательное.
installable_dummyDisttag_with_reqEqualEpoch (external/strict-old-old dep & future pkg ) installable_dummyDisttag_before_reqEqualEpoch (external/strict-old-old dep & future pkg)
Теоретически новый пакет с disttag-ом должен был удовлетворить зависимость без disttag-а. Но со старым rpm не так. Важно ли это на пракктике?
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 $ rpm -q rpm rpm-build --lastchange * Пт окт 05 2018 Gleb F-Malinovskiy <glebfm@altlinux.org> 4.13.0.1-alt4 - Add _allow_deps_with_beginning_dot macro to allow dependencies beginning with a dot character in spec file (vseleznv@). * Чт янв 31 2019 Gleb F-Malinovskiy <glebfm@altlinux.org> 4.0.4-alt126 - imz@: + shell.req: correctly detect #!/bin/env bash (ALT#35376). + platform.in: completely expand %_libsuff (/usr/lib%nil was ugly). - Fixed getopt(3) use in parameterized macros parser.
Ещё можно рассмотреть случай (не описанный в тестах constraints.mk), когда пакет с требованием с указанием disttag-а E:V-R:D
ставится с пакетом N = E:V-R:D1
(тем же именем, но с другим disttag-ом).