summaryrefslogtreecommitdiff
path: root/apt-pkg/edsp.cc
diff options
context:
space:
mode:
Diffstat (limited to 'apt-pkg/edsp.cc')
-rw-r--r--apt-pkg/edsp.cc32
1 files changed, 31 insertions, 1 deletions
diff --git a/apt-pkg/edsp.cc b/apt-pkg/edsp.cc
index 88569d3c4..02e8d4ef4 100644
--- a/apt-pkg/edsp.cc
+++ b/apt-pkg/edsp.cc
@@ -327,6 +327,36 @@ bool EDSP::WriteLimitedScenario(pkgDepCache &Cache, FileFd &output,
Progress->Done();
return Okay;
}
+
+static void MarkPackage(std::vector<bool> &pkgset, pkgCache::PkgIterator pkg)
+{
+ if (pkgset[pkg->ID])
+ return;
+ pkgset[pkg->ID] = true;
+ for (auto ver = pkg.VersionList(); not ver.end(); ++ver)
+ {
+ for (auto P = ver.ProvidesList(); not P.end(); ++P)
+ MarkPackage(pkgset, P.ParentPkg());
+ for (auto D = ver.DependsList(); not D.end(); ++D)
+ {
+ std::unique_ptr<pkgCache::Version *[]> targets(D.AllTargets());
+ for (size_t i = 0; targets[i] != 0; ++i)
+ MarkPackage(pkgset, pkgCache::VerIterator(*ver.Cache(), targets[i]).ParentPkg());
+
+ MarkPackage(pkgset, D.TargetPkg());
+ }
+ }
+}
+
+bool EDSP::WriteLimitedScenario(pkgDepCache &Cache, FileFd &output,
+ OpProgress *Progress)
+{
+ std::vector<bool> pkgset(Cache.Head().PackageCount);
+ for (auto Pkg = Cache.PkgBegin(); not Pkg.end(); ++Pkg)
+ if (Cache[Pkg].Install() || Pkg->CurrentVer)
+ MarkPackage(pkgset, Pkg);
+ return WriteLimitedScenario(Cache, output, pkgset, Progress);
+}
/*}}}*/
// EDSP::WriteRequest - to the given file descriptor /*{{{*/
bool EDSP::WriteRequest(pkgDepCache &Cache, FileFd &output,
@@ -786,7 +816,7 @@ bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache,
FileFd output;
bool Okay = CreateDumpFile("EDSP::Resolve", "solver", output);
Okay &= EDSP::WriteRequest(Cache, output, flags, nullptr);
- return Okay && EDSP::WriteScenario(Cache, output, nullptr);
+ return Okay && EDSP::WriteLimitedScenario(Cache, output, nullptr);
}
_error->PushToStack();
int solver_in, solver_out;