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") при столкновении с такими пакетами.
Проверка Conflicts старым rpm
Проверка Conflicts: N > E:V-R (без disttag)
В качестве примера пакета с таким Conflicts возьмём wireshark, известный из altbug #35930:
$ 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/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 $
В качестве примера пакета с конфликтом будет wireshark-base.
В качестве пакета с N = E:V-R:D
будет libwiretap с libwiretap = 2.6.6-alt1:sisyphus+219299.100.2.1
.
Это подпакеты одного исходного пакета, поэтому есть возможность в Conflicts
вставить disttag той же самой сборки.
Если ставится одновременно с пакетом N = E:V-R:D
# 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
Эффект объясним тем, что 2.6.6-alt1:sisyphus+219299.100.2.1
лексикографически больше 2.6.6-alt1
(для "старого" rpm ("rpm-install"), который не отделяет disttag).
Если ставится одновременно с пакетом N = E:V-R
Это совпадает со старой ситуацией, когда disttag-а нет ни в Provides
, ни в Conflicts
; поэтому не буду проверять.
Если ставится в систему с пакетом 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 #
Если ставится в систему с пакетом N = E:V-R
Это совпадает со старой ситуацией, когда disttag-а нет ни в Provides
, ни в Conflicts
; поэтому не буду проверять.
Если уже стоит, а ставится пакет N = E:V-R:D
В качестве примера пакета с конфликтом будет 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 #
Если уже стоит, а ставится пакет N = E:V-R
Это совпадает со старой ситуацией, когда disttag-а нет ни в Provides
, ни в Conflicts
; поэтому не буду проверять.
Проверка Conflicts: N > E:V-R:D
В качестве примера пакета с таким Conflicts возьмём wireshark, известный из altbug #35930, но пересобранный так, чтобы в Conflicts
попал 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
В качестве примера пакета с конфликтом будет wireshark-base.
В качестве пакета с N = E:V-R:D
будет libwiretap с libwiretap = 2.6.6-alt1:zzz+777
.
Это подпакеты одного исходного пакета, поэтому есть возможность в Conflicts
вставить disttag той же самой сборки.
Если ставится одновременно с пакетом 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
Если ставится одновременно с пакетом 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
(Тут подействовал Conflicts
со знаком <, но мог подействовать и > при другом значении.)
Если ставится одновременно с пакетом N = E:V-R
(Такой пакет возьмём позже из другой сборки.)
Если ставится в систему с пакетом 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
Если ставится в систему с пакетом 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):
В качестве примера пакета с конфликтом будет wireshark-base (с только одним оставленным конфлкиктом в результате пересборки, в отличие от примера из #Проверка Conflicts: N > E:V-R (без disttag)).
В качестве пакета с N = E:V-R:D
будет libwiretap с libwiretap = 2.6.6-alt1:zzz+777
.
Это подпакеты одного исходного пакета.
$ 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 $
Если ставится одновременно с пакетом 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
Если ставится одновременно с пакетом N = E:V-R
Это совпадает со старой ситуацией, когда disttag-а нет ни в Provides
, ни в Conflicts
; поэтому не буду проверять.
Если ставится в систему с пакетом 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
Если ставится в систему с пакетом N = E:V-R
Это совпадает со старой ситуацией, когда disttag-а нет ни в Provides
, ни в Conflicts
; поэтому не буду проверять.
Если уже стоит, а ставится пакет 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
Если уже стоит, а ставится пакет N = E:V-R
Это совпадает со старой ситуацией, когда disttag-а нет ни в Provides
, ни в Conflicts
; поэтому не буду проверять.