libzypp 17.38.15
SATResolver.h
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
2/* SATResolver.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_SAT_RESOLVER_H
23#define ZYPP_SOLVER_DETAIL_SAT_RESOLVER_H
24#ifndef ZYPP_USE_RESOLVER_INTERNALS
25#error Do not directly include this file!
26#else
27extern "C"
28{
29#include <solv/solver.h>
30#include <solv/pool.h>
31}
32
33#include <iosfwd>
34#include <list>
35#include <map>
36#include <string>
37
38#include <zypp/solver/Types.h>
39
41namespace zypp
42{
43
44 namespace sat
45 {
46 class Transaction;
47 }
48
50 namespace solver
51 {
53 namespace detail
54 {
55
56
58//
59// CLASS NAME : SATResolver
65class SATResolver : public base::ReferenceCounted, private base::NonCopyable, private sat::detail::PoolMember
66{
67
68 private:
69 ResPool _pool;
70 sat::detail::CPool *_satPool;
71 sat::detail::CSolver *_satSolver;
72 sat::detail::CQueue _jobQueue;
73
74 // list of problematic items (orphaned)
75 PoolItemList _problem_items;
76
77 // list populated by calls to addPoolItemTo*()
78 PoolItemList _items_to_install;
79 PoolItemList _items_to_remove;
80 PoolItemList _items_to_lock;
81 PoolItemList _items_to_keep;
82
83 // solve results
84 PoolItemList _result_items_to_install;
85 PoolItemList _result_items_to_remove;
86
87 public:
88 ResolverFocus _focus; // The resolver's general attitude
89
90 bool _fixsystem:1; // repair errors in rpm dependency graph
91 bool _allowdowngrade:1; // allow one to downgrade installed solvable
92 bool _allownamechange:1; // allow one to change name of installed solvable
93 bool _allowarchchange:1; // allow one to change architecture of installed solvables
94 bool _allowvendorchange:1; // allow one to change vendor of installed solvables
95 bool _allowuninstall:1; // allow removal of installed solvables
96 bool _updatesystem:1; // update
97 bool _noUpdateProvide:1; // true: do not prefer update candidates also providing the old package
98 bool _dosplitprovides:1; // true: consider legacy split provides
99 bool _onlyRequires:1; // true: consider required packages only (but recommended namespaces)
100 bool _ignorealreadyrecommended:1; // true: ignore recommended packages that were already recommended by the installed packages
101 bool _distupgrade:1;
102 bool _removeOrphaned:1;
103 bool _removeUnneeded:1;
104 bool _dup_allowdowngrade:1; // dup mode: allow one to downgrade installed solvable
105 bool _dup_allownamechange:1; // dup mode: allow one to change name of installed solvable
106 bool _dup_allowarchchange:1; // dup mode: allow one to change architecture of installed solvables
107 bool _dup_allowvendorchange:1; // dup mode: allow one to change vendor of installed solvables
108 bool _solveSrcPackages:1; // false: generate no job rule for source packages selected in the pool
109 bool _cleandepsOnRemove:1; // whether removing a package should also remove no longer needed requirements
110
111 private:
112 bool _protectPTFs:1; // protect from accidental removal of PTFs if only @System is present (bsc#1203248)
113
114 // ---------------------------------- methods
115 std::string SATproblemRuleInfoString (Id rule, std::string &detail, Id &ignoreId);
116 std::vector<std::string> SATgetCompleteProblemInfoStrings ( Id problem, std::string &detail, Id &ignoreId );
117 void resetItemTransaction (PoolItem item);
118
119 // Create a SAT solver and
120 void solverInit(const PoolItemList & weakItems);
121 void solverInitSetLocks();
122 void solverInitSetSystemRequirements();
123 void solverInitSetModeJobsAndFlags();
124
125 void solverAddJobsFromPool();
126 void solverAddJobsFromExtraQueues( const CapabilitySet & requires_caps, const CapabilitySet & conflict_caps );
127
128 // common solver run with the _jobQueue; Save results back to pool
129 bool solving(const CapabilitySet & requires_caps = CapabilitySet(),
130 const CapabilitySet & conflict_caps = CapabilitySet());
131 // cleanup solver
132 void solverEnd();
133
134 // Checking if this solvable/item has a buddy which reflect the real
135 // user visible description of an item
136 // e.g. The release package has a buddy to the concerning product item.
137 // This user want's the message "Product foo conflicts with product bar" and
138 // NOT "package release-foo conflicts with package release-bar"
139 // So these functions return the concerning buddy (e.g. product item)
140 sat::Solvable mapSolvable (const Id &id);
141 PoolItem mapItem (const PoolItem &item);
142
143 public:
144
145 SATResolver (ResPool pool, sat::detail::CPool *satPool);
146 virtual ~SATResolver();
147
148 // ---------------------------------- I/O
149
150 virtual std::ostream & dumpOn( std::ostream & str ) const;
151 friend std::ostream& operator<<(std::ostream& str, const SATResolver & obj)
152 { return obj.dumpOn (str); }
153
154 ResPool pool (void) const;
155 void setPool (const ResPool & pool) { _pool = pool; }
156
157 // solver run with pool selected items
158 bool resolvePool(const CapabilitySet & requires_caps,
159 const CapabilitySet & conflict_caps,
160 const PoolItemList & weakItems,
161 const std::set<Repository> & upgradeRepos
162 );
163 // solver run with the given request queue
164 bool resolveQueue(const SolverQueueItemList &requestQueue,
165 const PoolItemList & weakItems
166 );
167 // searching for new packages
168 void doUpdate();
169
170 ResolverProblemList problems ();
171 void applySolutions (const ProblemSolutionList &solutions);
172
173 bool fixsystem () const {return _fixsystem;}
174 void setFixsystem ( const bool fixsystem) { _fixsystem = fixsystem;}
175
176 bool ignorealreadyrecommended () const {return _ignorealreadyrecommended;}
177 void setIgnorealreadyrecommended ( const bool ignorealreadyrecommended) { _ignorealreadyrecommended = ignorealreadyrecommended;}
178
179 bool distupgrade () const {return _distupgrade;}
180 void setDistupgrade ( const bool distupgrade) { _distupgrade = distupgrade;}
181
182 bool removeOrphaned () const {return _removeOrphaned;}
183 void setRemoveOrphaned ( const bool removeOrphaned) { _removeOrphaned = removeOrphaned;}
184
185 bool allowdowngrade () const {return _allowdowngrade;}
186 void setAllowdowngrade ( const bool allowdowngrade) { _allowdowngrade = allowdowngrade;}
187
188 bool allowarchchange () const {return _allowarchchange;}
189 void setAllowarchchange ( const bool allowarchchange) { _allowarchchange = allowarchchange;}
190
191 bool allowvendorchange () const {return _allowvendorchange;}
192 void setAllowvendorchange ( const bool allowvendorchange) { _allowvendorchange = allowvendorchange;}
193
194 bool allowuninstall () const {return _allowuninstall;}
195 void setAllowuninstall ( const bool allowuninstall) { _allowuninstall = allowuninstall;}
196
197 bool updatesystem () const {return _updatesystem;}
198 void setUpdatesystem ( const bool updatesystem) { _updatesystem = updatesystem;}
199
200 bool noUpdateProvide () const {return _noUpdateProvide;}
201 void setNoUpdateProvide ( const bool noUpdateProvide) { _noUpdateProvide = noUpdateProvide;}
202
203 bool dosplitprovides () const {return _dosplitprovides;}
204 void setDosplitprovides ( const bool dosplitprovides) { _dosplitprovides = dosplitprovides;}
205
206 bool onlyRequires () const {return _onlyRequires;}
207 void setOnlyRequires ( const bool onlyRequires) { _onlyRequires = onlyRequires;}
208
209 bool solveSrcPackages() const { return _solveSrcPackages; }
210 void setSolveSrcPackages( bool state_r ) { _solveSrcPackages = state_r; }
211
212 bool cleandepsOnRemove() const { return _cleandepsOnRemove; }
213 void setCleandepsOnRemove( bool state_r ) { _cleandepsOnRemove = state_r; }
214
215 PoolItemList problematicUpdateItems( void ) const { return _problem_items; }
216 PoolItemList problematicUpdateItems() { return _problem_items; }
217
218 PoolItemList resultItemsToInstall () { return _result_items_to_install; }
219 PoolItemList resultItemsToRemove () { return _result_items_to_remove; }
220
221 sat::StringQueue autoInstalled() const;
222 sat::StringQueue userInstalled() const;
223
224public:
226 sat::detail::CSolver * get() const { return _satSolver; }
227};
228
230 };// namespace detail
233 };// namespace solver
236};// namespace zypp
238#endif // ZYPP_USE_RESOLVER_INTERNALS
239#endif // ZYPP_SOLVER_DETAIL_SAT_RESOLVER_H
std::ostream & operator<<(std::ostream &str, const zypp::sat::detail::CDataiterator *obj)
relates: zypp::sat::LookupAttr::iterator Stream output of the underlying iterator for debug.
Common types used in the Resolver public API and need to be passed down to the details tree.
Libsolv transaction wrapper.
Definition Transaction.h:52
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Definition NonCopyable.h:26
Libsolv interface
Easy-to use interface to the ZYPP dependency resolver.
ResolverFocus
The resolver's general attitude.
std::list< ResolverProblem_Ptr > ResolverProblemList
std::unordered_set< Capability > CapabilitySet
Definition Capability.h:35
std::ostream & dumpOn(std::ostream &str, const Capability &obj)
relates: Capability Detailed stream output