| Commit message (Collapse) | Author | Age | Files | Lines |
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
With an explicit {} initialization, g++ 14.2 on armhf and armel
seems to generate the default constructor for the vector too early,
or in the first place, outside of solver3.cc where the constructor
is defined.
Without {}, this compiles again.
In file included from /usr/include/c++/14/vector:66,
from /<<PKGBUILDDIR>>/obj-arm-linux-gnueabihf/include/apt-pkg/cachefilter.h:14:
/usr/include/c++/14/bits/stl_vector.h: In instantiation of ‘constexpr std::_Vector_base<_Tp, _Alloc>::~_Vector_base() [with _Tp = APT::Solver::Work; _Alloc = std::allocator<APT::Solver::Work>]’:
/usr/include/c++/14/bits/stl_vector.h:531:7: required from here
531 | vector() = default;
| ^~~~~~
/usr/include/c++/14/bits/stl_vector.h:369:49: error: invalid use of incomplete type ‘struct APT::Solver::Work’
369 | _M_impl._M_end_of_storage - _M_impl._M_start);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
In file included from /<<PKGBUILDDIR>>/apt-pkg/edsp.cc:22:
/<<PKGBUILDDIR>>/obj-arm-linux-gnueabihf/include/apt-pkg/solver3.h:87:11: note: forward declaration of ‘struct APT::Solver::Work’
87 | struct Work;
| ^~~~
/usr/include/c++/14/bits/stl_vector.h: In instantiation of ‘constexpr std::_Vector_base<_Tp, _Alloc>::~_Vector_base() [with _Tp = APT::Solver::Solved; _Alloc = std::allocator<APT::Solver::Solved>]’:
/usr/include/c++/14/bits/stl_vector.h:531:7: required from here
531 | vector() = default;
| ^~~~~~
/usr/include/c++/14/bits/stl_vector.h:369:49: error: invalid use of incomplete type ‘struct APT::Solver::Solved’
369 | _M_impl._M_end_of_storage - _M_impl._M_start);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
/<<PKGBUILDDIR>>/obj-arm-linux-gnueabihf/include/apt-pkg/solver3.h:88:11: note: forward declaration of ‘struct APT::Solver::Solved’
88 | struct Solved;
| ^~~~~~
|
| | |
|
| |
|
|
|
|
| |
This reverts commit 66ec0dfad8ac1d4d8646a4734eb9353f3ebc0a91.
This creates too much churn in the translation.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The cache allocates strings as
uint16_t size;
char content[];
char zero;
Aligned to the uint16_t. When doing the casting, this causes a
warning on some architectures that cannot do unaligned loads, such
as armhf.
Use __builtin_assume_aligned() to explictly say that the pointer
is aligned to 16 bits. This is a bit of a backhanded approach,
as the warning seems to be actually avoided by the function
returning a void* rather than the assumed alignment, but this
is very much self-documenting.
|
| |\
| |
| |
| |
| | |
solver3: various fixes
See merge request apt-team/apt!492
|
| | |
| |
| |
| |
| |
| | |
When inspecting Recommends of installed packages, filter
them to the installed packages only, as we want to avoid
switching between alternatives of recommended packages.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
On recent armfhf and s390x builds in the PPA, the compiler seems to have
generated the destructor at the wrong point where the definitions where
not yet complete, and it does seem ill-advised to rely on a
default-constructed destructor in the solver for future ABI sake.
In file included from /usr/include/c++/14/vector:66,
from /<<PKGBUILDDIR>>/obj-arm-linux-gnueabihf/include/apt-pkg/cachefilter.h:14:
/usr/include/c++/14/bits/stl_vector.h: In instantiation of ‘constexpr std::_Vector_base<_Tp, _Alloc>::~_Vector_base() [with _Tp = APT::Solver::Work; _Alloc = std::allocator<APT::Solver::Work>]’:
/usr/include/c++/14/bits/stl_vector.h:531:7: required from here
531 | vector() = default;
| ^~~~~~
/usr/include/c++/14/bits/stl_vector.h:369:49: error: invalid use of incomplete type ‘struct APT::Solver::Work’
369 | _M_impl._M_end_of_storage - _M_impl._M_start);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
In file included from /<<PKGBUILDDIR>>/apt-pkg/edsp.cc:22:
/<<PKGBUILDDIR>>/obj-arm-linux-gnueabihf/include/apt-pkg/solver3.h:87:11: note: forward declaration of ‘struct APT::Solver::Work’
87 | struct Work;
| ^~~~
/usr/include/c++/14/bits/stl_vector.h: In instantiation of ‘constexpr std::_Vector_base<_Tp, _Alloc>::~_Vector_base() [with _Tp = APT::Solver::Solved; _Alloc = std::allocator<APT::Solver::Solved>]’:
/usr/include/c++/14/bits/stl_vector.h:531:7: required from here
531 | vector() = default;
| ^~~~~~
/usr/include/c++/14/bits/stl_vector.h:369:49: error: invalid use of incomplete type ‘struct APT::Solver::Solved’
369 | _M_impl._M_end_of_storage - _M_impl._M_start);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
/<<PKGBUILDDIR>>/obj-arm-linux-gnueabihf/include/apt-pkg/solver3.h:88:11: note: forward declaration of ‘struct APT::Solver::Solved’
88 | struct Solved;
| ^~~~~~
|
| |/
|
|
|
|
|
|
|
|
|
|
| |
In case a new version of the source package is published, we
check that if there's a newer binary for the same architecture
and then consider the binary obsoleted.
This logic did not properly account for Architecture: all packages
which are considered as native architecture package with an "All"
multi-arch flag set, and hence a native architecture package may
inadvertently be considered obsoleted by a package that only built
on Architecture: all.
|
| |\
| |
| |
| |
| | |
doc: Increase visibility of special signs' usage
See merge request apt-team/apt!487
|
| |/
|
|
|
|
| |
Closes: #310975
Signed-off-by: Daniel Lublin <daniel@lublin.se>
|
| |\
| |
| |
| |
| | |
solver3: Only merge dependencies on the same package
See merge request apt-team/apt!486
|
| |/
|
|
|
| |
Avoid or groups and dependencies on different (virtual) packages,
to avoid some common pitfalls like the added xorg test case.
|
| |\
| |
| |
| |
| | |
solver3: Merge intersecting dependencies
See merge request apt-team/apt!485
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Merge any hard clauses into optional clauses, such that
optional clauses don't end up with more choices.
For example if you have
Depends: a | b
Recommends: a | c
This becomes:
Depends: a | b
Recommends: a
We have simulated this with the chaos-actor in the test case
and a
Depends: git (not satisfied by chaos provider)
Recommends: git (satisfied by chaos provider)
and the latter constraint is limited to the former.
|
| |/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
If a package declares multiple dependencies that can be solved by
the same packages we should use the common set of packages to
solve them.
A common example is requiring the same Debian source version, or the
same upstream version as in our test case:
git-ng Depends: git (>> 1:2.26.2), git (<< 1:2.26.2-.)
The solver expands this to the concrete objects:
git-ng Depends: "real git" (= 1:2.26.2-1) | chaos-actor, "real git" (= 1:2.26.2-1) | "real git" (= 1:2.25.1-1)
When given an upgrade request, the solver would now choose
chaos-actor to satisfy git (>> 1:2.26.2)
"real git" (= 1:2.25.1-1) to satisfy git (<< 1:2.26.2-.)
To satisfy the two constraints, which is not the intended outcome.
Address this problem by introducing a concept of merged clauses:
If two dependencies of a package have overlapping solutions, replace
the dependency by the intersection, and record the merged clause
instead, this leads to a single clause:
Depends: git (>> 1:2.26.2) and git (<< 1:2.26.2-.)
which expands to just the real git binary.
The implementation is a bit finicky in that it removes the variables
from the original clause which may not be helpful for debugging, but
it records the clauses merged with, as seen in the test case, so the
reasoning is clear.
LP: #2111792
|
| |\
| |
| |
| |
| | |
solver3: Remove Work::choice
See merge request apt-team/apt!484
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
If we have allowed the removal of manual packages, assume them
all before starting the solver. This should ensure that as long
as there is a solution that does not remove a manually installed
package, it is found.
This requires a sweeping set of changes in the test suite, but
ensures that we get "safe" behavior from the solver. We have
in particular seen that without asserting the installed packages,
several people ended up with ubuntu-minimal and perl removed in
a situation where that was not warranted, that is, they install
winehq, and then pull in some new perl packages in a newer version
than the installed one, and the solver chose to create a mismatched
version set, which then caused the main perl package to not be
installable.
Oops: 1b55173a-3526-11f0-b7ac-fa163e171f02
Oops: dbd5149e-36b9-11f0-bb74-fa163ec44ecd
|
| | |
| |
| |
| |
| |
| |
| |
| | |
If the user pushes Assumptions that fail, we could inadvertently
timeout during the Pop() as the variable was not initialized.
Always initialize it to 0, and if we haven't set an actual time
by the time we Pop() set it there.
|
| | |
| |
| |
| |
| |
| | |
This can be used to compare arbitrary packages in non-dependency
contexts. It remains to be seen whether this is a meaningful
approach.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| | |
We sometimes enqueue no choice as the choice, specifically when
an optional clause became unsat as we need to reenqueue it on
undo.
But of course, this breaks undoing stuff because now it tries to
insert !root and then solver breaks.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
If an Assume() failed, we will have pushed the choices stack,
but not actually pushed anything to the solved stack.
This would cause a segmentation fault trying to read the referenced
entry that doesn't actually exists, namely solved[solved.size()].
Handle this by exiting early as there's nothing to do except
pop the entry back out of the array.
|
| |/
|
|
|
|
|
|
|
|
|
|
| |
Instead of having the historic choice here, follow MiniSAT and
use the assigned variable from the tail. This should also make
the Assume() function work now, albeit we still need to actually
migrate to it.
This is a first step towards refactoring the Solve() loop to use
a propagate/find next literal/assume it kind of loop, albeit there
is a bit more to prepare there as we need to also reinsert work
items when backtracking.
|
| |\
| |
| |
| |
| | |
Bump CMAKE_CXX_STANDARD to 23 and fix code
See merge request apt-team/apt!482
|
| |/
|
|
|
|
|
|
| |
ftparchive/contents.h failed with operator< defined only,
so define operator<=> instead.
The operator and FileCopyType constructor both had a warning
about not throwing and adding a noexcept, so add one
|
| | |
|
| |\
| |
| |
| |
| | |
Various cherry-picks
See merge request apt-team/apt!480
|
| | |
| |
| |
| |
| |
| | |
If there is an error writing to cout, cerr, or clog, APT should return a
non-zero exit code. This allows automated tools to reliably check for
warnings.
|
| | |
| |
| |
| |
| |
| | |
Update our vendor config to enable the 3.0 solver by default,
using the legacy compat mode for apt-get, where it is allowed
to remove manually installed packages.
|
| |/
|
|
|
|
|
|
|
|
|
| |
GCC defaults to C++17 currently, but our library users could be on other
(newer/older) standard still e.g. by explicit request, so to avoid
accidentally breaking them the pkg-config-test is adapted to include
all of our public headers as a smoke test for if you can build an
application against our library in a certain C++ standard.
The test script is also adapted to be runnable outside of autopkgtest
like in our CI or manually.
|
| |\
| |
| |
| |
| | |
💬 Recommend people use `apt update` over `apt-get update`
See merge request apt-team/apt!80
|
| |/ |
|
| | |
|
| |\
| |
| |
| |
| | |
sources.list(5): Explicitly say what the precedence order is
See merge request apt-team/apt!417
|
| |/
|
|
|
|
|
|
|
|
|
| |
The order of apt sources can matter, but this man page did not
previously define whether /etc/apt/sources.list was parsed before or
after the fragment files in sources.list.d. Giving a concrete example
also provides a hint that numeric prefixes are a useful way to force a
particular sort order, and clarifies that the .list or .sources extension
is less important than lexicographic order.
Signed-off-by: Simon McVittie <smcv@debian.org>
|
| |\
| |
| |
| |
| | |
apt_preferences(5): Specify the order in which files are parsed
See merge request apt-team/apt!416
|
| |/
|
|
|
|
|
|
|
|
|
| |
The order of preference stanzas matters, but this man page did not
previously define whether /etc/apt/preferences was parsed before or
after the fragment files in preferences.d. Giving a concrete example
also provides a hint that numeric prefixes are a useful way to force a
particular sort order, and clarifies that the presence or absence of
the .pref extension is less important than lexicographic order.
Signed-off-by: Simon McVittie <smcv@debian.org>
|
| |\
| |
| |
| |
| | |
Cleanup dselect method
See merge request apt-team/apt!423
|
| | |
| |
| |
| |
| |
| | |
The information in the header was probably mostly useful to the author,
but even then, it seems it has long past its usefulness once it got
integrated into apt proper.
|
| | | |
|
| | | |
|
| | |
| |
| |
| |
| |
| | |
Move the warnings from the shebang into a proper pragma, so that we are
sure it will be enabled regardless of the script being called explicitly
without the flag.
|
| | | |
|
| | |
| |
| |
| |
| |
| | |
The dpkg --update-avail command has supported reading from stdin since
dpkg 1.17.7. This removes a temporary file which can be very big
nowadays.
|
| |/
|
|
| |
Recognize the method and update the documentation and prompts.
|
| |\
| |
| |
| |
| | |
Fix error handling with getline
See merge request apt-team/apt!265
|
| |/
|
|
|
|
|
|
|
|
|
|
|
|
| |
The function getline is used to read data from different streams, however,
the error handling is not accurate.
From the man page, getline returns -1 on failure and sets errno accordingly,
but the current implementation only checks errno to see if there was a
failure. With this approach, in case getline returns success but also sets
errno it is consider and error.
Fix the issue but also checking the return value of getline.
Signed-off-by: Walter Lozano <walter.lozano@collabora.com>
|
| |\
| |
| |
| |
| | |
Introduce apt why, apt why-not
See merge request apt-team/apt!479
|
| |/
|
|
|
|
|
|
|
|
|
| |
These are implemented somewhat differently from aptitudes
why and why-not commands: They produce the actual solver
trace for why a particular decision has been taken.
For the why-not case, we need to explicitly discover our
specified package, as if nothing else depends on it in
our graph, it would otherwise always be undiscovered and
conflicts not detected (see e.g. level-3 in the test).
|
| |\
| |
| |
| |
| | |
apt-pkg: fixed type comparison in 64bit systems using memsize cast
See merge request apt-team/apt!477
|