]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/algorithms.cc
protect only the latest same-source providers from autoremove
[apt.git] / apt-pkg / algorithms.cc
index 7ddbb9d44bf6f775da456d804e218ffa21478fdb..b173979c3a4f5eaf25dcef28c488de9e0a8ddb1f 100644 (file)
@@ -24,6 +24,7 @@
 #include <apt-pkg/packagemanager.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/cacheiterators.h>
 #include <apt-pkg/packagemanager.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/cacheiterators.h>
+#include <apt-pkg/prettyprinters.h>
 
 #include <string.h>
 #include <string>
 
 #include <string.h>
 #include <string>
@@ -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");
 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")
    if (solver != "internal")
-      return EDSP::ResolveExternal(solver.c_str(), Cache, false, false, false, Progress);
+      return ret;
    return ResolveInternal(BrokenFix);
 }
                                                                        /*}}}*/
    return ResolveInternal(BrokenFix);
 }
                                                                        /*}}}*/
@@ -710,7 +712,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix)
          if (Scores[(*K)->ID] != 0)
          {
            pkgCache::PkgIterator Pkg(Cache,*K);
          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);
       changing a breaks c) */
    bool Change = true;
    bool const TryFixByInstall = _config->FindB("pkgProblemResolver::FixByInstall", true);
+   std::vector<PackageKill> KillList;
    for (int Counter = 0; Counter != 10 && Change == true; Counter++)
    {
       Change = false;
    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)
            continue;
         
         if (Debug == true)
-           clog << "Investigating (" << Counter << ") " << I << endl;
+           clog << "Investigating (" << Counter << ") " << APT::PrettyPkg(&Cache, I) << endl;
         
         // Isolate the problem dependency
         
         // Isolate the problem dependency
-        PackageKill KillList[100];
-        PackageKill *LEnd = KillList;
         bool InOr = false;
         pkgCache::DepIterator Start;
         pkgCache::DepIterator End;
         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();
         
         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 (Start == End)
            {
               // Decide what to do
-              if (InOr == true && OldEnd == LEnd)
+              if (InOr == true && OldSize == KillList.size())
               {
                  if (OrOp == OrRemove)
                  {
               {
                  if (OrOp == OrRemove)
                  {
@@ -816,7 +819,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix)
                  continue;
 
               InOr = Start != End;
                  continue;
 
               InOr = Start != End;
-              OldEnd = LEnd;
+              OldSize = KillList.size();
            }
            else
             {
            }
            else
             {
@@ -834,7 +837,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix)
            }
            
            if (Debug == true)
            }
            
            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
 
            /* 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 &&
                                 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
                        {
                           /* 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)
                              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
                           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;
                
                  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;
                  
                  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)
         {
         // 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)
            {
               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)
    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;
    }
 
       return true;
    }
 
@@ -1118,7 +1119,7 @@ bool pkgProblemResolver::InstOrNewPolicyBroken(pkgCache::PkgIterator I)
        Cache[I].InstPolicyBroken() == true)
    {
       if (Debug == true)
        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;
    }
 
       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");
 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")
    if (solver != "internal")
-      return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, Progress);
+      return ret;
    return ResolveByKeepInternal();
 }
                                                                        /*}}}*/
    return ResolveByKeepInternal();
 }
                                                                        /*}}}*/
@@ -1170,7 +1173,7 @@ bool pkgProblemResolver::ResolveByKeepInternal()
          if (Scores[(*K)->ID] != 0)
          {
            pkgCache::PkgIterator Pkg(Cache,*K);
          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)
         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<pkgCache::Version *[]> VList(Start.AllTargets());
 
            // Look at all the possible provides on this package
            std::unique_ptr<pkgCache::Version *[]> VList(Start.AllTargets());
@@ -1315,7 +1318,7 @@ void pkgProblemResolver::InstallProtect()
 struct PrioComp {
    pkgCache &PrioCache;
 
 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) {
    }
 
    bool operator() (pkgCache::Version * const &A, pkgCache::Version * const &B) {