]> git.saurik.com Git - apt.git/blame - apt-pkg/algorithms.h
Merge commit 'e2073b0276226b625897ef475f225bf8f508719e' as 'triehash'
[apt.git] / apt-pkg / algorithms.h
CommitLineData
6c139d6e
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
6c139d6e
AL
3/* ######################################################################
4
5 Algorithms - A set of misc algorithms
6
7 This simulate class displays what the ordering code has done and
8 analyses it with a fresh new dependency cache. In this way we can
9 see all of the effects of an upgrade run.
10
11 pkgDistUpgrade computes an upgrade that causes as many packages as
1e3f4083 12 possible to move to the newest version.
6c139d6e
AL
13
14 pkgApplyStatus sets the target state based on the content of the status
15 field in the status file. It is important to get proper crash recovery.
6fc33863
AL
16
17 pkgFixBroken corrects a broken system so that it is in a sane state.
0a8e3465
AL
18
19 pkgAllUpgrade attempts to upgade as many packages as possible but
20 without installing new packages.
6c139d6e 21
0a8e3465
AL
22 The problem resolver class contains a number of complex algorithms
23 to try to best-guess an upgrade state. It solves the problem of
24 maximizing the number of install state packages while having no broken
25 packages.
26
6c139d6e
AL
27 ##################################################################### */
28 /*}}}*/
6c139d6e
AL
29#ifndef PKGLIB_ALGORITHMS_H
30#define PKGLIB_ALGORITHMS_H
31
6c139d6e 32
094a497d
AL
33#include <apt-pkg/packagemanager.h>
34#include <apt-pkg/depcache.h>
453b82a3
DK
35#include <apt-pkg/pkgcache.h>
36#include <apt-pkg/cacheiterators.h>
6c139d6e 37
b4fc9b6f 38#include <iostream>
453b82a3 39#include <string>
b4fc9b6f 40
f3c736f9
DK
41#include <apt-pkg/macros.h>
42
a4f6bdc8 43#ifndef APT_8_CLEANER_HEADERS
b9dadc24 44#include <apt-pkg/acquire.h>
a4f6bdc8
DK
45using std::ostream;
46#endif
47
82e369c4 48#ifndef APT_9_CLEANER_HEADERS
1e3f4083 49// include pkg{DistUpgrade,AllUpgrade,MiniizeUpgrade} here for compatibility
82e369c4 50#include <apt-pkg/upgrade.h>
d428d131 51#include <apt-pkg/update.h>
82e369c4
MV
52#endif
53
facea693 54
4326680d 55class pkgSimulatePrivate;
92fcbfc1 56class pkgSimulate : public pkgPackageManager /*{{{*/
6c139d6e 57{
4326680d 58 pkgSimulatePrivate * const d;
6c139d6e
AL
59 protected:
60
b2e465d6
AL
61 class Policy : public pkgDepCache::Policy
62 {
63 pkgDepCache *Cache;
64 public:
65
3b302846 66 virtual VerIterator GetCandidateVer(PkgIterator const &Pkg) APT_OVERRIDE
b2e465d6
AL
67 {
68 return (*Cache)[Pkg].CandidateVerIter(*Cache);
69 }
70
e8afd168 71 explicit Policy(pkgDepCache *Cache) : Cache(Cache) {};
b2e465d6
AL
72 };
73
6c139d6e
AL
74 unsigned char *Flags;
75
b2e465d6 76 Policy iPolicy;
6c139d6e 77 pkgDepCache Sim;
496d5c70 78 pkgDepCache::ActionGroup group;
8d89cda7
VL
79
80 // The Actual installation implementation
3b302846
DK
81 virtual bool Install(PkgIterator Pkg,std::string File) APT_OVERRIDE;
82 virtual bool Configure(PkgIterator Pkg) APT_OVERRIDE;
83 virtual bool Remove(PkgIterator Pkg,bool Purge) APT_OVERRIDE;
b3d44315 84
4326680d
DK
85 // FIXME: trick to avoid ABI break for virtual reimplementation; fix on next ABI break
86public:
87 APT_HIDDEN bool Go2(APT::Progress::PackageManager * progress);
88
b3d44315 89private:
3809194b
DK
90 APT_HIDDEN void ShortBreaks();
91 APT_HIDDEN void Describe(PkgIterator iPkg,std::ostream &out,bool Current,bool Candidate);
4326680d
DK
92 APT_HIDDEN bool RealInstall(PkgIterator Pkg,std::string File);
93 APT_HIDDEN bool RealConfigure(PkgIterator Pkg);
94 APT_HIDDEN bool RealRemove(PkgIterator Pkg,bool Purge);
3809194b 95
6c139d6e
AL
96 public:
97
e8afd168 98 explicit pkgSimulate(pkgDepCache *Cache);
c8a4ce6c 99 virtual ~pkgSimulate();
6c139d6e 100};
92fcbfc1
DK
101 /*}}}*/
102class pkgProblemResolver /*{{{*/
6c139d6e 103{
facea693 104 private:
be9b62f7 105 /** \brief dpointer placeholder (for later in case we need it) */
6c55f07a 106 void * const d;
be9b62f7 107
6c139d6e
AL
108 pkgDepCache &Cache;
109 typedef pkgCache::PkgIterator PkgIterator;
110 typedef pkgCache::VerIterator VerIterator;
111 typedef pkgCache::DepIterator DepIterator;
112 typedef pkgCache::PrvIterator PrvIterator;
113 typedef pkgCache::Version Version;
114 typedef pkgCache::Package Package;
115
116 enum Flags {Protected = (1 << 0), PreInstalled = (1 << 1),
3b5421b4
AL
117 Upgradable = (1 << 2), ReInstateTried = (1 << 3),
118 ToRemove = (1 << 4)};
d0f2c87c 119 int *Scores;
6c139d6e
AL
120 unsigned char *Flags;
121 bool Debug;
122
123 // Sort stuff
f1f9f9bf 124 APT_HIDDEN int ScoreSort(Package const *A, Package const *B) APT_PURE;
6c139d6e
AL
125
126 struct PackageKill
127 {
128 PkgIterator Pkg;
129 DepIterator Dep;
130 };
131
3809194b
DK
132 APT_HIDDEN void MakeScores();
133 APT_HIDDEN bool DoUpgrade(pkgCache::PkgIterator Pkg);
134
953b348c
MV
135 protected:
136 bool InstOrNewPolicyBroken(pkgCache::PkgIterator Pkg);
137
6c139d6e
AL
138 public:
139
cc26da01 140 inline void Protect(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= Protected; Cache.MarkProtected(Pkg);};
3b5421b4 141 inline void Remove(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= ToRemove;};
61d6a8de 142 inline void Clear(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] &= ~(Protected | ToRemove);};
2a884c61
DK
143
144 // Try to intelligently resolve problems by installing and removing packages
145 bool Resolve(bool BrokenFix = false, OpProgress * const Progress = NULL);
4dc619c0 146 APT_HIDDEN bool ResolveInternal(bool const BrokenFix = false);
2a884c61 147
0a8e3465 148 // Try to resolve problems only by using keep
2a884c61 149 bool ResolveByKeep(OpProgress * const Progress = NULL);
4dc619c0 150 APT_HIDDEN bool ResolveByKeepInternal();
c320a1e6 151
5dd00edb 152 APT_DEPRECATED_MSG("NOOP as MarkInstall enforces not overriding FromUser markings") void InstallProtect();
f3c736f9 153
e8afd168 154 explicit pkgProblemResolver(pkgDepCache *Cache);
c8a4ce6c 155 virtual ~pkgProblemResolver();
6c139d6e 156};
92fcbfc1 157 /*}}}*/
6c139d6e
AL
158bool pkgApplyStatus(pkgDepCache &Cache);
159bool pkgFixBroken(pkgDepCache &Cache);
b9179170 160
b2e465d6 161void pkgPrioSortList(pkgCache &Cache,pkgCache::Version **List);
760d4968 162
db09a1c5 163
6c139d6e 164#endif