Erich Schubert wonders how to improve the handling of conflicts in
package managers, particularly in aptitude full-upgrade and apt-get
dist-upgrade. From the point of view of the package manager,
conflicts are a bit tricky to deal with. The problem is that a
conflict only really tells you not to install two packages at once; it
doesn't tell you which package should end up on the system by default.

Worse, aptitude has two approaches to this:

When a package is marked for installation in the visual interface
or listed on the command-line, then if Aptitude::Auto-Install is
enabled, aptitude will automatically resolve conflicts in favor
of that package. The same applies to packages that are upgraded
by pressing U or by full-upgrade.

When aptitude's dependency resolver encounters a conflict, it
considers both resolutions to the conflict to be equally valid.
If there are no other reasons to choose one package over the
other, it will be unpredictable which one gets removed first, and
even when there are reasons to choose, the user may not understand
what they are.

I don't think it's possible to always make upgrades predictable. But
I think that even just making Auto-Install stick to installing
packages and not removing conflicts would be a plus. Installing
obvious dependencies up-front is good because it means less
work for the resolver and a more predictable starting point. Many
trivial dependency problems can even be completely solved this way.
But removing conflicts is a lot trickier and should probably kick the
problem into the full resolver.

Unfortunately, the code enabled by Auto-Install is all deep in the
guts of libapt. I've tried to avoid duplicating this code so far,
but it does seem like I periodically run into cases where it doesn't
do exactly what I need, so maybe I'll have to eventually.

You can reply to this blog post by emailing me at Daniel_Burrows@alumni.brown.edu.
If you would like me to attach your comments to this blog post, please
mention this in your email.