X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/f1f9f9bfec4c2ad664698a026773276b0b5a4ac8..173fa882cf3396ab6d2a9be53c6ea23eda225a1d:/apt-pkg/algorithms.cc diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc index 7ddbb9d44..b173979c3 100644 --- a/apt-pkg/algorithms.cc +++ b/apt-pkg/algorithms.cc @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -635,8 +636,9 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg) bool pkgProblemResolver::Resolve(bool BrokenFix, OpProgress * const Progress) { std::string const solver = _config->Find("APT::Solver", "internal"); + auto const ret = EDSP::ResolveExternal(solver.c_str(), Cache, 0, Progress); if (solver != "internal") - return EDSP::ResolveExternal(solver.c_str(), Cache, false, false, false, Progress); + return ret; return ResolveInternal(BrokenFix); } /*}}}*/ @@ -710,7 +712,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix) if (Scores[(*K)->ID] != 0) { pkgCache::PkgIterator Pkg(Cache,*K); - clog << Scores[(*K)->ID] << ' ' << Pkg << std::endl; + clog << Scores[(*K)->ID] << ' ' << APT::PrettyPkg(&Cache, Pkg) << std::endl; } } @@ -725,6 +727,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix) changing a breaks c) */ bool Change = true; bool const TryFixByInstall = _config->FindB("pkgProblemResolver::FixByInstall", true); + std::vector KillList; for (int Counter = 0; Counter != 10 && Change == true; Counter++) { Change = false; @@ -764,15 +767,15 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix) continue; if (Debug == true) - clog << "Investigating (" << Counter << ") " << I << endl; + clog << "Investigating (" << Counter << ") " << APT::PrettyPkg(&Cache, I) << endl; // Isolate the problem dependency - PackageKill KillList[100]; - PackageKill *LEnd = KillList; bool InOr = false; pkgCache::DepIterator Start; pkgCache::DepIterator End; - PackageKill *OldEnd = LEnd; + size_t OldSize = 0; + + KillList.resize(0); enum {OrRemove,OrKeep} OrOp = OrRemove; for (pkgCache::DepIterator D = Cache[I].InstVerIter(Cache).DependsList(); @@ -782,7 +785,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix) if (Start == End) { // Decide what to do - if (InOr == true && OldEnd == LEnd) + if (InOr == true && OldSize == KillList.size()) { if (OrOp == OrRemove) { @@ -816,7 +819,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix) continue; InOr = Start != End; - OldEnd = LEnd; + OldSize = KillList.size(); } else { @@ -834,7 +837,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix) } if (Debug == true) - clog << "Broken " << Start << endl; + clog << "Broken " << APT::PrettyDep(&Cache, Start) << endl; /* Look across the version list. If there are no possible targets then we keep the package and bail. This is necessary @@ -933,7 +936,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix) Start.TargetPkg()->CurrentVer == 0 && Cache[Start.TargetPkg()].Delete() == false && (Flags[Start.TargetPkg()->ID] & ToRemove) != ToRemove && - Cache.GetCandidateVer(Start.TargetPkg()).end() == false) + Cache.GetCandidateVersion(Start.TargetPkg()).end() == false) { /* Before removing or keeping the package with the broken dependency try instead to install the first not previously installed package @@ -941,7 +944,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix) is removed by the resolver because of a conflict or alike but it is dangerous as it could trigger new breaks/conflicts… */ if (Debug == true) - clog << " Try Installing " << Start.TargetPkg() << " before changing " << I.FullName(false) << std::endl; + clog << " Try Installing " << APT::PrettyPkg(&Cache, Start.TargetPkg()) << " before changing " << I.FullName(false) << std::endl; unsigned long const OldBroken = Cache.BrokenCount(); Cache.MarkInstall(Start.TargetPkg(), true, 1, false); // FIXME: we should undo the complete MarkInstall process here @@ -979,10 +982,8 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix) if (Debug == true) clog << " Added " << Pkg.FullName(false) << " to the remove list" << endl; - - LEnd->Pkg = Pkg; - LEnd->Dep = End; - LEnd++; + + KillList.push_back({Pkg, End}); if (Start.IsNegative() == false) break; @@ -1032,7 +1033,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix) // Apply the kill list now if (Cache[I].InstallVer != 0) { - for (PackageKill *J = KillList; J != LEnd; J++) + for (auto J = KillList.begin(); J != KillList.end(); J++) { Change = true; if ((Cache[J->Dep] & pkgDepCache::DepGNow) == 0) @@ -1109,7 +1110,7 @@ bool pkgProblemResolver::InstOrNewPolicyBroken(pkgCache::PkgIterator I) if (Cache[I].InstBroken() == true) { if (Debug == true) - std::clog << " Dependencies are not satisfied for " << I << std::endl; + std::clog << " Dependencies are not satisfied for " << APT::PrettyPkg(&Cache, I) << std::endl; return true; } @@ -1118,7 +1119,7 @@ bool pkgProblemResolver::InstOrNewPolicyBroken(pkgCache::PkgIterator I) Cache[I].InstPolicyBroken() == true) { if (Debug == true) - std::clog << " Policy breaks with upgrade of " << I << std::endl; + std::clog << " Policy breaks with upgrade of " << APT::PrettyPkg(&Cache, I) << std::endl; return true; } @@ -1133,8 +1134,10 @@ bool pkgProblemResolver::InstOrNewPolicyBroken(pkgCache::PkgIterator I) bool pkgProblemResolver::ResolveByKeep(OpProgress * const Progress) { std::string const solver = _config->Find("APT::Solver", "internal"); + constexpr auto flags = EDSP::Request::UPGRADE_ALL | EDSP::Request::FORBID_NEW_INSTALL | EDSP::Request::FORBID_REMOVE; + auto const ret = EDSP::ResolveExternal(solver.c_str(), Cache, flags, Progress); if (solver != "internal") - return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, Progress); + return ret; return ResolveByKeepInternal(); } /*}}}*/ @@ -1170,7 +1173,7 @@ bool pkgProblemResolver::ResolveByKeepInternal() if (Scores[(*K)->ID] != 0) { pkgCache::PkgIterator Pkg(Cache,*K); - clog << Scores[(*K)->ID] << ' ' << Pkg << std::endl; + clog << Scores[(*K)->ID] << ' ' << APT::PrettyPkg(&Cache, Pkg) << std::endl; } } @@ -1225,7 +1228,7 @@ bool pkgProblemResolver::ResolveByKeepInternal() while (true) { if (Debug == true) - clog << "Package " << I.FullName(false) << " " << Start << endl; + clog << "Package " << I.FullName(false) << " " << APT::PrettyDep(&Cache, Start) << endl; // Look at all the possible provides on this package std::unique_ptr VList(Start.AllTargets()); @@ -1315,7 +1318,7 @@ void pkgProblemResolver::InstallProtect() struct PrioComp { pkgCache &PrioCache; - PrioComp(pkgCache &PrioCache) : PrioCache(PrioCache) { + explicit PrioComp(pkgCache &PrioCache) : PrioCache(PrioCache) { } bool operator() (pkgCache::Version * const &A, pkgCache::Version * const &B) {