diff options
| author | Julian Andres Klode <jak@debian.org> | 2025-03-20 14:51:10 +0000 |
|---|---|---|
| committer | Julian Andres Klode <jak@debian.org> | 2025-03-20 14:51:10 +0000 |
| commit | fff3dddedba0d19d722cb4889bab355182cc2522 (patch) | |
| tree | 08029e37929cce1abb919628308c1ec88564a44e | |
| parent | 7ef14b64596bd0ca78feaea5fda22b8d524de286 (diff) | |
| parent | 61b3b1840568b223baad08da1eb9a1fb5d6e7f91 (diff) | |
Merge branch 'solver3' into 'main'
Various solver bug fixes
See merge request apt-team/apt!466
| -rw-r--r-- | apt-pkg/solver3.cc | 7 | ||||
| -rw-r--r-- | apt-private/private-install.cc | 28 | ||||
| -rwxr-xr-x | test/integration/test-solver3-evaluation | 97 |
3 files changed, 27 insertions, 105 deletions
diff --git a/apt-pkg/solver3.cc b/apt-pkg/solver3.cc index 4030b9de1..4d988b523 100644 --- a/apt-pkg/solver3.cc +++ b/apt-pkg/solver3.cc @@ -1099,6 +1099,11 @@ bool APT::Solver::FromDepCache(pkgDepCache &depcache) } } + // Clause discovery depends on the manual flag, so we need to set the manual flag first before we discover any packages + for (auto P = cache.PkgBegin(); not P.end(); P++) + if (P->CurrentVer && not(depcache[P].Flags & pkgCache::Flag::Auto) && (depcache[P].Keep() || depcache[P].Install())) + (*this)[P].flags.manual = true; + for (auto P = cache.PkgBegin(); not P.end(); P++) { if (P->VersionList == nullptr) @@ -1142,8 +1147,6 @@ bool APT::Solver::FromDepCache(pkgDepCache &depcache) if (unlikely(debug >= 1)) std::cerr << "Install " << P.FullName() << " (" << (isEssential ? "E" : "") << (isAuto ? "M" : "") << (Root ? "R" : "") << ")" << "\n"; - - (*this)[P].flags.manual = not isAuto; if (not isOptional) { // Pre-empt the non-optional requests, as we don't want to queue them, we can just "unit propagate" here. diff --git a/apt-private/private-install.cc b/apt-private/private-install.cc index e3d176ffe..f1211d25e 100644 --- a/apt-private/private-install.cc +++ b/apt-private/private-install.cc @@ -89,7 +89,7 @@ bool CheckNothingBroken(CacheFile &Cache) // --------------------------------------------------------------------- static void WriteApportReport(pkgCacheFile &Cache, std::string &title, std::vector<std::string> const &errors, int mode, bool distUpgrade) { - auto dumpfile = flCombine(_config->FindDir("Dir::Log"), "edsp.log"); + auto dumpfile = flCombine(_config->FindDir("Dir::Log"), "edsp.log.zst"); auto crashfile = flCombine(_config->FindDir("Dir::Apport", "/var/crash"), "apt-edsp." + std::to_string(getuid()) + ".crash"); auto apt = Cache->FindPkg("apt"); if (access(flNotFile(dumpfile).c_str(), W_OK) != 0 || access(flNotFile(crashfile).c_str(), W_OK) != 0) @@ -97,7 +97,8 @@ static void WriteApportReport(pkgCacheFile &Cache, std::string &title, std::vect OpTextProgress Progress(*_config); Progress.OverallProgress(0, 100, 50, _("Writing error report")); FileFd edspDump(dumpfile, - FileFd::Exclusive | FileFd::Create | FileFd::WriteOnly | FileFd::BufferedWrite); + FileFd::Exclusive | FileFd::Create | FileFd::WriteOnly | FileFd::BufferedWrite, + FileFd::Extension); int edspFlags = 0; if (mode || distUpgrade) edspFlags |= EDSP::Request::UPGRADE_ALL; @@ -123,14 +124,25 @@ static void WriteApportReport(pkgCacheFile &Cache, std::string &title, std::vect << "Title: " << title << "\n" << "SourcePackage: apt\n"; - crash << "ErrorMessage:\n"; - for (auto &error : errors) - crash << " " << error << "\n"; + if (not errors.empty()) + { + crash << "ErrorMessage:\n"; + for (auto &error : errors) + crash << " " << error << "\n"; + } - crash << "AptSolverDump:\n"; std::ifstream toCopy(edspDump.Name()); - for (std::string line; std::getline(toCopy, line);) - crash << " " << line << "\n"; + std::ostringstream readStream; + readStream << toCopy.rdbuf(); + const auto base64 = Base64Encode(readStream.str()); + if (not base64.empty()) + { + crash << "AptSolverDump:\n"; + // Print the base64, with line wrapping, indented by one space; substr(i, 76) + // returns at most 76 characters or as many as are left. + for (size_t i=0; i < base64.size(); i += 76) + crash << " " << std::string_view{base64}.substr(i, 76) << "\n"; + } crash.close(); } diff --git a/test/integration/test-solver3-evaluation b/test/integration/test-solver3-evaluation index a873d5b21..c01ec9608 100755 --- a/test/integration/test-solver3-evaluation +++ b/test/integration/test-solver3-evaluation @@ -30,101 +30,8 @@ Date: Sun Mar 9 00:08:41 2025 Package: apt Title: Failure: The 3.0 solver produced a worse result SourcePackage: apt -ErrorMessage: AptSolverDump: - Request: EDSP 0.5 - Architecture: amd64 - Architectures: amd64 - Machine-ID: 912e43bd1c1d4ba481f9f8ccab25f9ee - Install: x:amd64 y:amd64 - Solver: internal - - Package: a - Architecture: all - Version: 3 - APT-ID: 2 - Source: a - Source-Version: 3 - Priority: optional - Section: other - Size: 42 - APT-Release: - a=unstable,n=sid,c=main,b=all - APT-Pin: 500 - APT-Candidate: yes - Depends: c - - Package: b - Architecture: all - Version: 3 - APT-ID: 3 - Source: b - Source-Version: 3 - Priority: optional - Section: other - Size: 42 - APT-Release: - a=unstable,n=sid,c=main,b=all - APT-Pin: 500 - APT-Candidate: yes - - Package: c - Architecture: all - Version: 3 - APT-ID: 4 - Source: c - Source-Version: 3 - Priority: optional - Section: other - Size: 42 - APT-Release: - a=unstable,n=sid,c=main,b=all - APT-Pin: 500 - APT-Candidate: yes - - Package: x - Architecture: all - Version: 3 - APT-ID: 0 - Source: x - Source-Version: 3 - Priority: optional - Section: other - Size: 42 - APT-Release: - a=unstable,n=sid,c=main,b=all - APT-Pin: 500 - APT-Candidate: yes - Depends: a | b - - Package: y - Architecture: all - Version: 3 - APT-ID: 1 - Source: y - Source-Version: 3 - Priority: optional - Section: other - Size: 42 - APT-Release: - a=unstable,n=sid,c=main,b=all - APT-Pin: 500 - APT-Candidate: yes - Depends: b | a - - Package: apport - Architecture: all - Version: 3 - APT-ID: 6 - Source: apport - Source-Version: 3 - Priority: optional - Section: other - Installed: yes - APT-Pin: 100 - APT-Candidate: yes - " cat rootdir/var/crash/apt-edsp.$(id -u).crash - +$(cat rootdir/var/log/apt/edsp.log.zst | base64 | sed 's#^# #')" cat rootdir/var/crash/apt-edsp.$(id -u).crash testsuccessequal "Request: EDSP 0.5 Architecture: amd64 @@ -217,7 +124,7 @@ Section: other Installed: yes APT-Pin: 100 APT-Candidate: yes -" cat rootdir/var/log/apt/edsp.log +" apthelper cat-file rootdir/var/log/apt/edsp.log.zst testfailureequal "Reading package lists... Building dependency tree... |
