14 #include <boost/mpl/int.hpp>
16 #include <zypp/base/Easy.h>
17 #include <zypp/base/LogTools.h>
18 #include <zypp/base/Gettext.h>
19 #include <zypp/base/Exception.h>
23 #include <zypp/base/IOStream.h>
27 #include <zypp/sat/detail/PoolImpl.h>
49 #undef ZYPP_BASE_LOGGER_LOGGROUP
50 #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::satpool"
61 const char * envp = getenv(
"LIBSOLV_DEBUGMASK");
62 return envp ? str::strtonum<int>( envp ) : 0;
98 static const std::string _val(
"@System" );
104 static const Pathname _val(
"/etc/sysconfig/storage" );
110 static void logSat(
CPool *,
void *data,
int type,
const char *logString )
113 if ( 0 == strncmp( logString,
"job: user installed", 19 ) )
115 if ( 0 == strncmp( logString,
"job: multiversion", 17 ) )
117 if ( 0 == strncmp( logString,
" - no rule created", 19 ) )
119 if ( 0 == strncmp( logString,
" next rules: 0 0", 19 ) )
122 if ( type & (SOLV_FATAL|SOLV_ERROR) ) {
123 L_ERR(
"libsolv") << logString;
124 }
else if ( type & SOLV_DEBUG_STATS ) {
125 L_DBG(
"libsolv") << logString;
127 L_MIL(
"libsolv") << logString;
143 case NAMESPACE_LANGUAGE:
146 return localeIds.
contains(
IdString(rhs) ) ? RET_systemProperty : RET_unsupported;
150 case NAMESPACE_MODALIAS:
160 case NAMESPACE_FILESYSTEM:
170 return RET_unsupported;
190 : _pool( ::pool_create() )
192 MIL <<
"Creating sat-pool." << endl;
198 ::pool_setdisttype(
_pool, DISTTYPE_RPM );
207 if ( getenv(
"ZYPP_LIBSOLV_FULLLOG") || getenv(
"ZYPP_LIBSAT_FULLLOG") )
208 ::pool_setdebuglevel(
_pool, 3 );
209 else if ( getenv(
"ZYPP_FULLLOG") )
210 ::pool_setdebuglevel(
_pool, 2 );
212 ::pool_setdebugmask(
_pool, SOLV_DEBUG_JOB|SOLV_DEBUG_STATS );
219 _pool->nscallbackdata = (
void*)
this;
236 ::pool_free(
_pool );
252 if ( a3 )
MIL << a1 <<
" " << a2 <<
" " << a3 << endl;
253 else if ( a2 )
MIL << a1 <<
" " << a2 << endl;
254 else MIL << a1 << endl;
272 if ( a3 )
MIL << a1 <<
" " << a2 <<
" " << a3 << endl;
273 else if ( a2 )
MIL << a1 <<
" " << a2 << endl;
274 else MIL << a1 << endl;
284 if ( a3 )
MIL << a1 <<
" " << a2 <<
" " << a3 << endl;
285 else if ( a2 )
MIL << a1 <<
" " << a2 << endl;
286 else MIL << a1 << endl;
288 ::pool_freewhatprovides(
_pool );
306 if ( !
_pool->whatprovides )
308 MIL <<
"pool_createwhatprovides..." << endl;
310 ::pool_addfileprovides(
_pool );
311 ::pool_createwhatprovides(
_pool );
313 if ( !
_pool->languages )
324 setDirty(__FUNCTION__, name_r.c_str() );
325 CRepo * ret = ::repo_create(
_pool, name_r.c_str() );
327 ::pool_set_installed(
_pool, ret );
333 setDirty(__FUNCTION__, repo_r->name );
337 ::repo_free( repo_r,
false );
340 if ( !
_pool->urepos )
343 ::pool_freeallrepos(
_pool,
true );
349 setDirty(__FUNCTION__, repo_r->name );
350 int ret = ::repo_add_solv( repo_r, file_r, 0 );
358 setDirty(__FUNCTION__, repo_r->name );
367 setDirty(__FUNCTION__, repo_r->name );
379 std::set<detail::IdType> sysids;
382 for_( it, sysarchs.begin(), sysarchs.end() )
383 sysids.insert( it->id() );
386 sysids.insert( ARCH_SRC );
387 sysids.insert( ARCH_NOSRC );
391 unsigned blockSize = 0;
395 if ( s->repo == repo_r && sysids.find( s->arch ) == sysids.end() )
402 else if ( blockSize )
405 ::repo_free_solvable_block( repo_r, blockBegin, blockSize,
false );
406 blockBegin = blockSize = 0;
412 ::repo_free_solvable_block( repo_r, blockBegin, blockSize,
false );
413 blockBegin = blockSize = 0;
420 setDirty(__FUNCTION__, repo_r->name );
421 return ::repo_add_solvable_block( repo_r, count_r );
433 if ( repo->priority !=
int(-info_r.
priority()) )
435 repo->priority = -info_r.
priority();
442 if ( repo->subpriority != mediaPriority )
444 repo->subpriority = mediaPriority;
461 const char *needone[] {
"en" };
462 ::pool_set_languages(
_pool, needone, 1 );
466 std::vector<std::string> fallbacklist;
469 fallbacklist.push_back( l.code() );
471 dumpRangeLine(
MIL <<
"pool_set_languages: ", fallbacklist.begin(), fallbacklist.end() ) << endl;
473 std::vector<const char *> fallbacklist_cstr;
474 for_( it, fallbacklist.begin(), fallbacklist.end() )
476 fallbacklist_cstr.push_back( it->c_str() );
478 ::pool_set_languages(
_pool, &fallbacklist_cstr.front(), fallbacklist_cstr.size() );
534 if ( localesTracker.
wasAdded( lang ) )
536 for ( ; lang; lang = lang.fallback() )
543 for ( ; lang && localeIds.
current().insert(
IdString(lang) ).second; lang = lang.fallback() )
550 for ( ; lang && ! localeIds.
current().count(
IdString(lang) ); lang = lang.fallback() )
569 switch ( detail.
capRel() )
579 if ( detail.
lhs().
id() == NAMESPACE_LANGUAGE )
602 for (
const Capability & cap : pi.supplements() )
621 static const std::string prefix(
"provides:" );
626 if ( provides || solv.ident() == spec )
631 MIL <<
"Multiversion install " << spec <<
": " << (nsize-size) <<
" matches" << endl;
std::set< Arch, CompareByGT< Arch > > CompatSet
Reversed arch order, best Arch first.
static CompatSet compatSet(const Arch &targetArch_r)
Return a set of all Arch's compatibleWith a targetArch_r.
Helper providing more detailed information about a Capability.
sat::detail::IdType id() const
Expert backdoor.
Base class for Exception.
Access to the sat-pools string space.
'Language[_Country]' codes.
Locale fallback() const
Return the fallback locale for this locale, if no fallback exists the empty Locale::noCode.
std::string code() const
Return the locale code asString.
What is known about a repository.
Url url() const
Pars pro toto: The first repository url.
unsigned priority() const
Repository priority for solver.
bool remember(unsigned serial_r) const
Return isDirty, storing serial_r as new value.
Remember a files attributes to detect content changes.
Locale textLocale() const
The locale for translated texts zypp uses.
static ZConfig & instance()
Singleton ctor.
std::string alias() const
unique identifier for this source.
static Pool instance()
Singleton ctor.
void clear()
Clear the queue.
Solvable set wrapper to allow adding additional convenience iterators.
size_type size() const
Size of the set.
Container::size_type size_type
bool insert(const TSolv &solv_r)
Insert a Solvable.
bool contains(const TSolv &solv_r) const
bool addIdenticalInstalledToo() const
Extend the provides set to include idential installed items as well.
bool empty() const
Whether neither idents nor provides are set.
void setDirty() const
Explicitly flag the cache as dirty, so it will be rebuilt on the next request.
void addProvides(Capability provides_r)
A all sat::Solvable matching this provides_r.
A Solvable object within the sat Pool.
static const IdString ptfMasterToken
Indicator provides ptf()
static const IdString ptfPackageToken
Indicator provides ptf-package()
static const IdString retractedToken
Indicator provides retracted-patch-package()
Container of Solvable providing a Capability (read only).
sat::SolvableSpec _needrebootSpec
Solvables which should trigger the reboot-needed hint if installed/updated.
scoped_ptr< TrackedLocaleIds > _trackedLocaleIdsPtr
sat::SolvableSpec _retractedSpec
Blacklisted specs:
scoped_ptr< LocaleSet > _availableLocalesPtr
scoped_ptr< MultiversionList > _multiversionListPtr
bool isSystemRepo(CRepo *repo_r) const
static detail::IdType nsCallback(CPool *, void *data, detail::IdType lhs, detail::IdType rhs)
Callback to resolve namespace dependencies (language, modalias, filesystem, etc.).
void setTextLocale(const Locale &locale_r)
void initRequestedLocales(const LocaleSet &locales_r)
Start tracking changes based on this locales_r.
sat::StringQueue _autoinstalled
int _addTesttags(CRepo *repo_r, FILE *file_r)
Adding testtags file to a repo.
void multiversionListInit() const
const LocaleSet & getAvailableLocales() const
All Locales occurring in any repo.
std::map< RepoIdType, RepoInfo > _repoinfos
Additional RepoInfo.
void _deleteRepo(CRepo *repo_r)
Delete repo repo_r from pool.
bool eraseRequestedLocale(const Locale &locale_r)
User change (tracked).
sat::SolvableSpec _ptfMasterSpec
void eraseRepoInfo(RepoIdType id_r)
const TrackedLocaleIds & trackedLocaleIds() const
Expanded _requestedLocalesTracker for solver.
void localeSetDirty(const char *a1=0, const char *a2=0, const char *a3=0)
Invalidate locale related housekeeping data.
scoped_ptr< std::set< std::string > > _requiredFilesystemsPtr
filesystems mentioned in /etc/sysconfig/storage
base::SetTracker< LocaleSet > _requestedLocalesTracker
void setRequestedLocales(const LocaleSet &locales_r)
User change (tracked).
const MultiversionList & multiversionList() const
CRepo * _createRepo(const std::string &name_r)
Creating a new repo named name_r.
SerialNumberWatcher _watcher
Watch serial number.
SerialNumber _serial
Serial number - changes with each Pool content change.
const std::set< std::string > & requiredFilesystems() const
accessor for etc/sysconfig/storage reading file on demand
void _postRepoAdd(CRepo *repo_r)
Helper postprocessing the repo after adding solv or helix files.
bool addRequestedLocale(const Locale &locale_r)
User change (tracked).
int _addSolv(CRepo *repo_r, FILE *file_r)
Adding solv file to a repo.
CRepo * getRepo(RepoIdType id_r) const
int _addHelix(CRepo *repo_r, FILE *file_r)
Adding helix file to a repo.
sat::SolvableSpec _ptfPackageSpec
detail::SolvableIdType _addSolvables(CRepo *repo_r, unsigned count_r)
Adding Solvables to a repo.
SerialNumber _serialIDs
Serial number of IDs - changes whenever resusePoolIDs==true - ResPool must also invalidate it's PoolI...
bool isMultiversion(const Solvable &solv_r) const
void prepare() const
Update housekeeping data (e.g.
void multiversionSpecChanged()
static const std::string & systemRepoAlias()
Reserved system repository alias @System .
void setRepoInfo(RepoIdType id_r, const RepoInfo &info_r)
Also adjust repo priority and subpriority accordingly.
void setDirty(const char *a1=0, const char *a2=0, const char *a3=0)
Invalidate housekeeping data (e.g.
void depSetDirty(const char *a1=0, const char *a2=0, const char *a3=0)
Invalidate housekeeping data (e.g.
bool query(IdString cap_r) const
Checks if a device on the system matches a modalias pattern.
static Modalias & instance()
Singleton access.
std::map< std::string, std::string > read(const Pathname &_path)
Read sysconfig file path_r and return (key,valye) pairs.
static const IdType namespaceLanguage(20)
static const IdType solvablePrereqMarker(15)
Internal ids satlib includes in dependencies.
static void _getLocaleDeps(const Capability &cap_r, LocaleSet &store_r)
static const IdType solvableFileMarker(16)
static const IdType emptyId(1)
static const IdType namespaceModalias(18)
static const IdType namespaceFilesystem(21)
static const IdType noId(0)
static const SolvableIdType noSolvableId(0)
Id to denote Solvable::noSolvable.
BOOST_MPL_ASSERT_RELATION(noId,==, STRID_NULL)
::s_Repo CRepo
Wrapped libsolv C data type exposed as backdoor.
int IdType
Generic Id type.
::s_Solvable CSolvable
Wrapped libsolv C data type exposed as backdoor.
::s_Pool CPool
Wrapped libsolv C data type exposed as backdoor.
const Pathname & sysconfigStoragePath()
unsigned SolvableIdType
Id type to connect Solvable and sat-solvable.
static const SolvableIdType systemSolvableId(1)
Id to denote the usually hidden Solvable::systemSolvable.
CRepo * RepoIdType
Id type to connect Repo and sat-repo.
static void logSat(CPool *, void *data, int type, const char *logString)
std::string hexdecode(const C_Str &str_r)
Decode hexencoded XX sequences.
bool hasPrefix(const C_Str &str_r, const C_Str &prefix_r)
Return whether str_r has prefix prefix_r.
unsigned split(const C_Str &line_r, TOutputIterator result_r, const C_Str &sepchars_r=" \t", const Trim trim_r=NO_TRIM)
Split line_r into words.
Easy-to use interface to the ZYPP dependency resolver.
std::string asString(const DefaultIntegral< Tp, TInitial > &obj)
std::ostream & dumpRangeLine(std::ostream &str, TIterator begin, TIterator end)
Print range defined by iterators (single line style).
std::unordered_set< Locale > LocaleSet
int repo_add_helix(::Repo *repo, FILE *fp, int flags)
int testcase_add_testtags(Repo *repo, FILE *fp, int flags)
Track added/removed set items based on an initial set.
const set_type & removed() const
Return the set of removed items.
bool set(set_type new_r)
Set a new_r set and track changes.
bool add(const value_type &val_r)
Add an element to the set and track changes.
bool wasAdded(const key_type &key_r) const
Whether val_r is tracked as added.
bool remove(const value_type &val_r)
Remove an element from the set and track changes.
const set_type & added() const
Return the set of added items.
bool setInitial()
(Re-)Start tracking the current set (discards previously tracked changes).
const set_type & current() const
Return the current set.
bool contains(const key_type &key_r) const
Whether val_r is in the set.
static PoolImpl & myPool()
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.