I wanted to update my gentoo box once again. I did last update probably ~6 months ago. This usually means for me that I get a ton of conflicts:
These are the packages that would be merged, in order: Calculating dependencies... done! [ebuild U ~] dev-qt/qtcore-5.12.2 [5.11.1-r1] !!! Multiple package instances within a single package slot have been pulled !!! into the dependency graph, resulting in a slot conflict: dev-qt/qtcore:5 (dev-qt/qtcore-5.12.2:5/5.12::gentoo, ebuild scheduled for merge) pulled in by dev-qt/qtcore (Argument) (dev-qt/qtcore-5.11.1-r1:5/5.11::gentoo, installed) pulled in by ~dev-qt/qtcore-5.11.1 required by (dev-qt/qtdbus-5.11.1:5/5.11::gentoo, installed) ^ ^^^^^^ (and 9 more with the same problem)
I was really hoping that portage would be so smart that would it update whole qt stack in one transaction. Sadly, it did not and I realized that I had to tell it. But how?
The easiest solution I came up with was using
equery: get installed packages
from dev-qt category:
$ equery l dev-qt/* -F '$category/$name' dev-qt/linguist-tools dev-qt/qtchooser dev-qt/qtconcurrent dev-qt/qtcore dev-qt/qtdbus dev-qt/qtgui dev-qt/qtnetwork dev-qt/qtsql dev-qt/qtsvg dev-qt/qtwidgets dev-qt/qtx11extras dev-qt/qtxml
And now we just feed this output to emerge:
$ emerge --ask -1 --verbose-conflicts $(equery l dev-qt/* -F '$category/$name') 1 ↵ These are the packages that would be merged, in order: Calculating dependencies... done! [ebuild R ] dev-qt/qtchooser-0_p20170803 [ebuild U ] dev-qt/qtcore-5.11.3-r2 [5.11.1-r1] [ebuild U ] dev-qt/qtxml-5.11.3 [5.11.1] [ebuild U ] dev-qt/qtconcurrent-5.11.3 [5.11.1] [ebuild U ] dev-qt/qtdbus-5.11.3 [5.11.1] [ebuild U ] dev-qt/qtnetwork-5.11.3 [5.11.1] [ebuild U ] dev-qt/qtsql-5.11.3 [5.11.1-r1] [ebuild U ] dev-qt/linguist-tools-5.11.3 [5.11.1] [ebuild U ] dev-qt/qtgui-5.11.3 [5.11.1] [ebuild U ] dev-qt/qtwidgets-5.11.3 [5.11.1] [ebuild U ] dev-qt/qtx11extras-5.11.3 [5.11.1] [ebuild U ] dev-qt/qtsvg-5.11.3 [5.11.1] Would you like to merge these packages? [Yes/No] Y
I wish emerge was smarter in this use case, but on the other hand, the solution is also not that hard.