<feed xmlns='http://www.w3.org/2005/Atom'>
<title>apt/apt-pkg/solver3.cc, branch 2.9.5</title>
<subtitle>Debians commandline package manager</subtitle>
<id>https://git.kalnischkies.de/apt/atom?h=2.9.5</id>
<link rel='self' href='https://git.kalnischkies.de/apt/atom?h=2.9.5'/>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/'/>
<updated>2024-06-13T13:10:06Z</updated>
<entry>
<title>solver3: Order obsolete choices last</title>
<updated>2024-06-13T13:10:06Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2024-06-06T09:19:04Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=6708203296911800caf94bb94ce204d3a39af0bd'/>
<id>urn:sha1:6708203296911800caf94bb94ce204d3a39af0bd</id>
<content type='text'>
This has two aspects:

1. For a dependency A | B | C we order the obsolete packages last,
   that is, if A is obsolete, this gets reordered to B | C | A,
   such that we try to pick non-obsolete packages first to ease
   upgrade calculation.

2. When comparing two dependencies, we order dependencies into three
   groups: First we satisfy dependencies mentioning only non-installed
   (NEW) packages, then we satisfy "normal" dependencies, and finally
   we satisfy any dependencies mentioning obsolete packages.

   This means for example if you have obsolete libfoo1 and a new
   libfoo1t64, that we will see Depends: libfoo1t64 before any
   Depends: libfoo1 (which may expand to libfoo1 | libfoo1t64),
   so we effectively will have selected "replacement" packages
   this way already before getting to older packages where we
   would have to choose between the obsolete package and its
   replacement.
</content>
</entry>
<entry>
<title>solver3: Remove no longer necessary comparisons</title>
<updated>2024-06-13T13:10:06Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2024-06-06T09:17:09Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=3b5379e547dfb655d764f7eb1ac7eaa5b2d34d6d'/>
<id>urn:sha1:3b5379e547dfb655d764f7eb1ac7eaa5b2d34d6d</id>
<content type='text'>
Comparing the size of work items is not strictly needed; we check
if items have a single or no solution and propagate them early on,
but it doesn't matter much if we solve A|B or C|D|E first. This
will allow us to get rid of all the resizing business later on,
and switch to using literal watching where we only watch one of
the literals on the right hand side.

Likewise, the upgrade case mattered initially in testing, but seems
to have resolved itself.
</content>
</entry>
<entry>
<title>solver3: Group work items</title>
<updated>2024-06-13T13:10:06Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2024-05-25T07:45:39Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=102017ecaa01a733a0860a62edae60cb0ab0220e'/>
<id>urn:sha1:102017ecaa01a733a0860a62edae60cb0ab0220e</id>
<content type='text'>
Our backtracking is chronological, so we will first
try alternative choices or skip optional items in
later groups.

So installing manually installed packages before automatically
installed ones allows manually installed packages to remove
automatically installed packages easily. If we did automatic
packages first, we'd keep back upgrades for manual packages
or change choices for their dependencies, or would have to
backtrack harder to get back to the right decision level.
That's silly.

Ordering automatically installed packages last also allows
us to calculate autoremovable packages. Since we will have
installed all dependencies from manually installed packages
by the point where we get to automatically installed packages,
everything that will be installed in those Auto groups is
inherently garbage.
</content>
</entry>
<entry>
<title>solver3: Do not dump sizes that are clearly pointers</title>
<updated>2024-06-13T12:32:32Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2024-05-25T11:46:52Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=5502c0bc5754499e82a1e03ca5a24779adb6f485'/>
<id>urn:sha1:5502c0bc5754499e82a1e03ca5a24779adb6f485</id>
<content type='text'>
We use a union here, but we don't know if we last stored a pointer,
so let's just reject clearly non-sizes. Generally this will work fine
-- you will not have enough choices in a dependency that you can
construct a valid pointer to a Version*, especially given that
any Version * &gt; sizeof(pkgCache::Header) already, given it is
in the cache.
</content>
</entry>
<entry>
<title>solver3: Fix translations of removals for marked install</title>
<updated>2024-05-24T15:01:55Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2024-05-23T11:24:25Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=4a2b89be6fa73b9c193d5b70e11a9305272efc3e'/>
<id>urn:sha1:4a2b89be6fa73b9c193d5b70e11a9305272efc3e</id>
<content type='text'>
We also need to issue a MarkDelete() if the package is marked for
installation currently but should not be, not only if it did not
have a previous version.

