<feed xmlns='http://www.w3.org/2005/Atom'>
<title>apt/test/integration/test-bug-618848-always-respect-user-requests, branch main</title>
<subtitle>Debians commandline package manager</subtitle>
<id>https://git.kalnischkies.de/apt/atom?h=main</id>
<link rel='self' href='https://git.kalnischkies.de/apt/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/'/>
<updated>2026-01-05T21:20:24Z</updated>
<entry>
<title>solver3: Rename decision to assignment</title>
<updated>2026-01-05T21:20:24Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>jak@debian.org</email>
</author>
<published>2025-12-28T15:56:28Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=21d099878ed8c34f3b13747bcec380e0402e57a3'/>
<id>urn:sha1:21d099878ed8c34f3b13747bcec380e0402e57a3</id>
<content type='text'>
The previous use of decision here conflicted with the use
of decision level and the general notion of having made a
decision, because the assignment might have been propagated
as a matter of fact.
</content>
</entry>
<entry>
<title>solver3: Allow removing manually installed packages</title>
<updated>2025-10-25T20:16:54Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>jak@debian.org</email>
</author>
<published>2025-10-25T19:31:34Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=a3fca052ca21ad222ac7f2fdd7f3fe84b44beb60'/>
<id>urn:sha1:a3fca052ca21ad222ac7f2fdd7f3fe84b44beb60</id>
<content type='text'>
</content>
</entry>
<entry>
<title>solver3: Verbose error messages</title>
<updated>2025-03-08T22:18:05Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2025-03-06T19:07:30Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=3967b75ae4a10d0d79560dfecb8eb210aad4f4f2'/>
<id>urn:sha1:3967b75ae4a10d0d79560dfecb8eb210aad4f4f2</id>
<content type='text'>
Introduce a new function, LongWhyStr() that returns a longer
reason for why something is being installed (or not).

This does the same path walk as the other function does, but
it renders the clauses at each level, and one per line, so
the whole output is a lot more informative.

It is a separate function to keep the existing debug messages
use the simple single line implication graph

We remove the other special case in AddWork() for empty solutions
to mke use of the general case in Solve() instead, and then adapt
the case in Solve() to the same case as in Enqueue(). This also
happens to fix the bug that when we encountered an empty clause
we just printed the clause had no solution, but not how we got
to install the package with the clause.

Adapt the test suite for the changes which is an annoying amount
of paperwork.
</content>
</entry>
<entry>
<title>solver3: Reject reverse dependencies natively</title>
<updated>2025-02-14T18:04:56Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2025-02-05T20:31:53Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=b8918cb89ada945d92c720446177f1ef5185b5a5'/>
<id>urn:sha1:b8918cb89ada945d92c720446177f1ef5185b5a5</id>
<content type='text'>
Instead of utilizing the reverse depends functionality of the cache
and marking all possible reverse dependencies for removal, mark them
ourselves by keeping track of reverse-implication-clauses.

Notably, this improves the reverse dependency rejection substantially:
The previous RejectReverseDependencies() function did not handle
Provides.

For this to work correctly right now, we need to discover optional
clauses too when queuing them. This is somewhat suboptimal as we
technically we don't care if they become unsat, we just waste time
tracking them.

The tests get a bit awkward, but oh well, we use what we can
use.
</content>
</entry>
<entry>
<title>solver3: Defer version selection where possible</title>
<updated>2025-02-14T18:04:56Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2025-02-05T19:11:35Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=f870bd44522d195199987b0e073d495eed060495'/>
<id>urn:sha1:f870bd44522d195199987b0e073d495eed060495</id>
<content type='text'>
If a dependency can be satisfied by all versions of a package,
add the package to the clause instead of the version object.

This works only if there are no providers for the package: Providers
are quite hard to enumerate over and make sure that all versions of
a package satisfy the provider dependency.

Implement arbitrary selection between packages and versions for
the CompareProviders class: We pick the best version for each package
and then pit them against each other.
</content>
</entry>
<entry>
<title>solver3: Use a propagation queue</title>
<updated>2025-01-30T13:50:15Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2024-11-02T12:55:39Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=3523efb15d48ce3c6f9212f50dfc892497ba9dcb'/>
<id>urn:sha1:3523efb15d48ce3c6f9212f50dfc892497ba9dcb</id>
<content type='text'>
Instead of directly propagating in a recursive fashion,
queue propagations in a queue and work on them in a loop
per the miniSAT paper.

We call Propagate() only at the end of the FromDepCache()
function and then in the Solve loop. Delaying the initial
propagation means that we get a stronger reasoning:

Assume you have x-&gt;a-&gt;b-&gt;c, y-&gt;c and you install x,y:
- Previously we traversed: x, y, x-&gt;a, a-&gt;b, b-&gt;c, (y-&gt;c)
- but now we traverse:     x, y, x-&gt;a, y-&gt;c, a-&gt;b, (b-&gt;c)
Notably c now has the implication y-&gt;c instead of x-&gt;a-&gt;b-&gt;c.

