X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/6fc33863f31051a5fc2726a236ce8b64d33bc964..41c24955e8aa1303071348d77f661742270d05c0:/apt-pkg/algorithms.h?ds=sidebyside diff --git a/apt-pkg/algorithms.h b/apt-pkg/algorithms.h index d17a42447..5a9a77415 100644 --- a/apt-pkg/algorithms.h +++ b/apt-pkg/algorithms.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: algorithms.h,v 1.3 1998/07/19 21:24:11 jgg Exp $ +// $Id: algorithms.h,v 1.10 2001/05/22 04:17:41 jgg Exp $ /* ###################################################################### Algorithms - A set of misc algorithms @@ -16,41 +16,84 @@ field in the status file. It is important to get proper crash recovery. pkgFixBroken corrects a broken system so that it is in a sane state. + + pkgAllUpgrade attempts to upgade as many packages as possible but + without installing new packages. + The problem resolver class contains a number of complex algorithms + to try to best-guess an upgrade state. It solves the problem of + maximizing the number of install state packages while having no broken + packages. + ##################################################################### */ /*}}}*/ -// Header section: pkglib #ifndef PKGLIB_ALGORITHMS_H #define PKGLIB_ALGORITHMS_H -#ifdef __GNUG__ -#pragma interface "apt-pkg/algorithms.h" -#endif #include #include -class pkgSimulate : public pkgPackageManager +#include + +#include + +#ifndef APT_8_CLEANER_HEADERS +#include +using std::ostream; +#endif + +#ifndef APT_9_CLEANER_HEADERS +// include pkg{DistUpgrade,AllUpgrade,MiniizeUpgrade} here for compatiblity +#include +#include +#endif + + +class pkgSimulate : public pkgPackageManager /*{{{*/ { protected: + class Policy : public pkgDepCache::Policy + { + pkgDepCache *Cache; + public: + + virtual VerIterator GetCandidateVer(PkgIterator const &Pkg) + { + return (*Cache)[Pkg].CandidateVerIter(*Cache); + } + + Policy(pkgDepCache *Cache) : Cache(Cache) {}; + }; + unsigned char *Flags; + Policy iPolicy; pkgDepCache Sim; + pkgDepCache::ActionGroup group; // The Actuall installation implementation - virtual bool Install(PkgIterator Pkg,string File); + virtual bool Install(PkgIterator Pkg,std::string File); virtual bool Configure(PkgIterator Pkg); - virtual bool Remove(PkgIterator Pkg); + virtual bool Remove(PkgIterator Pkg,bool Purge); + +private: void ShortBreaks(); + void Describe(PkgIterator iPkg,std::ostream &out,bool Current,bool Candidate); public: - pkgSimulate(pkgDepCache &Cache); + pkgSimulate(pkgDepCache *Cache); + ~pkgSimulate(); }; - -class pkgProblemResolver + /*}}}*/ +class pkgProblemResolver /*{{{*/ { + private: + /** \brief dpointer placeholder (for later in case we need it) */ + void *d; + pkgDepCache &Cache; typedef pkgCache::PkgIterator PkgIterator; typedef pkgCache::VerIterator VerIterator; @@ -60,8 +103,9 @@ class pkgProblemResolver typedef pkgCache::Package Package; enum Flags {Protected = (1 << 0), PreInstalled = (1 << 1), - Upgradable = (1 << 2)}; - signed short *Scores; + Upgradable = (1 << 2), ReInstateTried = (1 << 3), + ToRemove = (1 << 4)}; + int *Scores; unsigned char *Flags; bool Debug; @@ -77,17 +121,35 @@ class pkgProblemResolver void MakeScores(); bool DoUpgrade(pkgCache::PkgIterator Pkg); + + bool ResolveInternal(bool const BrokenFix = false); + bool ResolveByKeepInternal(); + protected: + bool InstOrNewPolicyBroken(pkgCache::PkgIterator Pkg); + public: - inline void Protect(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= Protected;}; + inline void Protect(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= Protected; Cache.MarkProtected(Pkg);}; + inline void Remove(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= ToRemove;}; + inline void Clear(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] &= ~(Protected | ToRemove);}; + + // Try to intelligently resolve problems by installing and removing packages bool Resolve(bool BrokenFix = false); - pkgProblemResolver(pkgDepCache &Cache); -}; + // Try to resolve problems only by using keep + bool ResolveByKeep(); + + __deprecated void InstallProtect(); -bool pkgDistUpgrade(pkgDepCache &Cache); + pkgProblemResolver(pkgDepCache *Cache); + ~pkgProblemResolver(); +}; + /*}}}*/ bool pkgApplyStatus(pkgDepCache &Cache); bool pkgFixBroken(pkgDepCache &Cache); +void pkgPrioSortList(pkgCache &Cache,pkgCache::Version **List); + + #endif