libzypp  17.27.0
PoolImpl.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #include <iostream>
13 #include <fstream>
14 #include <boost/mpl/int.hpp>
15 
16 #include <zypp/base/Easy.h>
17 #include <zypp/base/LogTools.h>
18 #include <zypp/base/Gettext.h>
19 #include <zypp/base/Exception.h>
20 #include <zypp/base/Measure.h>
21 #include <zypp/base/WatchFile.h>
22 #include <zypp/base/Sysconfig.h>
23 #include <zypp/base/IOStream.h>
24 
25 #include <zypp/ZConfig.h>
26 
27 #include <zypp/sat/detail/PoolImpl.h>
28 #include <zypp/sat/SolvableSet.h>
29 #include <zypp/sat/Pool.h>
30 #include <zypp/Capability.h>
31 #include <zypp/Locale.h>
32 #include <zypp/PoolItem.h>
33 
36 
37 extern "C"
38 {
39 // Workaround libsolv project not providing a common include
40 // directory. (the -devel package does, but the git repo doesn't).
41 // #include <solv/repo_helix.h>
42 // #include <solv/testcase.h>
43 int repo_add_helix( ::Repo *repo, FILE *fp, int flags );
44 int testcase_add_testtags(Repo *repo, FILE *fp, int flags);
45 }
46 
47 using std::endl;
48 
49 #undef ZYPP_BASE_LOGGER_LOGGROUP
50 #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::satpool"
51 
52 // ///////////////////////////////////////////////////////////////////
53 namespace zypp
54 {
56  namespace env
57  {
59  inline int LIBSOLV_DEBUGMASK()
60  {
61  const char * envp = getenv("LIBSOLV_DEBUGMASK");
62  return envp ? str::strtonum<int>( envp ) : 0;
63  }
64  } // namespace env
66  namespace sat
67  {
68 
70  namespace detail
71  {
72 
73  // MPL checks for satlib constants we redefine to avoid
74  // includes and defines.
75  BOOST_MPL_ASSERT_RELATION( noId, ==, STRID_NULL );
76  BOOST_MPL_ASSERT_RELATION( emptyId, ==, STRID_EMPTY );
77 
80 
81  BOOST_MPL_ASSERT_RELATION( solvablePrereqMarker, ==, SOLVABLE_PREREQMARKER );
82  BOOST_MPL_ASSERT_RELATION( solvableFileMarker, ==, SOLVABLE_FILEMARKER );
83 
89 
90  BOOST_MPL_ASSERT_RELATION( namespaceModalias, ==, NAMESPACE_MODALIAS );
91  BOOST_MPL_ASSERT_RELATION( namespaceLanguage, ==, NAMESPACE_LANGUAGE );
92  BOOST_MPL_ASSERT_RELATION( namespaceFilesystem, ==, NAMESPACE_FILESYSTEM );
93 
95 
96  const std::string & PoolImpl::systemRepoAlias()
97  {
98  static const std::string _val( "@System" );
99  return _val;
100  }
101 
103  {
104  static const Pathname _val( "/etc/sysconfig/storage" );
105  return _val;
106  }
107 
109 
110  static void logSat( CPool *, void *data, int type, const char *logString )
111  {
112  // "1234567890123456789012345678901234567890
113  if ( 0 == strncmp( logString, "job: user installed", 19 ) )
114  return;
115  if ( 0 == strncmp( logString, "job: multiversion", 17 ) )
116  return;
117  if ( 0 == strncmp( logString, " - no rule created", 19 ) )
118  return;
119  if ( 0 == strncmp( logString, " next rules: 0 0", 19 ) )
120  return;
121 
122  if ( type & (SOLV_FATAL|SOLV_ERROR) ) {
123  L_ERR("libsolv") << logString;
124  } else if ( type & SOLV_DEBUG_STATS ) {
125  L_DBG("libsolv") << logString;
126  } else {
127  L_MIL("libsolv") << logString;
128  }
129  }
130 
132  {
133  // lhs: the namespace identifier, e.g. NAMESPACE:MODALIAS
134  // rhs: the value, e.g. pci:v0000104Cd0000840[01]sv*sd*bc*sc*i*
135  // return: 0 if not supportded
136  // 1 if supported by the system
137  // -1 AFAIK it's also possible to return a list of solvables that support it, but don't know how.
138 
139  static const detail::IdType RET_unsupported = 0;
140  static const detail::IdType RET_systemProperty = 1;
141  switch ( lhs )
142  {
143  case NAMESPACE_LANGUAGE:
144  {
145  const TrackedLocaleIds & localeIds( reinterpret_cast<PoolImpl*>(data)->trackedLocaleIds() );
146  return localeIds.contains( IdString(rhs) ) ? RET_systemProperty : RET_unsupported;
147  }
148  break;
149 
150  case NAMESPACE_MODALIAS:
151  {
152  // modalias strings in capability may be hexencoded because rpm does not allow
153  // ',', ' ' or other special chars.
154  return target::Modalias::instance().query( str::hexdecode( IdString(rhs).c_str() ) )
155  ? RET_systemProperty
156  : RET_unsupported;
157  }
158  break;
159 
160  case NAMESPACE_FILESYSTEM:
161  {
162  const std::set<std::string> & requiredFilesystems( reinterpret_cast<PoolImpl*>(data)->requiredFilesystems() );
163  return requiredFilesystems.find( IdString(rhs).asString() ) != requiredFilesystems.end() ? RET_systemProperty : RET_unsupported;
164  }
165  break;
166 
167  }
168 
169  WAR << "Unhandled " << Capability( lhs ) << " vs. " << Capability( rhs ) << endl;
170  return RET_unsupported;
171  }
172 
174  //
175  // METHOD NAME : PoolMember::myPool
176  // METHOD TYPE : PoolImpl
177  //
179  {
180  static PoolImpl _global;
181  return _global;
182  }
183 
185  //
186  // METHOD NAME : PoolImpl::PoolImpl
187  // METHOD TYPE : Ctor
188  //
190  : _pool( ::pool_create() )
191  {
192  MIL << "Creating sat-pool." << endl;
193  if ( ! _pool )
194  {
195  ZYPP_THROW( Exception( _("Can not create sat-pool.") ) );
196  }
197  // by now we support only a RPM backend
198  ::pool_setdisttype(_pool, DISTTYPE_RPM );
199 
200  // initialialize logging
201  if ( env::LIBSOLV_DEBUGMASK() )
202  {
203  ::pool_setdebugmask(_pool, env::LIBSOLV_DEBUGMASK() );
204  }
205  else
206  {
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 );
211  else
212  ::pool_setdebugmask(_pool, SOLV_DEBUG_JOB|SOLV_DEBUG_STATS );
213  }
214 
215  ::pool_setdebugcallback( _pool, logSat, NULL );
216 
217  // set namespace callback
218  _pool->nscallback = &nsCallback;
219  _pool->nscallbackdata = (void*)this;
220 
221  // CAVEAT: We'd like to do it here, but in side the Pool ctor we can not
222  // yet use IdString types. We do in setDirty, when the 1st
223  // _retractedSpec.addProvides( Capability( Solvable::retractedToken.id() ) );
224  // _ptfMasterSpec.addProvides( Capability( Solvable::ptfMasterToken.id() ) );
225  // _ptfPackageSpec.addProvides( Capability( Solvable::ptfPackageToken.id() ) );
226  _retractedSpec.addIdenticalInstalledToo( true ); // retracted indicator is not part of the package!
227  }
228 
230  //
231  // METHOD NAME : PoolImpl::~PoolImpl
232  // METHOD TYPE : Dtor
233  //
235  {
236  ::pool_free( _pool );
237  }
238 
240 
241  void PoolImpl::setDirty( const char * a1, const char * a2, const char * a3 )
242  {
243  if ( _retractedSpec.empty() ) {
244  // lazy init IdString types we can not use inside the ctor
248  }
249 
250  if ( a1 )
251  {
252  if ( a3 ) MIL << a1 << " " << a2 << " " << a3 << endl;
253  else if ( a2 ) MIL << a1 << " " << a2 << endl;
254  else MIL << a1 << endl;
255  }
256  _serial.setDirty(); // pool content change
257  _availableLocalesPtr.reset(); // available locales may change
258  _multiversionListPtr.reset(); // re-evaluate ZConfig::multiversionSpec.
259  _needrebootSpec.setDirty(); // re-evaluate needrebootSpec
260 
261  _retractedSpec.setDirty(); // re-evaluate blacklisted spec
262  _ptfMasterSpec.setDirty(); // --"--
263  _ptfPackageSpec.setDirty(); // --"--
264 
265  depSetDirty(); // invaldate dependency/namespace related indices
266  }
267 
268  void PoolImpl::localeSetDirty( const char * a1, const char * a2, const char * a3 )
269  {
270  if ( a1 )
271  {
272  if ( a3 ) MIL << a1 << " " << a2 << " " << a3 << endl;
273  else if ( a2 ) MIL << a1 << " " << a2 << endl;
274  else MIL << a1 << endl;
275  }
276  _trackedLocaleIdsPtr.reset(); // requested locales changed
277  depSetDirty(); // invaldate dependency/namespace related indices
278  }
279 
280  void PoolImpl::depSetDirty( const char * a1, const char * a2, const char * a3 )
281  {
282  if ( a1 )
283  {
284  if ( a3 ) MIL << a1 << " " << a2 << " " << a3 << endl;
285  else if ( a2 ) MIL << a1 << " " << a2 << endl;
286  else MIL << a1 << endl;
287  }
288  ::pool_freewhatprovides( _pool );
289  }
290 
291  void PoolImpl::prepare() const
292  {
293  // additional /etc/sysconfig/storage check:
294  static WatchFile sysconfigFile( sysconfigStoragePath(), WatchFile::NO_INIT );
295  if ( sysconfigFile.hasChanged() )
296  {
297  _requiredFilesystemsPtr.reset(); // recreated on demand
298  const_cast<PoolImpl*>(this)->depSetDirty( "/etc/sysconfig/storage change" );
299  }
300  if ( _watcher.remember( _serial ) )
301  {
302  // After repo/solvable add/remove:
303  // set pool architecture
304  ::pool_setarch( _pool, ZConfig::instance().systemArchitecture().asString().c_str() );
305  }
306  if ( ! _pool->whatprovides )
307  {
308  MIL << "pool_createwhatprovides..." << endl;
309 
310  ::pool_addfileprovides( _pool );
311  ::pool_createwhatprovides( _pool );
312  }
313  if ( ! _pool->languages )
314  {
315  // initial seting
316  const_cast<PoolImpl*>(this)->setTextLocale( ZConfig::instance().textLocale() );
317  }
318  }
319 
321 
322  CRepo * PoolImpl::_createRepo( const std::string & name_r )
323  {
324  setDirty(__FUNCTION__, name_r.c_str() );
325  CRepo * ret = ::repo_create( _pool, name_r.c_str() );
326  if ( ret && name_r == systemRepoAlias() )
327  ::pool_set_installed( _pool, ret );
328  return ret;
329  }
330 
331  void PoolImpl::_deleteRepo( CRepo * repo_r )
332  {
333  setDirty(__FUNCTION__, repo_r->name );
334  if ( isSystemRepo( repo_r ) )
336  eraseRepoInfo( repo_r );
337  ::repo_free( repo_r, /*resusePoolIDs*/false );
338  // If the last repo is removed clear the pool to actually reuse all IDs.
339  // NOTE: the explicit ::repo_free above asserts all solvables are memset(0)!
340  if ( !_pool->urepos )
341  {
342  _serialIDs.setDirty(); // Indicate resusePoolIDs - ResPool must also invalidate it's PoolItems
343  ::pool_freeallrepos( _pool, /*resusePoolIDs*/true );
344  }
345  }
346 
347  int PoolImpl::_addSolv( CRepo * repo_r, FILE * file_r )
348  {
349  setDirty(__FUNCTION__, repo_r->name );
350  int ret = ::repo_add_solv( repo_r, file_r, 0 );
351  if ( ret == 0 )
352  _postRepoAdd( repo_r );
353  return ret;
354  }
355 
356  int PoolImpl::_addHelix( CRepo * repo_r, FILE * file_r )
357  {
358  setDirty(__FUNCTION__, repo_r->name );
359  int ret = ::repo_add_helix( repo_r, file_r, 0 );
360  if ( ret == 0 )
361  _postRepoAdd( repo_r );
362  return 0;
363  }
364 
365  int PoolImpl::_addTesttags(CRepo *repo_r, FILE *file_r)
366  {
367  setDirty(__FUNCTION__, repo_r->name );
368  int ret = ::testcase_add_testtags( repo_r, file_r, 0 );
369  if ( ret == 0 )
370  _postRepoAdd( repo_r );
371  return 0;
372  }
373 
374  void PoolImpl::_postRepoAdd( CRepo * repo_r )
375  {
376  if ( ! isSystemRepo( repo_r ) )
377  {
378  // Filter out unwanted archs
379  std::set<detail::IdType> sysids;
380  {
381  Arch::CompatSet sysarchs( Arch::compatSet( ZConfig::instance().systemArchitecture() ) );
382  for_( it, sysarchs.begin(), sysarchs.end() )
383  sysids.insert( it->id() );
384 
385  // unfortunately libsolv treats src/nosrc as architecture:
386  sysids.insert( ARCH_SRC );
387  sysids.insert( ARCH_NOSRC );
388  }
389 
390  detail::IdType blockBegin = 0;
391  unsigned blockSize = 0;
392  for ( detail::IdType i = repo_r->start; i < repo_r->end; ++i )
393  {
394  CSolvable * s( _pool->solvables + i );
395  if ( s->repo == repo_r && sysids.find( s->arch ) == sysids.end() )
396  {
397  // Remember an unwanted arch entry:
398  if ( ! blockBegin )
399  blockBegin = i;
400  ++blockSize;
401  }
402  else if ( blockSize )
403  {
404  // Free remembered entries
405  ::repo_free_solvable_block( repo_r, blockBegin, blockSize, /*resusePoolIDs*/false );
406  blockBegin = blockSize = 0;
407  }
408  }
409  if ( blockSize )
410  {
411  // Free remembered entries
412  ::repo_free_solvable_block( repo_r, blockBegin, blockSize, /*resusePoolIDs*/false );
413  blockBegin = blockSize = 0;
414  }
415  }
416  }
417 
419  {
420  setDirty(__FUNCTION__, repo_r->name );
421  return ::repo_add_solvable_block( repo_r, count_r );
422  }
423 
424  void PoolImpl::setRepoInfo( RepoIdType id_r, const RepoInfo & info_r )
425  {
426  CRepo * repo( getRepo( id_r ) );
427  if ( repo )
428  {
429  bool dirty = false;
430 
431  // libsolv priority is based on '<', while yum's repoinfo
432  // uses 1(highest)->99(lowest). Thus we use -info_r.priority.
433  if ( repo->priority != int(-info_r.priority()) )
434  {
435  repo->priority = -info_r.priority();
436  dirty = true;
437  }
438 
439  // subpriority is used to e.g. prefer http over dvd iff
440  // both have same priority.
441  int mediaPriority( media::MediaPriority( info_r.url() ) );
442  if ( repo->subpriority != mediaPriority )
443  {
444  repo->subpriority = mediaPriority;
445  dirty = true;
446  }
447 
448  if ( dirty )
449  setDirty(__FUNCTION__, info_r.alias().c_str() );
450  }
451  _repoinfos[id_r] = info_r;
452  }
453 
455 
456  void PoolImpl::setTextLocale( const Locale & locale_r )
457  {
458  if ( ! locale_r )
459  {
460  // We need one, so "en" is the last resort
461  const char *needone[] { "en" };
462  ::pool_set_languages( _pool, needone, 1 );
463  return;
464  }
465 
466  std::vector<std::string> fallbacklist;
467  for ( Locale l( locale_r ); l; l = l.fallback() )
468  {
469  fallbacklist.push_back( l.code() );
470  }
471  dumpRangeLine( MIL << "pool_set_languages: ", fallbacklist.begin(), fallbacklist.end() ) << endl;
472 
473  std::vector<const char *> fallbacklist_cstr;
474  for_( it, fallbacklist.begin(), fallbacklist.end() )
475  {
476  fallbacklist_cstr.push_back( it->c_str() );
477  }
478  ::pool_set_languages( _pool, &fallbacklist_cstr.front(), fallbacklist_cstr.size() );
479  }
480 
481  void PoolImpl::initRequestedLocales( const LocaleSet & locales_r )
482  {
483  if ( _requestedLocalesTracker.setInitial( locales_r ) )
484  {
485  localeSetDirty( "initRequestedLocales" );
486  MIL << "Init RequestedLocales: " << _requestedLocalesTracker << " =" << locales_r << endl;
487  }
488  }
489 
490  void PoolImpl::setRequestedLocales( const LocaleSet & locales_r )
491  {
492  if ( _requestedLocalesTracker.set( locales_r ) )
493  {
494  localeSetDirty( "setRequestedLocales" );
495  MIL << "New RequestedLocales: " << _requestedLocalesTracker << " =" << locales_r << endl;
496  }
497  }
498 
499  bool PoolImpl::addRequestedLocale( const Locale & locale_r )
500  {
501  bool done = _requestedLocalesTracker.add( locale_r );
502  if ( done )
503  {
504  localeSetDirty( "addRequestedLocale", locale_r.code().c_str() );
505  MIL << "New RequestedLocales: " << _requestedLocalesTracker << " +" << locale_r << endl;
506  }
507  return done;
508  }
509 
510  bool PoolImpl::eraseRequestedLocale( const Locale & locale_r )
511  {
512  bool done = _requestedLocalesTracker.remove( locale_r );
513  if ( done )
514  {
515  localeSetDirty( "addRequestedLocale", locale_r.code().c_str() );
516  MIL << "New RequestedLocales: " << _requestedLocalesTracker << " -" << locale_r << endl;
517  }
518  return done;
519  }
520 
521 
523  {
524  if ( ! _trackedLocaleIdsPtr )
525  {
527 
528  const base::SetTracker<LocaleSet> & localesTracker( _requestedLocalesTracker );
529  TrackedLocaleIds & localeIds( *_trackedLocaleIdsPtr );
530 
531  // Add current locales+fallback except for added ones
532  for ( Locale lang: localesTracker.current() )
533  {
534  if ( localesTracker.wasAdded( lang ) )
535  continue;
536  for ( ; lang; lang = lang.fallback() )
537  { localeIds.current().insert( IdString(lang) ); }
538  }
539 
540  // Add added locales+fallback except they are already in current
541  for ( Locale lang: localesTracker.added() )
542  {
543  for ( ; lang && localeIds.current().insert( IdString(lang) ).second; lang = lang.fallback() )
544  { localeIds.added().insert( IdString(lang) ); }
545  }
546 
547  // Add removed locales+fallback except they are still in current
548  for ( Locale lang: localesTracker.removed() )
549  {
550  for ( ; lang && ! localeIds.current().count( IdString(lang) ); lang = lang.fallback() )
551  { localeIds.removed().insert( IdString(lang) ); }
552  }
553 
554  // bsc#1155678: We try to differ between an empty RequestedLocales
555  // and one containing 'en' (explicit or as fallback). An empty RequestedLocales
556  // should not even drag in recommended 'en' packages. So we no longer enforce
557  // 'en' being in the set.
558  }
559  return *_trackedLocaleIdsPtr;
560  }
561 
562 
563  static void _getLocaleDeps( const Capability & cap_r, LocaleSet & store_r )
564  {
565  // Collect locales from any 'namespace:language(lang)' dependency
566  CapDetail detail( cap_r );
567  if ( detail.kind() == CapDetail::EXPRESSION )
568  {
569  switch ( detail.capRel() )
570  {
571  case CapDetail::CAP_AND:
572  case CapDetail::CAP_OR:
573  // expand
574  _getLocaleDeps( detail.lhs(), store_r );
575  _getLocaleDeps( detail.rhs(), store_r );
576  break;
577 
579  if ( detail.lhs().id() == NAMESPACE_LANGUAGE )
580  {
581  store_r.insert( Locale( IdString(detail.rhs().id()) ) );
582  }
583  break;
584 
585  case CapDetail::REL_NONE:
586  case CapDetail::CAP_WITH:
587  case CapDetail::CAP_ARCH:
588  break; // unwanted
589  }
590  }
591  }
592 
594  {
595  if ( !_availableLocalesPtr )
596  {
597  _availableLocalesPtr.reset( new LocaleSet );
598  LocaleSet & localeSet( *_availableLocalesPtr );
599 
600  for ( const Solvable & pi : Pool::instance().solvables() )
601  {
602  for ( const Capability & cap : pi.supplements() )
603  {
604  _getLocaleDeps( cap, localeSet );
605  }
606  }
607  }
608  return *_availableLocalesPtr;
609  }
610 
612 
614  {
617 
619  for ( const std::string & spec : ZConfig::instance().multiversionSpec() )
620  {
621  static const std::string prefix( "provides:" );
622  bool provides = str::hasPrefix( spec, prefix );
623 
624  for ( Solvable solv : WhatProvides( Capability( provides ? spec.c_str() + prefix.size() : spec.c_str() ) ) )
625  {
626  if ( provides || solv.ident() == spec )
627  multiversionList.insert( solv );
628  }
629 
631  MIL << "Multiversion install " << spec << ": " << (nsize-size) << " matches" << endl;
632  size = nsize;
633  }
634  }
635 
637  { _multiversionListPtr.reset(); }
638 
640  {
641  if ( ! _multiversionListPtr )
643  return *_multiversionListPtr;
644  }
645 
646  bool PoolImpl::isMultiversion( const Solvable & solv_r ) const
647  { return multiversionList().contains( solv_r ); }
648 
650 
651  const std::set<std::string> & PoolImpl::requiredFilesystems() const
652  {
653  if ( ! _requiredFilesystemsPtr )
654  {
655  _requiredFilesystemsPtr.reset( new std::set<std::string> );
656  std::set<std::string> & requiredFilesystems( *_requiredFilesystemsPtr );
658  std::inserter( requiredFilesystems, requiredFilesystems.end() ) );
659  }
660  return *_requiredFilesystemsPtr;
661  }
662 
664  } // namespace detail
667  } // namespace sat
670 } // namespace zypp
std::set< Arch, CompareByGT< Arch > > CompatSet
Reversed arch order, best Arch first.
Definition: Arch.h:117
static CompatSet compatSet(const Arch &targetArch_r)
Return a set of all Arch's compatibleWith a targetArch_r.
Definition: Arch.cc:554
Helper providing more detailed information about a Capability.
Definition: Capability.h:299
Capability rhs() const
Definition: Capability.h:354
Capability lhs() const
Definition: Capability.h:352
Kind kind() const
Definition: Capability.h:334
CapRel capRel() const
Definition: Capability.h:353
A sat capability.
Definition: Capability.h:60
sat::detail::IdType id() const
Expert backdoor.
Definition: Capability.h:253
Base class for Exception.
Definition: Exception.h:146
Access to the sat-pools string space.
Definition: IdString.h:43
'Language[_Country]' codes.
Definition: Locale.h:50
Locale fallback() const
Return the fallback locale for this locale, if no fallback exists the empty Locale::noCode.
Definition: Locale.cc:208
std::string code() const
Return the locale code asString.
Definition: Locale.h:88
What is known about a repository.
Definition: RepoInfo.h:72
Url url() const
Pars pro toto: The first repository url.
Definition: RepoInfo.h:131
unsigned priority() const
Repository priority for solver.
Definition: RepoInfo.cc:390
bool remember(unsigned serial_r) const
Return isDirty, storing serial_r as new value.
Definition: SerialNumber.h:160
Remember a files attributes to detect content changes.
Definition: WatchFile.h:50
bool hasChanged()
Definition: WatchFile.h:80
Locale textLocale() const
The locale for translated texts zypp uses.
Definition: ZConfig.cc:880
static ZConfig & instance()
Singleton ctor.
Definition: Resolver.cc:126
Derive a numeric priority from Url scheme according to zypp.conf(download.media_preference).
Definition: MediaPriority.h:44
std::string alias() const
unique identifier for this source.
static Pool instance()
Singleton ctor.
Definition: Pool.h:55
void clear()
Clear the queue.
Definition: Queue.cc:94
Solvable set wrapper to allow adding additional convenience iterators.
Definition: SolvableSet.h:36
size_type size() const
Size of the set.
Definition: SolvableSet.h:63
Container::size_type size_type
Definition: SolvableSet.h:42
bool insert(const TSolv &solv_r)
Insert a Solvable.
Definition: SolvableSet.h:88
bool contains(const TSolv &solv_r) const
Definition: SolvableSet.h:68
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.
Definition: Solvable.h:54
static const IdString ptfMasterToken
Indicator provides ptf()
Definition: Solvable.h:59
static const IdString ptfPackageToken
Indicator provides ptf-package()
Definition: Solvable.h:60
static const IdString retractedToken
Indicator provides retracted-patch-package()
Definition: Solvable.h:58
Container of Solvable providing a Capability (read only).
Definition: WhatProvides.h:89
sat::SolvableSpec _needrebootSpec
Solvables which should trigger the reboot-needed hint if installed/updated.
Definition: PoolImpl.h:374
scoped_ptr< TrackedLocaleIds > _trackedLocaleIdsPtr
Definition: PoolImpl.h:362
sat::SolvableSpec _retractedSpec
Blacklisted specs:
Definition: PoolImpl.h:377
scoped_ptr< LocaleSet > _availableLocalesPtr
Definition: PoolImpl.h:364
scoped_ptr< MultiversionList > _multiversionListPtr
Definition: PoolImpl.h:368
bool isSystemRepo(CRepo *repo_r) const
Definition: PoolImpl.h:100
static detail::IdType nsCallback(CPool *, void *data, detail::IdType lhs, detail::IdType rhs)
Callback to resolve namespace dependencies (language, modalias, filesystem, etc.).
Definition: PoolImpl.cc:131
void setTextLocale(const Locale &locale_r)
Definition: PoolImpl.cc:456
void initRequestedLocales(const LocaleSet &locales_r)
Start tracking changes based on this locales_r.
Definition: PoolImpl.cc:481
sat::StringQueue _autoinstalled
Definition: PoolImpl.h:371
int _addTesttags(CRepo *repo_r, FILE *file_r)
Adding testtags file to a repo.
Definition: PoolImpl.cc:365
void multiversionListInit() const
Definition: PoolImpl.cc:613
const LocaleSet & getAvailableLocales() const
All Locales occurring in any repo.
Definition: PoolImpl.cc:593
std::map< RepoIdType, RepoInfo > _repoinfos
Additional RepoInfo.
Definition: PoolImpl.h:358
void _deleteRepo(CRepo *repo_r)
Delete repo repo_r from pool.
Definition: PoolImpl.cc:331
bool eraseRequestedLocale(const Locale &locale_r)
User change (tracked).
Definition: PoolImpl.cc:510
sat::SolvableSpec _ptfMasterSpec
Definition: PoolImpl.h:378
void eraseRepoInfo(RepoIdType id_r)
Definition: PoolImpl.h:217
const TrackedLocaleIds & trackedLocaleIds() const
Expanded _requestedLocalesTracker for solver.
Definition: PoolImpl.cc:522
void localeSetDirty(const char *a1=0, const char *a2=0, const char *a3=0)
Invalidate locale related housekeeping data.
Definition: PoolImpl.cc:268
scoped_ptr< std::set< std::string > > _requiredFilesystemsPtr
filesystems mentioned in /etc/sysconfig/storage
Definition: PoolImpl.h:382
base::SetTracker< LocaleSet > _requestedLocalesTracker
Definition: PoolImpl.h:361
void setRequestedLocales(const LocaleSet &locales_r)
User change (tracked).
Definition: PoolImpl.cc:490
const MultiversionList & multiversionList() const
Definition: PoolImpl.cc:639
CRepo * _createRepo(const std::string &name_r)
Creating a new repo named name_r.
Definition: PoolImpl.cc:322
SerialNumberWatcher _watcher
Watch serial number.
Definition: PoolImpl.h:356
SerialNumber _serial
Serial number - changes with each Pool content change.
Definition: PoolImpl.h:352
const std::set< std::string > & requiredFilesystems() const
accessor for etc/sysconfig/storage reading file on demand
Definition: PoolImpl.cc:651
void _postRepoAdd(CRepo *repo_r)
Helper postprocessing the repo after adding solv or helix files.
Definition: PoolImpl.cc:374
bool addRequestedLocale(const Locale &locale_r)
User change (tracked).
Definition: PoolImpl.cc:499
int _addSolv(CRepo *repo_r, FILE *file_r)
Adding solv file to a repo.
Definition: PoolImpl.cc:347
CRepo * getRepo(RepoIdType id_r) const
Definition: PoolImpl.h:175
int _addHelix(CRepo *repo_r, FILE *file_r)
Adding helix file to a repo.
Definition: PoolImpl.cc:356
sat::SolvableSpec _ptfPackageSpec
Definition: PoolImpl.h:379
detail::SolvableIdType _addSolvables(CRepo *repo_r, unsigned count_r)
Adding Solvables to a repo.
Definition: PoolImpl.cc:418
SerialNumber _serialIDs
Serial number of IDs - changes whenever resusePoolIDs==true - ResPool must also invalidate it's PoolI...
Definition: PoolImpl.h:354
bool isMultiversion(const Solvable &solv_r) const
Definition: PoolImpl.cc:646
void prepare() const
Update housekeeping data (e.g.
Definition: PoolImpl.cc:291
static const std::string & systemRepoAlias()
Reserved system repository alias @System .
Definition: PoolImpl.cc:96
CPool * _pool
sat-pool.
Definition: PoolImpl.h:350
void setRepoInfo(RepoIdType id_r, const RepoInfo &info_r)
Also adjust repo priority and subpriority accordingly.
Definition: PoolImpl.cc:424
void setDirty(const char *a1=0, const char *a2=0, const char *a3=0)
Invalidate housekeeping data (e.g.
Definition: PoolImpl.cc:241
PoolImpl()
Default ctor.
Definition: PoolImpl.cc:189
void depSetDirty(const char *a1=0, const char *a2=0, const char *a3=0)
Invalidate housekeeping data (e.g.
Definition: PoolImpl.cc:280
bool query(IdString cap_r) const
Checks if a device on the system matches a modalias pattern.
Definition: Modalias.h:69
static Modalias & instance()
Singleton access.
Definition: Modalias.cc:219
std::map< std::string, std::string > read(const Pathname &_path)
Read sysconfig file path_r and return (key,valye) pairs.
Definition: Sysconfig.cc:34
int LIBSOLV_DEBUGMASK()
Definition: PoolImpl.cc:59
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)
Definition: PoolImpl.cc:563
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.
Definition: PoolMember.h:63
int IdType
Generic Id type.
Definition: PoolMember.h:104
::s_Solvable CSolvable
Wrapped libsolv C data type exposed as backdoor.
Definition: PoolMember.h:64
::s_Pool CPool
Wrapped libsolv C data type exposed as backdoor.
Definition: PoolMember.h:61
const Pathname & sysconfigStoragePath()
Definition: PoolImpl.cc:102
unsigned SolvableIdType
Id type to connect Solvable and sat-solvable.
Definition: PoolMember.h:125
static const SolvableIdType systemSolvableId(1)
Id to denote the usually hidden Solvable::systemSolvable.
CRepo * RepoIdType
Id type to connect Repo and sat-repo.
Definition: PoolMember.h:133
static void logSat(CPool *, void *data, int type, const char *logString)
Definition: PoolImpl.cc:110
std::string hexdecode(const C_Str &str_r)
Decode hexencoded XX sequences.
Definition: String.cc:145
bool hasPrefix(const C_Str &str_r, const C_Str &prefix_r)
Return whether str_r has prefix prefix_r.
Definition: String.h:1027
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.
Definition: String.h:531
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:2
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).
Definition: LogTools.h:114
std::unordered_set< Locale > LocaleSet
Definition: Locale.h:27
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.
Definition: SetTracker.h:38
const set_type & removed() const
Return the set of removed items.
Definition: SetTracker.h:145
bool set(set_type new_r)
Set a new_r set and track changes.
Definition: SetTracker.h:78
bool add(const value_type &val_r)
Add an element to the set and track changes.
Definition: SetTracker.h:100
bool wasAdded(const key_type &key_r) const
Whether val_r is tracked as added.
Definition: SetTracker.h:132
bool remove(const value_type &val_r)
Remove an element from the set and track changes.
Definition: SetTracker.h:114
const set_type & added() const
Return the set of added items.
Definition: SetTracker.h:142
bool setInitial()
(Re-)Start tracking the current set (discards previously tracked changes).
Definition: SetTracker.h:57
const set_type & current() const
Return the current set.
Definition: SetTracker.h:139
bool contains(const key_type &key_r) const
Whether val_r is in the set.
Definition: SetTracker.h:129
static PoolImpl & myPool()
Definition: PoolImpl.cc:178
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Definition: Easy.h:28
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Definition: Exception.h:392
#define _(MSG)
Definition: Gettext.h:37
#define L_ERR(GROUP)
Definition: Logger.h:107
#define MIL
Definition: Logger.h:96
#define WAR
Definition: Logger.h:97
#define L_MIL(GROUP)
Definition: Logger.h:105
#define L_DBG(GROUP)
Definition: Logger.h:104