]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/algorithms.cc
don't sent Range requests if we know its not accepted
[apt.git] / apt-pkg / algorithms.cc
index ee4787b3843b97782b5da78a1fca6d4f2211ff79..65c5ff85d9f89a229999738a74045e8a01833fd2 100644 (file)
 #include <apt-pkg/packagemanager.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/cacheiterators.h>
+#include <apt-pkg/prettyprinters.h>
+#include <apt-pkg/dpkgpm.h>
 
 #include <string.h>
 #include <string>
 #include <cstdlib>
 #include <iostream>
+#include <utility>
 
 #include <apti18n.h>
                                                                        /*}}}*/
 using namespace std;
 
+class APT_HIDDEN pkgSimulatePrivate
+{
+public:
+   std::vector<pkgDPkgPM::Item> List;
+};
 // Simulate::Simulate - Constructor                                    /*{{{*/
 // ---------------------------------------------------------------------
 /* The legacy translations here of input Pkg iterators is obsolete, 
    this is not necessary since the pkgCaches are fully shared now. */
 pkgSimulate::pkgSimulate(pkgDepCache *Cache) : pkgPackageManager(Cache),
-                           d(NULL), iPolicy(Cache),
+                           d(new pkgSimulatePrivate()), iPolicy(Cache),
                            Sim(&Cache->GetCache(),&iPolicy),
                            group(Sim)
 {
@@ -57,6 +65,7 @@ pkgSimulate::pkgSimulate(pkgDepCache *Cache) : pkgPackageManager(Cache),
 pkgSimulate::~pkgSimulate()
 {
    delete[] Flags;
+   delete d;
 }
                                                                        /*}}}*/
 // Simulate::Describe - Describe a package                             /*{{{*/
@@ -89,7 +98,14 @@ void pkgSimulate::Describe(PkgIterator Pkg,ostream &out,bool Current,bool Candid
 // Simulate::Install - Simulate unpacking of a package                 /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-bool pkgSimulate::Install(PkgIterator iPkg,string /*File*/)
+bool pkgSimulate::Install(PkgIterator iPkg,string File)
+{
+   if (iPkg.end() || File.empty())
+      return false;
+   d->List.emplace_back(pkgDPkgPM::Item::Install, iPkg, File);
+   return true;
+}
+bool pkgSimulate::RealInstall(PkgIterator iPkg,string /*File*/)
 {
    // Adapt the iterator
    PkgIterator Pkg = Sim.FindPkg(iPkg.Name(), iPkg.Arch());
@@ -136,6 +152,13 @@ bool pkgSimulate::Install(PkgIterator iPkg,string /*File*/)
    install the package.. For some investigations it may be necessary 
    however. */
 bool pkgSimulate::Configure(PkgIterator iPkg)
+{
+   if (iPkg.end())
+      return false;
+   d->List.emplace_back(pkgDPkgPM::Item::Configure, iPkg);
+   return true;
+}
+bool pkgSimulate::RealConfigure(PkgIterator iPkg)
 {
    // Adapt the iterator
    PkgIterator Pkg = Sim.FindPkg(iPkg.Name(), iPkg.Arch());
@@ -186,6 +209,13 @@ bool pkgSimulate::Configure(PkgIterator iPkg)
 // ---------------------------------------------------------------------
 /* */
 bool pkgSimulate::Remove(PkgIterator iPkg,bool Purge)
+{
+   if (iPkg.end())
+      return false;
+   d->List.emplace_back(Purge ? pkgDPkgPM::Item::Purge : pkgDPkgPM::Item::Remove, iPkg);
+   return true;
+}
+bool pkgSimulate::RealRemove(PkgIterator iPkg,bool Purge)
 {
    // Adapt the iterator
    PkgIterator Pkg = Sim.FindPkg(iPkg.Name(), iPkg.Arch());
@@ -231,6 +261,38 @@ void pkgSimulate::ShortBreaks()
    cout << ']' << endl;
 }
                                                                        /*}}}*/
+bool pkgSimulate::Go2(APT::Progress::PackageManager *)                 /*{{{*/
+{
+   if (pkgDPkgPM::ExpandPendingCalls(d->List, Cache) == false)
+      return false;
+   for (auto && I : d->List)
+      switch (I.Op)
+      {
+        case pkgDPkgPM::Item::Install:
+           if (RealInstall(I.Pkg, I.File) == false)
+              return false;
+           break;
+        case pkgDPkgPM::Item::Configure:
+           if (RealConfigure(I.Pkg) == false)
+              return false;
+           break;
+        case pkgDPkgPM::Item::Remove:
+           if (RealRemove(I.Pkg, false) == false)
+              return false;
+           break;
+        case pkgDPkgPM::Item::Purge:
+           if (RealRemove(I.Pkg, true) == false)
+              return false;
+           break;
+        case pkgDPkgPM::Item::ConfigurePending:
+        case pkgDPkgPM::Item::TriggersPending:
+        case pkgDPkgPM::Item::RemovePending:
+        case pkgDPkgPM::Item::PurgePending:
+           return _error->Error("Internal error, simulation encountered unexpected pending item");
+      }
+   return true;
+}
+                                                                       /*}}}*/
 // ApplyStatus - Adjust for non-ok packages                            /*{{{*/
 // ---------------------------------------------------------------------
 /* We attempt to change the state of the all packages that have failed
@@ -635,8 +697,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 +773,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;
          }
    }
 
@@ -765,7 +828,7 @@ 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
         bool InOr = false;
@@ -835,7 +898,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
@@ -942,7 +1005,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
@@ -1108,7 +1171,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;
    }
 
@@ -1117,7 +1180,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;
    }
 
@@ -1132,8 +1195,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();
 }
                                                                        /*}}}*/
@@ -1169,7 +1234,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;
          }
    }
 
@@ -1224,7 +1289,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<pkgCache::Version *[]> VList(Start.AllTargets());