This fixes the final test in test-multiarch-barbarian, the others
only needed adjustments to mark all packages as automatic.
</content>
</entry>
<entry>
<title>solver3: Actually restore unsolved items rather than solved ones</title>
<updated>2024-05-24T15:01:55Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2024-05-21T14:57:56Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=aaa9e415ce48964726401462767d6038da6d82e7'/>
<id>urn:sha1:aaa9e415ce48964726401462767d6038da6d82e7</id>
<content type='text'>
When restoring previously solved items, we try to restore items
that have become unsolved again by skipping items that have a
solved solution.

Well at least we thought we did, but we accidentally had a "not"
in there that inverted the meaning, hence we lost work items on
backtracking.

This mostly did not seem to have caused any issues, I stumbled
over it while trying to add `autoremove` listings to `upgrade`,
but fixing it also fixes:

    test-ubuntu-bug-1130419-prefer-installed-ma-same-siblings

This used to say "E: Broken packages", meaning the solver lost
a non-optional install request and the 2nd stage solver caught
an incomplete solution.

Also test-bug-735967-lib32-to-i386-unavailable restores the legacy
solver behavior, so win win?
</content>
</entry>
<entry>
<title>solver3: Use stable sort</title>
<updated>2024-05-24T15:01:55Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2024-05-21T11:19:41Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=808f51e800a9d6a834723fe1d1fdff98ee14d7b5'/>
<id>urn:sha1:808f51e800a9d6a834723fe1d1fdff98ee14d7b5</id>
<content type='text'>
While it seems that libstdc++ is using stable_sort for sort,
we should make this explicit: We don't want items in our queues
to move ahead of earlier items of the same priority.

i.e. consider dependencies, they are grouped by package, we don't
want the sort algorithm to move B=2 ahead if A|B (which expands to
A=2|A=1|B=2|B=1).
</content>
</entry>
<entry>
<title>solver3: Solve optional dependencies before optional packages</title>
<updated>2024-05-24T15:01:55Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2024-05-20T12:59:58Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=cd245a57f273d3c069543c19d6ac31c84879ce7b'/>
<id>urn:sha1:cd245a57f273d3c069543c19d6ac31c84879ce7b</id>
<content type='text'>
This somewhat improves reliability of not breaking Recommends, e.g.
if the Recommends gets tightened. One test case enabled by this now
is the test-resolver-provider-exchange, which with a simple change
to allow removal of automatically installed packages works now.
</content>
</entry>
<entry>
<title>solver3: Promote satisfied Suggests to Recommends</title>
<updated>2024-05-24T15:01:55Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2024-05-19T19:24:08Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=0fa3b176652ff10276569a478c910ca866a4da5d'/>
<id>urn:sha1:0fa3b176652ff10276569a478c910ca866a4da5d</id>
<content type='text'>
As per the test-suggests-promoted-to-recommends test. This is still
a bit messy as we ignore alternative choices and only check the last
one, but um seems useful?
</content>
</entry>
<entry>
<title>solver3: Try candidate before installed version on upgrade</title>
<updated>2024-05-24T15:01:55Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2024-05-19T15:42:34Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=acb77872861834d3c5b98ca2e81e0336a388e9f0'/>
<id>urn:sha1:acb77872861834d3c5b98ca2e81e0336a388e9f0</id>
<content type='text'>
This fixes --no-strict-pinning attempting to upgrade all the versions
on the system. Adjust the upgrade test case accordingly:

1) no-strict-pinning pulls in systemd despite it being pinned down due
   to a dependenc (this was true before this fix)
2) no-strict-pinning does not pull in the upgrade-simple because nothing
   depends on it (this is what the test fixes)
</content>
</entry>
</feed>
