Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / zypp / solver / detail / Resolver.h
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
2 /* Resolver.h
3  *
4  * Copyright (C) 2000-2002 Ximian, Inc.
5  * Copyright (C) 2005 SUSE Linux Products GmbH
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License,
9  * version 2, as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19  * 02111-1307, USA.
20  */
21
22 #ifndef ZYPP_SOLVER_DETAIL_RESOLVER_H
23 #define ZYPP_SOLVER_DETAIL_RESOLVER_H
24 #ifndef ZYPP_USE_RESOLVER_INTERNALS
25 #error Do not directly include this file!
26 #else
27
28 #include <iosfwd>
29 #include <string>
30 #include <list>
31 #include <map>
32
33 #include "zypp/ResPool.h"
34 #include "zypp/TriBool.h"
35 #include "zypp/base/SerialNumber.h"
36 #include "zypp/base/NonCopyable.h"
37
38 #include "zypp/ProblemTypes.h"
39 #include "zypp/ResolverProblem.h"
40 #include "zypp/ProblemSolution.h"
41 #include "zypp/Capabilities.h"
42 #include "zypp/Capability.h"
43
44 /////////////////////////////////////////////////////////////////////////
45 namespace zypp
46 {
47   namespace sat
48   {
49     class Transaction;
50   }
51   ///////////////////////////////////////////////////////////////////////
52   namespace solver
53   {
54     /////////////////////////////////////////////////////////////////////
55     namespace detail
56     {
57       class SATResolver;
58       typedef std::list<PoolItem> PoolItemList;
59       typedef std::set<PoolItem> PoolItemSet;
60
61 ///////////////////////////////////////////////////////////////////
62 //
63 //      CLASS NAME : Resolver
64 /** A mid layer class we should remove
65  * \todo Merge this and class SATResolver. Logic and date are horribly
66  * distributed between this and SATResolver. Either SATResolver becomes
67  * a pure wrapper adapting the libsolv C interface to fit our needs, and
68  * all the solver logic and problem handling goes here; or completely merge
69  * both classes.
70  */
71 class Resolver : private base::NonCopyable
72 {
73   typedef std::multimap<PoolItem,ItemCapKind> ItemCapKindMap;
74   private:
75     ResPool _pool;
76     SATResolver *_satResolver;
77     SerialNumberWatcher _poolchanged;
78
79     CapabilitySet _extra_requires;
80     CapabilitySet _extra_conflicts;
81     std::set<Repository> _upgradeRepos;
82
83     // Regard dependencies of the item weak onl
84     PoolItemList _addWeak;
85
86     /** \name Solver flags */
87     //@{
88     bool _forceResolve;           // remove items which are conflicts with others or
89                                   // have unfulfilled requirements.
90                                   // This behaviour is favourited by ZMD
91     bool _upgradeMode;            // Resolver has been called with doUpgrade
92     bool _updateMode;            // Resolver has been called with doUpdate
93     bool _verifying;              // The system will be checked
94     bool _onlyRequires;           // do install required resolvables only
95                                   // no recommended resolvables, language
96                                   // packages, hardware packages (modalias)
97     bool _allowVendorChange;    // whether the solver should allow or disallow vendor changes.
98     bool _solveSrcPackages;     // whether to generate solver jobs for selected source packges.
99     bool _cleandepsOnRemove;    // whether removing a package should also remove no longer needed requirements
100
101     bool _ignoreAlreadyRecommended;   //ignore recommended packages that have already been recommended by the installed packages
102     //@}
103
104     // Additional QueueItems which has to be regarded by the solver
105     // This will be used e.g. by solution actions
106     solver::detail::SolverQueueItemList _removed_queue_items;
107     solver::detail::SolverQueueItemList _added_queue_items;
108
109     // Additional information about the solverrun
110     ItemCapKindMap _isInstalledBy;
111     ItemCapKindMap _installs;
112     ItemCapKindMap _satifiedByInstalled;
113     ItemCapKindMap _installedSatisfied;
114
115     // helpers
116     void collectResolverInfo();
117
118     // Unmaintained packages which does not fit to the updated system
119     // (broken dependencies) will be deleted.
120     // returns true if solving was successful
121     bool checkUnmaintainedItems ();
122
123     void solverInit();
124
125   public:
126
127     Resolver( const ResPool & pool );
128     virtual ~Resolver();
129
130     // ---------------------------------- I/O
131
132     std::ostream & dumpOn( std::ostream & str ) const;
133
134     friend std::ostream& operator<<( std::ostream& str, const Resolver & obj )
135     { return obj.dumpOn (str); }
136
137     // ---------------------------------- methods
138
139     ResPool pool() const;
140     void setPool( const ResPool & pool ) { _pool = pool; }
141
142     void addUpgradeRepo( Repository repo_r )            { if ( repo_r && ! repo_r.isSystemRepo() ) _upgradeRepos.insert( repo_r ); }
143     bool upgradingRepo( Repository repo_r ) const       { return( _upgradeRepos.find( repo_r ) != _upgradeRepos.end() ); }
144     void removeUpgradeRepo( Repository repo_r )         { _upgradeRepos.erase( repo_r ); }
145     void removeUpgradeRepos()                           { _upgradeRepos.clear(); }
146     const std::set<Repository> & upgradeRepos() const   { return _upgradeRepos; }
147
148     void addExtraRequire( const Capability & capability );
149     void removeExtraRequire( const Capability & capability );
150     void addExtraConflict( const Capability & capability );
151     void removeExtraConflict( const Capability & capability );
152
153     void removeQueueItem( SolverQueueItem_Ptr item );
154     void addQueueItem( SolverQueueItem_Ptr item );
155
156     CapabilitySet extraRequires() const         { return _extra_requires; }
157     CapabilitySet extraConflicts() const        { return _extra_conflicts; }
158
159     void addWeak( const PoolItem & item );
160
161     bool verifySystem();
162     bool resolvePool();
163     bool resolveQueue( SolverQueueItemList & queue );
164     void doUpdate();
165
166     bool doUpgrade();
167     PoolItemList problematicUpdateItems() const;
168
169     /** \name Solver flags */
170     //@{
171     bool ignoreAlreadyRecommended() const       { return _ignoreAlreadyRecommended; }
172     void setIgnoreAlreadyRecommended( bool yesno_r ) { _ignoreAlreadyRecommended = yesno_r; }
173
174     bool onlyRequires () const                  { return _onlyRequires; }
175     void setOnlyRequires( TriBool state_r );
176
177     bool forceResolve() const                   { return _forceResolve; }
178     void setForceResolve( TriBool state_r )     { _forceResolve = indeterminate(state_r) ? false : bool(state_r); }
179
180     bool isUpgradeMode() const                  { return _upgradeMode; }// Resolver has been called with doUpgrade
181     void setUpgradeMode( bool yesno_r )         { _upgradeMode = yesno_r; }
182
183     bool isUpdateMode() const                   { return _updateMode; } // Resolver has been called with doUpdate
184
185     bool isVerifyingMode() const                { return _verifying; }  // The system will be checked
186     void setVerifyingMode( TriBool state_r )    { _verifying = indeterminate(state_r) ? false : bool(state_r); }
187
188     bool allowVendorChange() const              { return _allowVendorChange; }
189     void setAllowVendorChange( TriBool state_r );
190
191     bool solveSrcPackages() const               { return _solveSrcPackages; }
192     void setSolveSrcPackages( TriBool state_r ) { _solveSrcPackages = indeterminate(state_r) ? false : bool(state_r); }
193
194     bool cleandepsOnRemove() const              { return _cleandepsOnRemove; }
195     void setCleandepsOnRemove( TriBool state_r );
196     //@}
197
198 #define ZOLV_FLAG_TRIBOOL( ZSETTER, ZGETTER )   \
199     void ZSETTER( TriBool state_r );            \
200     bool ZGETTER() const;                       \
201
202     ZOLV_FLAG_TRIBOOL( dupSetAllowDowngrade,    dupAllowDowngrade )
203     ZOLV_FLAG_TRIBOOL( dupSetAllowNameChange,   dupAllowNameChange )
204     ZOLV_FLAG_TRIBOOL( dupSetAllowArchChange,   dupAllowArchChange )
205     ZOLV_FLAG_TRIBOOL( dupSetAllowVendorChange, dupAllowVendorChange )
206
207 #undef ZOLV_FLAG_TRIBOOL
208
209     ResolverProblemList problems() const;
210
211     void applySolutions( const ProblemSolutionList & solutions );
212     bool applySolution( const ProblemSolution & solution );
213
214     // Return the Transaction computed by the last solver run.
215     sat::Transaction getTransaction();
216
217     // reset all SOLVER transaction in pool
218     void undo();
219
220     void reset( bool keepExtras = false );
221
222     // Get more information about the solverrun
223     // Which item will be installed by another item or triggers an item for
224     // installation
225     ItemCapKindList isInstalledBy( const PoolItem & item );
226     ItemCapKindList installs( const PoolItem & item );
227     ItemCapKindList satifiedByInstalled (const PoolItem & item );
228     ItemCapKindList installedSatisfied( const PoolItem & item );
229
230 };
231
232 ///////////////////////////////////////////////////////////////////
233     };// namespace detail
234     /////////////////////////////////////////////////////////////////////
235     /////////////////////////////////////////////////////////////////////
236   };// namespace solver
237   ///////////////////////////////////////////////////////////////////////
238   ///////////////////////////////////////////////////////////////////////
239 };// namespace zypp
240 /////////////////////////////////////////////////////////////////////////
241 #endif // ZYPP_USE_RESOLVER_INTERNALS
242 #endif // ZYPP_SOLVER_DETAIL_RESOLVER_H