summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2014-06-17 19:05:53 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2014-06-18 11:17:18 +0200
commit172947cd7dc5c88c94c6ad269dc6c6be002ee958 (patch)
tree7d7bf86d31cf3f2fa8a1fae2d51d02aa3c6b0081
parentd39d7f885d61bfe296c131c83bdc042a2ab6b0d7 (diff)
downloadapt-172947cd7dc5c88c94c6ad269dc6c6be002ee958.tar.gz
do not call resolver twice on (dist-)upgrade
-rw-r--r--apt-pkg/upgrade.cc6
-rw-r--r--apt-private/private-install.cc22
-rw-r--r--apt-private/private-install.h4
-rw-r--r--apt-private/private-upgrade.cc12
-rwxr-xr-xtest/integration/test-external-dependency-solver-protocol6
5 files changed, 32 insertions, 18 deletions
diff --git a/apt-pkg/upgrade.cc b/apt-pkg/upgrade.cc
index 7926845c..29b11937 100644
--- a/apt-pkg/upgrade.cc
+++ b/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);
diff --git a/apt-private/private-install.cc b/apt-private/private-install.cc
index a365d429..e08cd805 100644
--- a/apt-private/private-install.cc
+++ b/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
diff --git a/apt-private/private-install.h b/apt-private/private-install.h
index 828163e4..8daa4a77 100644
--- a/apt-private/private-install.h
+++ b/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);
diff --git a/apt-private/private-upgrade.cc b/apt-private/private-upgrade.cc
index 68b2c5e0..31f06757 100644
--- a/apt-private/private-upgrade.cc
+++ b/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);
}
diff --git a/test/integration/test-external-dependency-solver-protocol b/test/integration/test-external-dependency-solver-protocol
index 09230d38..07d2441b 100755
--- a/test/integration/test-external-dependency-solver-protocol
+++ b/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