1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
4 * Copyright (C) 2000-2002 Ximian, Inc.
5 * Copyright (C) 2005 SUSE Linux Products GmbH
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.
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.
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
21 #include <boost/static_assert.hpp>
23 #include "zypp/solver/detail/Resolver.h"
24 #include "zypp/solver/detail/Helper.h"
25 #include "zypp/solver/detail/Testcase.h"
27 #include "zypp/Capabilities.h"
28 #include "zypp/base/Logger.h"
29 #include "zypp/base/String.h"
30 #include "zypp/base/Gettext.h"
31 #include "zypp/base/Algorithm.h"
32 #include "zypp/ResPool.h"
33 #include "zypp/ResFilters.h"
34 #include "zypp/CapFilters.h"
35 #include "zypp/sat/Pool.h"
36 #include "zypp/sat/Solvable.h"
37 #include "zypp/sat/SATResolver.h"
39 /////////////////////////////////////////////////////////////////////////
41 { ///////////////////////////////////////////////////////////////////////
42 ///////////////////////////////////////////////////////////////////////
44 { /////////////////////////////////////////////////////////////////////
45 /////////////////////////////////////////////////////////////////////
47 { ///////////////////////////////////////////////////////////////////
51 IMPL_PTR_TYPE(Resolver);
54 //---------------------------------------------------------------------------
58 Resolver::dumpOn( std::ostream & os ) const
60 return os << "<resolver/>";
64 //---------------------------------------------------------------------------
66 Resolver::Resolver (const ResPool & pool)
69 , _poolchanged(_pool.serial() )
70 , _forceResolve(false)
75 Testcase testcase("/var/log/YaST2/autoTestcase");
76 sat::Pool satPool( sat::Pool::instance() );
77 _satResolver = new SATResolver(_pool, satPool.get());
78 testcase.createTestcase (*this, true, false); // create pool, do not solver
86 //---------------------------------------------------------------------------
89 Resolver::pool (void) const
95 Resolver::reset (bool keepExtras )
100 _extra_requires.clear();
101 _extra_conflicts.clear();
106 Resolver::addExtraRequire (const Capability & capability)
108 _extra_requires.insert (capability);
112 Resolver::removeExtraRequire (const Capability & capability)
114 _extra_requires.erase (capability);
118 Resolver::addExtraConflict (const Capability & capability)
120 _extra_conflicts.insert (capability);
124 Resolver::removeExtraConflict (const Capability & capability)
126 _extra_conflicts.erase (capability);
130 Resolver::addIgnoreConflict (const PoolItem item,
131 const Capability & capability)
133 _ignoreConflicts.insert(make_pair(item, capability));
137 Resolver::addIgnoreRequires (const PoolItem item,
138 const Capability & capability)
140 _ignoreRequires.insert(make_pair(item, capability));
144 Resolver::addIgnoreObsoletes (const PoolItem item,
145 const Capability & capability)
147 _ignoreObsoletes.insert(make_pair(item, capability));
151 Resolver::addIgnoreInstalledItem (const PoolItem item)
153 _ignoreInstalledItem.push_back (item);
157 Resolver::addIgnoreArchitectureItem (const PoolItem item)
159 _ignoreArchitectureItem.push_back (item);
163 Resolver::addIgnoreVendorItem (const PoolItem item)
165 _ignoreVendorItem.push_back (item);
168 //---------------------------------------------------------------------------
170 struct UndoTransact : public resfilter::PoolItemFilterFunctor
172 ResStatus::TransactByValue resStatus;
173 UndoTransact ( const ResStatus::TransactByValue &status)
177 bool operator()( PoolItem item ) // only transacts() items go here
179 item.status().resetTransact( resStatus );// clear any solver/establish transactions
185 struct DoTransact : public resfilter::PoolItemFilterFunctor
187 ResStatus::TransactByValue resStatus;
188 DoTransact ( const ResStatus::TransactByValue &status)
192 bool operator()( PoolItem item ) // only transacts() items go here
194 item.status().setTransact( true, resStatus );
201 Resolver::verifySystem ()
203 UndoTransact resetting (ResStatus::APPL_HIGH);
205 _DEBUG ("Resolver::verifySystem() ");
209 invokeOnEach ( _pool.begin(), _pool.end(),
210 resfilter::ByTransact( ), // Resetting all transcations
211 functor::functorRef<bool,PoolItem>(resetting) );
213 return resolvePool();
217 //----------------------------------------------------------------------------
223 UndoTransact info(ResStatus::APPL_LOW);
224 MIL << "*** undo ***" << endl;
225 invokeOnEach ( _pool.begin(), _pool.end(),
226 resfilter::ByTransact( ), // collect transacts from Pool to resolver queue
227 functor::functorRef<bool,PoolItem>(info) );
228 // These conflict should be ignored of the concering item
229 _ignoreConflicts.clear();
230 // These requires should be ignored of the concering item
231 _ignoreRequires.clear();
232 // These obsoletes should be ignored of the concering item
233 _ignoreObsoletes.clear();
234 // Ignore architecture of the item
235 _ignoreArchitecture.clear();
236 // Ignore the status "installed" of the item
237 _ignoreInstalledItem.clear();
238 // Ignore the architecture of the item
239 _ignoreArchitectureItem.clear();
240 // Ignore the vendor of the item
241 _ignoreVendorItem.clear();
249 Resolver::resolvePool()
252 // Solving with the satsolver
253 MIL << "-------------- Calling SAT Solver -------------------" << endl;
254 Testcase testcase("/var/log/YaST2/autoTestcase");
255 testcase.createTestcase (*this, false, false); // write control file only
258 MIL << "------SAT-Pool------" << endl;
259 for (sat::Pool::SolvableIterator i = satPool.solvablesBegin();
260 i != satPool.solvablesEnd(); i++ ) {
261 MIL << *i << " ID: " << i->id() << endl;
263 MIL << "------SAT-Pool end------" << endl;
265 _satResolver->setFixsystem(false);
266 _satResolver->setAllowdowngrade(false);
267 _satResolver->setAllowarchchange(false);
268 _satResolver->setAllowvendorchange(false);
269 _satResolver->setAllowuninstall(false);
270 _satResolver->setUpdatesystem(false);
271 _satResolver->setAllowvirtualconflicts(false);
272 _satResolver->setNoupdateprovide(true);
273 _satResolver->setDosplitprovides(false);
276 _satResolver->setAllowdowngrade(true);
277 _satResolver->setAllowarchchange(true);
278 _satResolver->setUpdatesystem(true);
279 _satResolver->setDosplitprovides(true);
283 _satResolver->setAllowuninstall(true);
286 _satResolver->setFixsystem(true);
288 return _satResolver->resolvePool(_extra_requires, _extra_conflicts);
292 ///////////////////////////////////////////////////////////////////
293 };// namespace detail
294 /////////////////////////////////////////////////////////////////////
295 /////////////////////////////////////////////////////////////////////
296 };// namespace solver
297 ///////////////////////////////////////////////////////////////////////
298 ///////////////////////////////////////////////////////////////////////
300 /////////////////////////////////////////////////////////////////////////