Explorar o código

do not call resolver twice on (dist-)upgrade

David Kalnischkies %!s(int64=12) %!d(string=hai) anos
pai
achega
172947cd7d

+ 6 - 0
apt-pkg/upgrade.cc

@@ -143,6 +143,12 @@ static bool pkgAllUpgradeNoNewPackages(pkgDepCache &Cache)
  */
 static bool pkgAllUpgradeWithNewPackages(pkgDepCache &Cache)
 {
+   std::string const solver = _config->Find("APT::Solver", "internal");
+   if (solver != "internal") {
+      OpTextProgress Prog(*_config);
+      return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, &Prog);
+   }
+
    pkgDepCache::ActionGroup group(Cache);
 
    pkgProblemResolver Fix(&Cache);

+ 16 - 6
apt-private/private-install.cc

@@ -19,6 +19,7 @@
 #include <apt-pkg/macros.h>
 #include <apt-pkg/packagemanager.h>
 #include <apt-pkg/pkgcache.h>
+#include <apt-pkg/upgrade.h>
 
 #include <errno.h>
 #include <stdlib.h>
@@ -524,15 +525,14 @@ static bool DoAutomaticRemove(CacheFile &Cache)
 static const unsigned short MOD_REMOVE = 1;
 static const unsigned short MOD_INSTALL = 2;
 
-bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache)
+bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, int UpgradeMode)
 {
    std::map<unsigned short, APT::VersionSet> verset;
-   return DoCacheManipulationFromCommandLine(CmdL, Cache, verset);
+   return DoCacheManipulationFromCommandLine(CmdL, Cache, verset, UpgradeMode);
 }
 bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache,
-                                        std::map<unsigned short, APT::VersionSet> &verset)
+                                        std::map<unsigned short, APT::VersionSet> &verset, int UpgradeMode)
 {
-
    // Enter the special broken fixing mode if the user specified arguments
    bool BrokenFix = false;
    if (Cache->BrokenCount() != 0)
@@ -617,7 +617,17 @@ bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache,
       if (Fix != NULL)
       {
 	 // Call the scored problem resolver
-	 if (Fix->Resolve(true) == false && Cache->BrokenCount() == 0)
+	 bool resolver_fail = false;
+	 if (UpgradeMode == 0)
+	 {
+	    if (strcmp(CmdL.FileList[0], "dist-upgrade") == 0 || strcmp(CmdL.FileList[0], "full-upgrade") == 0)
+	       resolver_fail = APT::Upgrade::Upgrade(Cache, 0);
+	    else
+	       resolver_fail = Fix->Resolve(true);
+	 } else
+	    resolver_fail = APT::Upgrade::Upgrade(Cache, UpgradeMode);
+
+	 if (resolver_fail == false && Cache->BrokenCount() == 0)
 	    return false;
       }
 
@@ -676,7 +686,7 @@ bool DoInstall(CommandLine &CmdL)
 
    std::map<unsigned short, APT::VersionSet> verset;
 
-   if(!DoCacheManipulationFromCommandLine(CmdL, Cache, verset))
+   if(!DoCacheManipulationFromCommandLine(CmdL, Cache, verset, 0))
       return false;
 
    /* Print out a list of packages that are going to be installed extra

+ 2 - 2
apt-private/private-install.h

@@ -21,8 +21,8 @@ class pkgProblemResolver;
 APT_PUBLIC bool DoInstall(CommandLine &Cmd);
 
 bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache,
-                                        std::map<unsigned short, APT::VersionSet> &verset);
-bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache);
+                                        std::map<unsigned short, APT::VersionSet> &verset, int UpgradeMode);
+bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, int UpgradeMode);
 
 APT_PUBLIC bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,
                         bool Safety = true);

+ 2 - 10
apt-private/private-upgrade.cc

@@ -23,18 +23,10 @@ static bool UpgradeHelper(CommandLine &CmdL, int UpgradeFlags)
       return false;
 
    c0out << _("Calculating upgrade... ") << std::flush;
-   if (APT::Upgrade::Upgrade(Cache, UpgradeFlags) == false)
-   {
-      c0out << _("Failed") << std::endl;
-      ShowBroken(c1out,Cache,false);
-      return _error->Error(_("Internal error, Upgrade broke stuff"));
-   }
+   if(!DoCacheManipulationFromCommandLine(CmdL, Cache, UpgradeFlags))
+      return false;
    c0out << _("Done") << std::endl;
 
-   // parse additional cmdline pkg manipulation switches
-   if(!DoCacheManipulationFromCommandLine(CmdL, Cache))
-      return false;
-   
    return InstallPackages(Cache,true);
 }
 

+ 6 - 0
test/integration/test-external-dependency-solver-protocol

@@ -51,6 +51,12 @@ rm -f /tmp/dump.edsp
 testfailure aptget install --solver dump awesomecoolstuff:i386 -s
 testsuccess test -s /tmp/dump.edsp
 
+testsuccess aptget dist-upgrade -s
+testsuccess aptget dist-upgrade -s --solver apt
+
+testsuccess aptget upgrade -s
+testsuccess aptget upgrade -s --solver apt
+
 configarchitecture 'armel'
 msgtest 'Test direct calling is okay for' 'apt-internal-solver'
 cat /tmp/dump.edsp | aptinternalsolver > solver.result 2>&1 || true