Inside the solver we need to call Propagate in a loop:
Propagating facts can fail and we then backtrack. If backtracking
is succesful, we have gained a new fact to propagate.
</content>
</entry>
<entry>
<title>test: Support the 3.0 solver in most existing test cases</title>
<updated>2024-05-24T15:01:35Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2024-05-19T18:04:47Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=b5997949909ee9d5e9981c8311aea97c7b2620fd'/>
<id>urn:sha1:b5997949909ee9d5e9981c8311aea97c7b2620fd</id>
<content type='text'>
Highlights:

- test-bug-618848-always-respect-user-requests: (Do not) Support 3.0 solver

  A manually installed package is never removed just because we request
  the removal of its dependency in solver3.

- test-bug-657695-resolver-breaks-on-virtuals: Support 3.0 solver

  For manually installed packages, solver 3.0 would require some
  new xserver-xorg-video-driver to Conflict+Replace+Provides the
  old one (once the logic is implemented), but that does seem
  reasonable.

- test-bug-720597-build-dep-purge: Support 3.0 solver

  This needs a simple aptmark auto because pkga is removed by the
  build-dep. But further adjustments are necessary because it weirdly
  tested for no autoremovable packages before installing pkgc.

- test-bug-960705-*: Support 3.0 solver

  Bit awkward to deal with; notably the protect to conflict doesn't
  actually work anymore and that is a feature these days.
</content>
</entry>
<entry>
<title>Fix the test suite by adding new "m" flags to debug output</title>
<updated>2023-11-22T15:33:45Z</updated>
<author>
<name>Julian Andres Klode</name>
<email>julian.klode@canonical.com</email>
</author>
<published>2023-11-22T15:22:07Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=b0e336787be8a73280cf4cf037295c6347bcbd83'/>
<id>urn:sha1:b0e336787be8a73280cf4cf037295c6347bcbd83</id>
<content type='text'>
In "Restore ?garbage by calling MarkAndSweep before parsing" I
made install code run MarkAndSweep before parsing arguments such
that the "?garbage" pattern works correctly.

This caused test suite breakage because packages now ended up
with marked flags in the debug output. Hence add "m" to the output
we assert where necessary.

In a nicer world we might want to just do MarkAndSweep if we actually
have a ?garbage pattern to evaluate but that is a bit unpredictable
in terms of performance expectations and because a "read-only" construct
modifies the depcache, so let's go with the more expected option for now

Regression-of: b6f362e8013b03efce54e7381e0e22fac1fa1539
</content>
</entry>
<entry>
<title>Call MarkAndSweep only manually in apt-get for autoremove</title>
<updated>2021-04-26T11:00:24Z</updated>
<author>
<name>David Kalnischkies</name>
<email>david@kalnischkies.de</email>
</author>
<published>2021-03-18T16:37:49Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=d6f3458badf2cfea3ca7de7632ae31daff5742be'/>
<id>urn:sha1:d6f3458badf2cfea3ca7de7632ae31daff5742be</id>
<content type='text'>
An interactive tool like aptitude needs these flags current far more
often than we do as a user can see them in apt only in one very well
defined place – the autoremove display block – so we don't need to run
it up to four times while a normal "apt install" is processed as that is
just busywork.

The effect on runtime is minimal, as a single run doesn't take too long
anyhow, but it cuts down tremendously on debug output at the expense of
requiring some manual handholding.

This is opt-in so that aptitude doesn't need to change nor do we need to
change our own tools like "apt list" where it is working correctly as
intended.

A special flag and co is needed as we want to prevent the ActionGroup
inside pkgDepCache::Init to be inhibited already so we need to insert
ourselves while the DepCache is still in the process of being built.
This is also the reason why the debug output in some tests changed to
all unmarked, but that is fine as the marking could have been already
obsoleted by the actions taken, just inhibited by a proper action group.
</content>
</entry>
<entry>
<title>Reexplore providers of marked packages if some didn't satisfy before</title>
<updated>2021-04-26T11:00:24Z</updated>
<author>
<name>David Kalnischkies</name>
<email>david@kalnischkies.de</email>
</author>
<published>2021-03-18T13:40:31Z</published>
<link rel='alternate' type='text/html' href='https://git.kalnischkies.de/apt/commit/?id=9a54e70c1040379fb06827bacb461c61e341e694'/>
<id>urn:sha1:9a54e70c1040379fb06827bacb461c61e341e694</id>
<content type='text'>
The autoremove algorithm would mark a package previously after exploring
it once, but it could have been that it ignored some providers due to
them not satisfying the (versioned) dependency. A later dependency which
they might satisfy would encounter the package as already marked and
hence doesn't explore the providers anymore leaving us with internal
errors (as in the contrived new testcase).

This is resolved by introducing a new flag denoting if we explored every
provider already and only skip exploring if that is true, which sounds
bad but is really not such a common occurrence that it seems noticeable
in practice. It also helps us marking virtual packages as explored now
which would previously be tried each time they are encountered mostly
hiding this problem for the (far more common) fully virtual package.
</content>
</entry>
</feed>
