[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#859900: apt: fails to install parl-desktop-world with --install-recommends



On Sun, Apr 09, 2017 at 01:51:45AM +0200, Andreas Beckmann wrote:
> The relevant bits of the dependency chain seem to be:
> 
> Package: parl-desktop-world
> Depends: icedove-l10n-cs, myspell-cs
> 
> Package: icedove-l10n-cs
> Depends: thunderbird-l10n-cs
> 
> Package: thunderbird-l10n-cs
> Recommends: hunspell-cs | myspell-cs-cz
> 
> Package: hunspell-cs
> Conflicts: myspell-cs
> 
> Package: myspell-cs
> Replaces: myspell-cs-cz
> Provides: myspell-cs-cz
> Conflicts: myspell-cs-cz

For a human that seems sensible, but if you know that apt is recursively
operating on the dependencies and/or looking at the "right" debug option
[0] you will notice that this is actually about thunderbird-l10n-cs
being found first where apt picks hunspell-cs because the first
alternative is to be preferred and at a later point stumbles over
firefox-esr-l10n-cs which recommends myspell-cs-cz (only), so ideally it
would reconsider its earlier choices at this point…

It is well-known that APT (and any greedy algorithm really) has its
problems if it must undo a decision it had formed before. APT has
various heuristics trying to allow such undos anyhow, but those fail
here as myspell-cs is considered the less favorable option…

Obviously, we could add another heuristic here making it work somehow
– that tends to add non-trivial amount of code with non-zero regression
potential (and I don't have a real idea how that heuristic would look
like).

The "simple" workaround for this specific instance is to reorder the
dependencies of parl-desktop-world as in having myspell-cs first, that
way the choice is already made at the time thunderbird-l10n-cs joins the
party and hunspell-cs is never considered.


Now, the "obvious" idea would be to have apt look at all dependencies at
once which would work in this instance – but just by "accident". If
parl-desktop-world wouldn't have a myspell-cs dependency at all we would
still have this conflict occur in distinct subtrees [1]. So the "real"
solution would include collecting in the entire tree all dependencies
which have only one solution, install all of them and so avoiding to
take decisions as long as we can. Problem here is: It is not trivial to
find how many solutions a dependencies has due to e.g. Provides and
Multi-Arch: foreign so you are quickly wasting a lot of time (ignoring
all the problems you have while collection the dependencies). From that
short paragraph alone you can guess that this is non-trivial aka not for
stretch. It is in fact basically a new resolver which we get ever so
slightly closer to cleanly switch between different ones as a first
step, but there is still quite a bit of road ahead.


Best regards

David Kalnischkies

[0] -o Debug::pkgDepCache::AutoInstall=1 -o Debug::pkgDepCache::Marker=1
[1] apt would not fail, but it still picks the hunspell-cs solution
which isn't ideal as it causes broken recommends.

Attachment: signature.asc
Description: PGP signature


Reply to: