summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/solver3.cc7
-rw-r--r--apt-private/private-install.cc28
-rwxr-xr-xtest/integration/test-solver3-evaluation97
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...