bool pkgDistUpgrade(pkgDepCache &Cache)
{
std::string const solver = _config->Find("APT::Solver::Name", "internal");
- if (solver != "internal")
- return EDSP::ResolveExternal(solver.c_str(), Cache, false, true, false);
+ if (solver != "internal") {
+ OpTextProgress Prog(*_config);
+ return EDSP::ResolveExternal(solver.c_str(), Cache, false, true, false, &Prog);
+ }
pkgDepCache::ActionGroup group(Cache);
bool pkgAllUpgrade(pkgDepCache &Cache)
{
std::string const solver = _config->Find("APT::Solver::Name", "internal");
- if (solver != "internal")
- return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false);
+ if (solver != "internal") {
+ OpTextProgress Prog(*_config);
+ return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, &Prog);
+ }
pkgDepCache::ActionGroup group(Cache);
bool pkgProblemResolver::Resolve(bool BrokenFix)
{
std::string const solver = _config->Find("APT::Solver::Name", "internal");
- if (solver != "internal")
- return EDSP::ResolveExternal(solver.c_str(), Cache, false, false, false);
+ if (solver != "internal") {
+ OpTextProgress Prog(*_config);
+ return EDSP::ResolveExternal(solver.c_str(), Cache, false, false, false, &Prog);
+ }
return ResolveInternal(BrokenFix);
}
/*}}}*/
bool pkgProblemResolver::ResolveByKeep()
{
std::string const solver = _config->Find("APT::Solver::Name", "internal");
- if (solver != "internal")
- return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false);
+ if (solver != "internal") {
+ OpTextProgress Prog(*_config);
+ return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, &Prog);
+ }
return ResolveByKeepInternal();
}
/*}}}*/
"Obsoletes", "Breaks", "Enhances"};
// EDSP::WriteScenario - to the given file descriptor /*{{{*/
-bool EDSP::WriteScenario(pkgDepCache &Cache, FILE* output)
+bool EDSP::WriteScenario(pkgDepCache &Cache, FILE* output, OpProgress *Progress)
{
+ if (Progress != NULL)
+ Progress->SubProgress(Cache.Head().VersionCount, _("Send scenario to solver"));
+ unsigned long p = 0;
for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; ++Pkg)
- for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; ++Ver)
+ for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; ++Ver, ++p)
{
WriteScenarioVersion(Cache, output, Pkg, Ver);
WriteScenarioDependency(Cache, output, Pkg, Ver);
fprintf(output, "\n");
+ if (Progress != NULL && p % 100 == 0)
+ Progress->Progress(p);
}
return true;
}
/*}}}*/
// EDSP::WriteLimitedScenario - to the given file descriptor /*{{{*/
bool EDSP::WriteLimitedScenario(pkgDepCache &Cache, FILE* output,
- APT::PackageSet const &pkgset)
+ APT::PackageSet const &pkgset,
+ OpProgress *Progress)
{
- for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
+ if (Progress != NULL)
+ Progress->SubProgress(Cache.Head().VersionCount, _("Send scenario to solver"));
+ unsigned long p = 0;
+ for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg, ++p)
for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; ++Ver)
{
WriteScenarioVersion(Cache, output, Pkg, Ver);
WriteScenarioLimitedDependency(Cache, output, Pkg, Ver, pkgset);
fprintf(output, "\n");
+ if (Progress != NULL && p % 100 == 0)
+ Progress->Progress(p);
}
+ if (Progress != NULL)
+ Progress->Done();
return true;
}
/*}}}*/
/*}}}*/
// EDSP::WriteRequest - to the given file descriptor /*{{{*/
bool EDSP::WriteRequest(pkgDepCache &Cache, FILE* output, bool const Upgrade,
- bool const DistUpgrade, bool const AutoRemove)
+ bool const DistUpgrade, bool const AutoRemove,
+ OpProgress *Progress)
{
+ if (Progress != NULL)
+ Progress->SubProgress(Cache.Head().PackageCount, _("Send request to solver"));
+ unsigned long p = 0;
string del, inst;
- for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; ++Pkg)
+ for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; ++Pkg, ++p)
{
+ if (Progress != NULL && p % 100 == 0)
+ Progress->Progress(p);
string* req;
if (Cache[Pkg].Delete() == true)
req = &del;
}
/*}}}*/
// EDSP::ReadResponse - from the given file descriptor /*{{{*/
-bool EDSP::ReadResponse(int const input, pkgDepCache &Cache) {
+bool EDSP::ReadResponse(int const input, pkgDepCache &Cache, OpProgress *Progress) {
/* We build an map id to mmap offset here
In theory we could use the offset as ID, but then VersionCount
couldn't be used to create other versionmappings anymore and it
else if (section.Exists("Remove") == true)
type = "Remove";
else if (section.Exists("Progress") == true) {
- std::clog << TimeRFC1123(time(NULL)) << " ";
- ioprintf(std::clog, "[ %3d%% ] ", section.FindI("Percentage", 0));
- std::clog << section.FindS("Progress") << " - ";
- string const msg = section.FindS("Message");
- if (msg.empty() == true)
- std::clog << "Solver is still working on the solution" << std::endl;
- else
- std::clog << msg << std::endl;
+ if (Progress != NULL) {
+ string const msg = section.FindS("Message");
+ if (msg.empty() == true)
+ Progress->SubProgress(100, _("Prepare for receiving solution"));
+ else
+ Progress->SubProgress(100, msg);
+ Progress->Progress(section.FindI("Percentage", 0));
+ }
continue;
} else if (section.Exists("Error") == true) {
std::cerr << "The solver encountered an error of type: " << section.FindS("Error") << std::endl;
// EDSP::ResolveExternal - resolve problems by asking external for help {{{*/
bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache,
bool const upgrade, bool const distUpgrade,
- bool const autoRemove) {
+ bool const autoRemove, OpProgress *Progress) {
int solver_in, solver_out;
if (EDSP::ExecuteSolver(solver, &solver_in, &solver_out) == false)
return false;
FILE* output = fdopen(solver_in, "w");
if (output == NULL)
return _error->Errno("Resolve", "fdopen on solver stdin failed");
- EDSP::WriteRequest(Cache, output, upgrade, distUpgrade, autoRemove);
- EDSP::WriteScenario(Cache, output);
+
+ if (Progress != NULL)
+ Progress->OverallProgress(0, 100, 5, _("Execute external solver"));
+ EDSP::WriteRequest(Cache, output, upgrade, distUpgrade, autoRemove, Progress);
+ if (Progress != NULL)
+ Progress->OverallProgress(5, 100, 20, _("Execute external solver"));
+ EDSP::WriteScenario(Cache, output, Progress);
fclose(output);
- if (EDSP::ReadResponse(solver_out, Cache) == false)
+ if (Progress != NULL)
+ Progress->OverallProgress(25, 100, 75, _("Execute external solver"));
+ if (EDSP::ReadResponse(solver_out, Cache, Progress) == false)
return _error->Error("Reading solver response failed");
return true;
#include <apt-pkg/depcache.h>
#include <apt-pkg/cacheset.h>
+#include <apt-pkg/progress.h>
#include <string>
* \param upgrade is true if it is an request like apt-get upgrade
* \param distUpgrade is true if it is a request like apt-get dist-upgrade
* \param autoRemove is true if removal of unneeded packages should be performed
+ * \param Progress is an instance to report progress to
*
* \return true if request was composed successfully, otherwise false
*/
bool static WriteRequest(pkgDepCache &Cache, FILE* output,
bool const upgrade = false,
bool const distUpgrade = false,
- bool const autoRemove = false);
+ bool const autoRemove = false,
+ OpProgress *Progress = NULL);
/** \brief creates the scenario representing the package universe
*
*
* \param Cache is the known package universe
* \param output is written to this "file"
+ * \param Progress is an instance to report progress to
*
* \return true if universe was composed successfully, otherwise false
*/
- bool static WriteScenario(pkgDepCache &Cache, FILE* output);
+ bool static WriteScenario(pkgDepCache &Cache, FILE* output, OpProgress *Progress = NULL);
/** \brief creates a limited scenario representing the package universe
*
* \param Cache is the known package universe
* \param output is written to this "file"
* \param pkgset is a set of packages the universe should be limited to
+ * \param Progress is an instance to report progress to
*
* \return true if universe was composed successfully, otherwise false
*/
bool static WriteLimitedScenario(pkgDepCache &Cache, FILE* output,
- APT::PackageSet const &pkgset);
+ APT::PackageSet const &pkgset,
+ OpProgress *Progress = NULL);
/** \brief waits and acts on the information returned from the solver
*
*
* \param input file descriptor with the response from the solver
* \param Cache the solution should be applied on if any
+ * \param Progress is an instance to report progress to
*
* \return true if a solution is found and applied correctly, otherwise false
*/
- bool static ReadResponse(int const input, pkgDepCache &Cache);
+ bool static ReadResponse(int const input, pkgDepCache &Cache, OpProgress *Progress = NULL);
/** \brief search and read the request stanza for action later
*
* \param upgrade is true if it is a request like apt-get upgrade
* \param distUpgrade is true if it is a request like apt-get dist-upgrade
* \param autoRemove is true if unneeded packages should be removed
+ * \param Progress is an instance to report progress to
*
* \return true if the solver has successfully solved the problem,
* otherwise false
*/
bool static ResolveExternal(const char* const solver, pkgDepCache &Cache,
bool const upgrade, bool const distUpgrade,
- bool const autoRemove);
+ bool const autoRemove, OpProgress *Progress = NULL);
};
/*}}}*/
#endif