Bug 35930

Summary: старый rpm не может обновить пакеты с конфликтами на себя, собранные с новым rpm, при dist-upgrade
Product: Sisyphus Reporter: Aleksei Nikiforov <darktemplaralt>
Component: rpmAssignee: placeholder <placeholder>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: aen, at, glebfm, imz, ldv, placeholder, rider, vseleznv, vt
Version: unstable   
Hardware: all   
OS: Linux   
Bug Depends on: 36180    
Bug Blocks:    
Attachments:
Description Flags
pkgs.log none

Description Aleksei Nikiforov 2019-01-18 15:28:16 MSK
Created attachment 7961 [details]
pkgs.log

При попытке сделать dist-upgrade, apt-get предложил удалить пакеты libwiretap, wireshark-base и wireshark-qt5 несмотря на отсутствие конфликтов с какими-либо пакетами. Также до применения dist-upgrade установить эти пакеты apt отказался. Логи прилагаются.
Comment 1 Dmitry V. Levin 2019-01-18 15:49:34 MSK
Надо сперва обновить rpm, а потом уже всё остальное?
Comment 2 AEN 2019-01-18 15:56:02 MSK
(In reply to comment #1)
> Надо сперва обновить rpm, а потом уже всё остальное?

Или сперва dist-upgrade в текущем бранче, а потом уже в новом стабильном.
Comment 3 Aleksei Nikiforov 2019-01-18 16:00:38 MSK
(В ответ на комментарий №2)
> (In reply to comment #1)
> > Надо сперва обновить rpm, а потом уже всё остальное?
> 
> Или сперва dist-upgrade в текущем бранче, а потом уже в новом стабильном.

Но это Сизиф, который не обновлялся всего несколько дней.
Comment 4 Anton Farygin 2019-01-18 16:13:30 MSK
Теперь главное не повторить эту ошибку в p8.
Comment 5 Dmitry V. Levin 2019-01-18 16:31:47 MSK
(In reply to comment #4)
> Теперь главное не повторить эту ошибку в p8.

Я не вижу других вариантов для p8.
Чем раньше rpm в p8 научится обрабатывать EVRD, тем лучше для p8.
Comment 6 Ivan Zakharyaschev 2019-01-18 17:12:39 MSK
Это особый случай, напоролись на конфликты. (Мы при обсуждении новой фичи это предвидели.)

[root@prodesk0 ~]# rpm -q rpm
rpm-4.13.0.1-alt1.x86_64
[root@prodesk0 ~]# apt-get install wireshark-qt5
Reading Package Lists... Done
Building Dependency Tree... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.

Since you only requested a single operation it is extremely likely that
the package is simply not installable and a bug report against
that package should be filed.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
  wireshark-qt5: Depends: wireshark-base (= 2.6.6-alt1:sisyphus+219299.100.2.1)
E: Broken packages
[root@prodesk0 ~]# rpm -Uhv /ALT/Sisyphus/x86_64/RPMS.classic/wireshark-qt5-2.6.6-alt1.x86_64.rpm /ALT/Sisyphus/x86_64/RPMS.classic/wireshark-base-2.6.6-alt1.x86_64.rpm /ALT/Sisyphus/x86_64/RPMS.classic/libwiretap-2.6.6-alt1.x86_64.rpm 
error: Failed dependencies:
	libwiretap > 2.6.6-alt1 conflicts with wireshark-base-2.6.6-alt1.x86_64
[root@prodesk0 ~]#
Comment 7 Ivan Zakharyaschev 2019-01-18 17:17:49 MSK
(In reply to comment #6)

> [root@prodesk0 ~]# rpm -Uhv
> /ALT/Sisyphus/x86_64/RPMS.classic/wireshark-qt5-2.6.6-alt1.x86_64.rpm
> /ALT/Sisyphus/x86_64/RPMS.classic/wireshark-base-2.6.6-alt1.x86_64.rpm
> /ALT/Sisyphus/x86_64/RPMS.classic/libwiretap-2.6.6-alt1.x86_64.rpm 
> error: Failed dependencies:
>     libwiretap > 2.6.6-alt1 conflicts with wireshark-base-2.6.6-alt1.x86_64
> [root@prodesk0 ~]#

Давайте конфликты на подпакеты вида "> %EVR" переписывать в "> %EVR:D".

Тогда будет лучше совместимо со старым rpm, который не знает про disttag.

Про "< %EVR" надо подумать.
Comment 8 Ivan Zakharyaschev 2019-01-18 17:28:59 MSK
(In reply to comment #7)
> (In reply to comment #6)
> 
> > [root@prodesk0 ~]# rpm -Uhv
> > /ALT/Sisyphus/x86_64/RPMS.classic/wireshark-qt5-2.6.6-alt1.x86_64.rpm
> > /ALT/Sisyphus/x86_64/RPMS.classic/wireshark-base-2.6.6-alt1.x86_64.rpm
> > /ALT/Sisyphus/x86_64/RPMS.classic/libwiretap-2.6.6-alt1.x86_64.rpm 
> > error: Failed dependencies:
> >     libwiretap > 2.6.6-alt1 conflicts with wireshark-base-2.6.6-alt1.x86_64
> > [root@prodesk0 ~]#
> 
> Давайте конфликты на подпакеты вида "> %EVR" переписывать в "> %EVR:D".
> 
> Тогда будет лучше совместимо со старым rpm, который не знает про disttag.
> 
> Про "< %EVR" надо подумать.

Ещё можно подмать про "Requires: подпакет >= %EVR" -- но это неважно, потому что превратится в строгую зависимость. А строго "Requires: подпакет > %EVR" всё равно бессмысленно. То же касается "Requires: подпакет <= %EVR" и "Requires: подпакет < %EVR". Т.е. тут делать ничего не надо.

Нестрогий "Conflicts: подпакет >= %EVR" или "Conflicts: подпакет <= %EVR" выглядит тоже бессмысленно.

Obsoletes, кажется, должен требовать такого же подхода, как Conflicts.

Остаётся не обдуманным "Conflicts: подпакет < %EVR"
Comment 9 Anton Farygin 2019-01-18 17:38:20 MSK
(В ответ на комментарий №7)
> (In reply to comment #6)
> 
> > [root@prodesk0 ~]# rpm -Uhv
> > /ALT/Sisyphus/x86_64/RPMS.classic/wireshark-qt5-2.6.6-alt1.x86_64.rpm
> > /ALT/Sisyphus/x86_64/RPMS.classic/wireshark-base-2.6.6-alt1.x86_64.rpm
> > /ALT/Sisyphus/x86_64/RPMS.classic/libwiretap-2.6.6-alt1.x86_64.rpm 
> > error: Failed dependencies:
> >     libwiretap > 2.6.6-alt1 conflicts with wireshark-base-2.6.6-alt1.x86_64
> > [root@prodesk0 ~]#
> 
> Давайте конфликты на подпакеты вида "> %EVR" переписывать в "> %EVR:D".
> 
> Тогда будет лучше совместимо со старым rpm, который не знает про disttag.
> 
> Про "< %EVR" надо подумать.

Ваня, спасибо. Ты прав.
Надо чуть чуть подправить и тогда будет хорошо. Сделайте, пожалуйста, для начала - в Sisyphus. wireshark я отправлю на rebuild (или сами отправляйте, релиз ему наверняка не надо увеличивать).
Comment 10 Dmitry V. Levin 2019-02-13 05:02:43 MSK
Резюмирую: в Сизифе при переходе на disttags надо сперва обновить rpm, а потом уже делать apt-get dist-upgrade.  Что именно делать в бранчах, решат мантейнеры бранчей, но принципиально другого подхода я не вижу.
Comment 11 Anton Farygin 2019-02-13 07:48:08 MSK
ментейнеры бранчей не решат, к сожалению. Им надо помочь.
Comment 12 Ivan Zakharyaschev 2019-02-14 14:34:16 MSK
Чтобы облегчить ситуацию с обработкой Conflicts в новых пакетах (с disttag-ом в Provides) старым rpm (который не умеет сравнивать disttag-и), я предлагал начать с простой подмены значения макроса %EVR на E:V-R:D. (Причём он был заведён специально для указания межподпакетных завеисимостей, так что никакого обмана с точки зрения оговоренного смысла тут нет.)

Это отразится на сборке новых пакетов.

Если написано Conflicts: %name < %EVR и Conflicts: %name > %EVR, то подмена подействует.

Если %EVR в Conflicts не написано, то, конечно, не подействует. Какие есть ещё варианты похожих записей?

Если написано Conflicts: %name < %version и Conflicts: %name > %version, то всё и так будет работать, как раньше; помощи не требуется. (Просто менее жёсткие требования были записаны в пакет.)

Если написано Conflicts: %name < %version-%release и Conflicts: %name > %version-%release, то, конечно, потребуется ручное вмешательство мейнтейнера. (Но хоть в другом случае с %EVR можно будет прожить без ручного вмешательства.) При этом надо иметь в виду, что, к сожалению, с ввведением disttag-ов, даже при обрботке новым rpm эти конфликты становятся менее строгими, чем, возможно, задумано, так как не гарантируют больше отсутствие %name из других сборок (но с тем же %release), потому что disttag-и не сравнимы (не имеют порядка). (Это имеет решение в виде заведения common-подпакета.)

Посмотрим, как поведёт себя старый rpm с конфликтами, в которые вписали disttag.

Например, у меня есть набор тестов (в первую очередь на пересечение разных требований с Provides), написанный исходя из ожидаемой логики удовлетворения требований по задуманному алгоритму сравнения. (Это пояснение я пишу к тому, что какой-то интересный случай с Conflicts там может не присутствовать, хотя все возможные комбинации с и без disttag-а при столкновении с тем же релизом там есть.)

Например, старый rpm (из t7) без поддержки сравнения disttag-ов поведёт себя так http://git.altlinux.org/tasks/221387/build/300/x86_64/log -- перечисляю тесты failed и xfailed с точки зрения логики нового rpm (т.е. где отличие поведения по сравнению с новым rpm, который можно считать образцом):

XFailed tests:
noninstallable_virtDummyDisttag_with_reqGreaterEpoch (external dep & future pkg )
noninstallable_virtDummyDisttag_before_reqGreaterEpoch (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_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_virtDummyDisttag_with_reqGreater (elusive external dep & future pkg )
noninstallable_virtDummyDisttag_before_reqGreater (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_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_before_obsolLessEpochDisttag (bogus future dep & old pkg )
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_before_obsolLessDisttag (elusive bogus future dep )
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)
make: Leaving directory `/usr/src/RPM/BUILD/rpminstall-tests-1.0'
+ exit 0

Теперь прокомментирую случаи с кофликтами:

XFailed tests:

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 не так. Такой случай и стал поводом к написанию этого bug report-а.

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)

Конфлкт с равенством E:V-R -- не интересный на практике случай.

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)

Аналогично первому случаю (как в этом bug report-е). (Просто конфликт без эпохи. Эпоха пустая.)

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)

Кофликт с равенством -- неинтересно.

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_before_obsolLessEpochDisttag (bogus future dep & old pkg )

Конфликт "меньше" с disttag-ом (то, что я предлагаю), а пакет без disttag-а в Provides.

По логике сравнения они не должны были бы конфликтовать (т.е. установились бы вместе). Такая логика для нас, конечно, неидеальна, потому что здесь пакет из старой сборки. Но старый rpm даже в этом случае считает их конфликтующими и не устанавливает вместе. Что на может только порадовать. И ещё он вытеснил старый пакет по такому Obsoletes (последний тест).

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_before_obsolLessDisttag (elusive bogus future dep )

То же самое, просто эпоха пустая в конфликте написана.

Вывод: либо поведение соответствует новой логике, либо поведение старого rpm при столкновении с новыми пакетами нам даже приятно (если там добавить disttag в %EVR).

Собираюсь вскоре сделать сборку с изменённым значением %EVR для Sisyphus.

Изучу ещё поведение "старого" rpm из архива Sisyphus таким же способом.
Comment 13 Ivan Zakharyaschev 2019-02-15 15:38:56 MSK
По крайней мере это сейчас сделаю

(In reply to comment #12)
> Чтобы облегчить ситуацию с обработкой Conflicts в новых пакетах (с disttag-ом в
> Provides) старым rpm (который не умеет сравнивать disttag-и), я предлагал
> начать с простой подмены значения макроса %EVR на E:V-R:D. (Причём он был
> заведён специально для указания межподпакетных завеисимостей, так что никакого
> обмана с точки зрения оговоренного смысла тут нет.)

> Собираюсь вскоре сделать сборку с изменённым значением %EVR для Sisyphus.
> 
> Изучу ещё поведение "старого" rpm из архива Sisyphus таким же способом.
Comment 14 Ivan Zakharyaschev 2019-02-17 03:34:35 MSK
(In reply to comment #12)

> Например, старый rpm (из t7) без поддержки сравнения disttag-ов поведёт себя
> так http://git.altlinux.org/tasks/221387/build/300/x86_64/log -- перечисляю
> тесты failed и xfailed с точки зрения логики нового rpm (т.е. где отличие
> поведения по сравнению с новым rpm, который можно считать образцом):

Это был rpminstall-tests-1.0-alt2.M70P.1 . 

> Изучу ещё поведение "старого" rpm из архива Sisyphus таким же способом.

Сделаем git checkout 1.0-alt2.M70P.1 и запустим в системе с rpm из архива и новым rpm-build (который умеет генерировать пакеты с disttag-ами -- поэтому тестов будет запущено побольше).

./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)
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


Прокомментирую непрошедшие (с т.зр. логики нового rpm) тесты с конфликтами:

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 не так. Такой случай и стал поводом к написанию этого bug report-а.

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)

Конфлкт с равенством E:V-R -- не интересный на практике случай.

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)

Конфлкт с равенством E:V-R -- не интересный на практике случай.

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)

Аналогично первому случаю (как в этом bug report-е). (Просто конфликт без
эпохи. Эпоха пустая.)

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)

Конфлкт с равенством V-R -- не интересный на практике случай.

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)

Конфлкт с равенством V-R -- не интересный на практике случай.

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 )


Конфликт "меньше" с disttag-ом (то, что я предлагаю), а пакет без disttag-а в
Provides, т.е. из старой сборки, а не из этой.

По логике сравнения они не должны были бы конфликтовать (т.е. установились бы
вместе). Такая логика для нас, конечно, неидеальна, потому что здесь пакет из
старой сборки. Но старый rpm даже в этом случае считает их конфликтующими и не
устанавливает вместе. Что нас может только порадовать. И ещё он вытеснил старый
пакет по такому Obsoletes (последние тесты).


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 )

То же самое, просто эпоха пустая в конфликте написана. Нас устраивает.

Выводы те же самые, что в предыдущем комментарии. Переопределение %EVR нам подойдёт ради обработки старым rpm-ом конфликтов в новых пакетах. А новый rpm их тоже нормально обработает, потому что наличие disttag-а после знака "меньше" или "больше" никак не влияет на результат сравнения.
Comment 15 Ivan Zakharyaschev 2019-02-17 04:19:45 MSK
(In reply to comment #14)
> (In reply to comment #12)
> 
> > Например, старый rpm (из t7) без поддержки сравнения disttag-ов поведёт себя
> > так http://git.altlinux.org/tasks/221387/build/300/x86_64/log -- перечисляю
> > тесты failed и xfailed с точки зрения логики нового rpm (т.е. где отличие
> > поведения по сравнению с новым rpm, который можно считать образцом):
> 
> Это был rpminstall-tests-1.0-alt2.M70P.1 . 
> 
> > Изучу ещё поведение "старого" rpm из архива Sisyphus таким же способом.
> 
> Сделаем git checkout 1.0-alt2.M70P.1 и запустим в системе с rpm из архива и
> новым rpm-build (который умеет генерировать пакеты с disttag-ами -- поэтому
> тестов будет запущено побольше).

Это были:

$ 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.
Comment 16 Ivan Zakharyaschev 2019-02-19 17:25:59 MSK
Такой формат (E:V-R:D) не помогает с проблемой со старым rpm без улучшения apt-а (ещё не готового).

Вот проблема со старым форматом конфликтов:

[root@prodesk0 ~]# apt-repo
rpm [alt] file:/ALT Sisyphus/x86_64 classic
rpm [alt] file:/ALT Sisyphus/noarch classic
rpm [alt] file:/ALT Sisyphus/x86_64-i586 classic
[root@prodesk0 ~]# apt-get update; apt-get install wireshark-{base,doc}
Reading Package Lists... Done
Building Dependency Tree... Done
Reading Package Lists... Done
Building Dependency Tree... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
  wireshark-doc: Conflicts: wireshark-base (> 2.6.6-alt2)
E: Broken packages
[root@prodesk0 ~]# rpm -U /ALT/Sisyphus/noarch/RPMS.classic/wireshark-doc-2.6.6-alt2.noarch.rpm /ALT/Sisyphus/x86_64/RPMS.classic/wireshark-base-2.6.6-alt2.x86_64.rpm 
error: Failed dependencies:
	wireshark-base > 2.6.6-alt2 conflicts with wireshark-doc-2.6.6-alt2.noarch

Вот проблема с новым форматом при обработке apt-ом (но не старым rpm-ом, конечно, потому что это мы уже всё тут описали):

[root@prodesk0 ~]# apt-repo add 222028
[root@prodesk0 ~]# apt-get update; apt-get install wireshark-{base,doc}
Get:1 http://git.altlinux.org repo/222028/x86_64 release [549B]
Get:2 http://git.altlinux.org repo/222028/x86_64-i586 release [532B]
Fetched 1081B in 0s (46,2kB/s)
Get:1 http://git.altlinux.org repo/222028/x86_64/task pkglist [40,5kB]
Get:2 http://git.altlinux.org repo/222028/x86_64/task release [138B]
Get:3 http://git.altlinux.org repo/222028/x86_64-i586/task pkglist [8260B]
Get:4 http://git.altlinux.org repo/222028/x86_64-i586/task release [143B]
Fetched 49,0kB in 0s (633kB/s)
Reading Package Lists... Done
Building Dependency Tree... Done
Reading Package Lists... Done
Building Dependency Tree... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
  wireshark-doc: Conflicts: wireshark-base (< 2.6.6-alt2:sisyphus+222028.200.2.1)
E: Broken packages
[root@prodesk0 ~]# rpm -U /home/user/MNT/team.alt/tasks/222028/build/200/x86_64/rpms/wireshark-doc-2.6.6-alt2.noarch.rpm  /home/user/MNT/team.alt/tasks/222028/build/200/x86_64/rpms/wireshark-base-2.6.6-alt2.x86_64.rpm 
[root@prodesk0 ~]# echo $?
0
[root@prodesk0 ~]# 

Интересно, а новый формат Conflicts будет ли нормально обрабатываться apt-ом (всё ещё старым), если в эту систему поставить новый rpm?.. Сейчас проверю.
Comment 17 Ivan Zakharyaschev 2019-02-19 17:33:59 MSK
То было с rpm-4.13.0.1-alt4. Теперь попробуем с новым rpm-4.13.0.1-alt6.

Conflicts старого формата:

[root@prodesk0 ~]# apt-repo
rpm [alt] file:/ALT Sisyphus/x86_64 classic
rpm [alt] file:/ALT Sisyphus/noarch classic
rpm [alt] file:/ALT Sisyphus/x86_64-i586 classic
[root@prodesk0 ~]# apt-get update; apt-get install wireshark-{base,doc}
Reading Package Lists... Done
Building Dependency Tree... Done
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
  wireshark-base wireshark-doc
0 upgraded, 2 newly installed, 0 removed and 1543 not upgraded.
Need to get 0B/15,6MB of archives.
After unpacking 92,2MB of additional disk space will be used.
=== apt-printchanges ===
==wireshark-doc wireshark-base==
* Sat Jan 19 2019 Anton Farygin <rider@altlinux.ru> 2.6.6-alt2
- libwiretap included to wireshark-base package
- libwiretap-devel included to wireshark-devel package
Committing changes...
Preparing...                                                                                                                                                      #################################################################################################### [100%]
Updating / installing...
1: wireshark-base-2.6.6-alt2                                                                                                                                      #################################################################################################### [ 50%]
2: wireshark-doc-2.6.6-alt2                                                                                                                                       #################################################################################################### [100%]
Done.
[root@prodesk0 ~]# rpm -e wireshark-{base,doc}
[root@prodesk0 ~]# 

Тестируем установку с Conflicts нового предлагаемого формата:

[root@prodesk0 ~]# apt-repo add 222028
[root@prodesk0 ~]# apt-get update; apt-get install wireshark-{base,doc}
Get:1 http://git.altlinux.org repo/222028/x86_64 release [549B]
Get:2 http://git.altlinux.org repo/222028/x86_64-i586 release [532B]
Fetched 1081B in 0s (26,8kB/s)
Get:1 http://git.altlinux.org repo/222028/x86_64/task pkglist [40,5kB]
Get:2 http://git.altlinux.org repo/222028/x86_64/task release [138B]
Get:3 http://git.altlinux.org repo/222028/x86_64-i586/task pkglist [8260B]
Get:4 http://git.altlinux.org repo/222028/x86_64-i586/task release [143B]
Fetched 49,0kB in 0s (776kB/s)
Reading Package Lists... Done
Building Dependency Tree... Done
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
  wireshark-base wireshark-doc
0 upgraded, 2 newly installed, 0 removed and 1546 not upgraded.
Need to get 15,6MB of archives.
After unpacking 92,2MB of additional disk space will be used.
Get:1 http://git.altlinux.org repo/222028/x86_64/task wireshark-doc 2.6.6-alt2 [37,8kB]
Get:2 http://git.altlinux.org repo/222028/x86_64/task wireshark-base 2.6.6-alt2 [15,6MB]
Fetched 15,6MB in 1s (7890kB/s)           
=== apt-printchanges ===
==wireshark-doc wireshark-base==
* Sat Jan 19 2019 Anton Farygin <rider@altlinux.ru> 2.6.6-alt2
- libwiretap included to wireshark-base package
- libwiretap-devel included to wireshark-devel package
Committing changes...
Preparing...                                                                                                                                                      #################################################################################################### [100%]
Updating / installing...
1: wireshark-base-2.6.6-alt2                                                                                                                                      #################################################################################################### [ 50%]
2: wireshark-doc-2.6.6-alt2                                                                                                                                       #################################################################################################### [100%]

тоже работает.

Интересно, почему со старым rpm через apt не работало.
Comment 18 Ivan Zakharyaschev 2019-02-19 20:24:31 MSK
В общем-то, я смотрел код apt некоторое время назад и подозреваю, чем это вызвано. (Отклонение от поведения собственно rpm.)

(In reply to comment #16)
> Такой формат (E:V-R:D) не помогает с проблемой со старым rpm без улучшения
> apt-а (ещё не готового).
> 
> Вот проблема со старым форматом конфликтов:

> The following packages have unmet dependencies:
>   wireshark-doc: Conflicts: wireshark-base (> 2.6.6-alt2)
> E: Broken packages
> [root@prodesk0 ~]# rpm -U
> /ALT/Sisyphus/noarch/RPMS.classic/wireshark-doc-2.6.6-alt2.noarch.rpm
> /ALT/Sisyphus/x86_64/RPMS.classic/wireshark-base-2.6.6-alt2.x86_64.rpm 
> error: Failed dependencies:
>     wireshark-base > 2.6.6-alt2 conflicts with wireshark-doc-2.6.6-alt2.noarch

Здесь всё так же, как в rpm: есть Provides вида wireshark-base = 2.6.6-alt2:DISTTAG и он при сравнении старым rpm по релизу больше.

> Вот проблема с новым форматом при обработке apt-ом (но не старым rpm-ом,
> конечно, потому что это мы уже всё тут описали):

> The following packages have unmet dependencies:
>   wireshark-doc: Conflicts: wireshark-base (<
> 2.6.6-alt2:sisyphus+222028.200.2.1)
> E: Broken packages

Здесь поведение расходится со старым rpm.

Подозревая, что он динамисеки конструирует соответствующие как-бы-Provides по N-E:V-R пакета и проверяет их. Т.к. про disttag старый apt не знает, он в эту строку ("VerStr") не добавляет disttag, и сравнивает её с требованием "< 2.6.6-alt2:sisyphus+222028.200.2.1". Старый rpm отвечает, что этот сконструированный VerStr действительно меньше, т.е. конфликтует.

> [root@prodesk0 ~]# rpm -U
> /home/user/MNT/team.alt/tasks/222028/build/200/x86_64/rpms/wireshark-doc-2.6.6-alt2.noarch.rpm
> 
> /home/user/MNT/team.alt/tasks/222028/build/200/x86_64/rpms/wireshark-base-2.6.6-alt2.x86_64.rpm 
> [root@prodesk0 ~]# echo $?
> 0
> [root@prodesk0 ~]# 
> 
> Интересно, а новый формат Conflicts будет ли нормально обрабатываться apt-ом
> (всё ещё старым), если в эту систему поставить новый rpm?.. Сейчас проверю.

С установкой нового rpm apt начинает прилично обрабатывать установку этого пакета, потому что строки, передаваемые для сравнения в rpm такие: одна не имеет disttag-а, а другая имеет. Но при сравнении "<" disttag для нового rpm, конечно, не имеет значения, поэтому это условие не выполнится.

Получается, большого смысла менять значение %EVR сейчас нет. Это поможет обработке старым rpm, но не старым apt. Но apt задним числом мы не можем обучить disttag-ам. Можно посоветовать обновлять сначала apt и кзью

Если хочется изготавливать пакеты, совместимые со старым rpm и apt, получается, единственный выход -- делать общий подпакет, от которого все подпакеты будут зависеть (потом эти зависимости могут спотимизироваться).
Comment 19 Repository Robot 2019-02-22 19:24:10 MSK
rpm-build-4.0.4-alt127 -> sisyphus:

Tue Feb 19 2019 Ivan Zakharyaschev <imz@altlinux> 4.0.4-alt127
- Make "new" packages (with disttags) be treated better
  by the "old" disttag-unaware rpm in some cases; primarily those with
  < and/or > Conflicts on another subpackage. This form of Conflicts
  is used to ensure that no subpackages from different releases/builds
  get installed together. (A better way to express this is to add a
  common subpackage that all other subpackages depend on.) This change
  doesn't affect the way the "new" rpm would treat packages with such
  deps (ALT#35930):
  + rewrite < and > dependencies so that they have almost the same meaning when
    treated by old disttag-unaware tools;
  + %EVR macro (for intersubpackage deps) upgraded to include %disttag
    (given the other change, this is only useful for making the rare
    Conflicts: subpkg = %EVR more compatible with disttag-unaware tools).
- checkinstall subpackage added.