#define ZYPP_SAT_DETAIL_POOLIMPL_H
extern "C"
{
-#include <satsolver/pool.h>
-#include <satsolver/repo.h>
-#include <satsolver/solvable.h>
-#include <satsolver/poolarch.h>
-#include <satsolver/repo_solv.h>
+#include <solv/pool.h>
+#include <solv/repo.h>
+#include <solv/solvable.h>
+#include <solv/poolarch.h>
+#include <solv/repo_solv.h>
}
#include <iosfwd>
-#include <tr1/unordered_set>
+#include "zypp/base/Hash.h"
#include "zypp/base/NonCopyable.h"
#include "zypp/base/SerialNumber.h"
+#include "zypp/base/SetTracker.h"
#include "zypp/sat/detail/PoolMember.h"
+#include "zypp/sat/Queue.h"
#include "zypp/RepoInfo.h"
#include "zypp/Locale.h"
+#include "zypp/Capability.h"
#include "zypp/IdString.h"
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
namespace sat
{ /////////////////////////////////////////////////////////////////
+ class SolvableSet;
///////////////////////////////////////////////////////////////////
namespace detail
{ /////////////////////////////////////////////////////////////////
~PoolImpl();
/** Pointer style access forwarded to sat-pool. */
- ::_Pool * operator->()
+ CPool * operator->()
{ return _pool; }
public:
*/
void setDirty( const char * a1 = 0, const char * a2 = 0, const char * a3 = 0 );
+ /** Invalidate locale related housekeeping data.
+ */
+ void localeSetDirty( const char * a1 = 0, const char * a2 = 0, const char * a3 = 0 );
+
/** Invalidate housekeeping data (e.g. whatprovides) if dependencies changed.
*/
void depSetDirty( const char * a1 = 0, const char * a2 = 0, const char * a3 = 0 );
- static detail::IdType nsCallback( ::_Pool *, void * data, detail::IdType lhs, detail::IdType rhs );
+ /** Callback to resolve namespace dependencies (language, modalias, filesystem, etc.). */
+ static detail::IdType nsCallback( CPool *, void * data, detail::IdType lhs, detail::IdType rhs );
+
+ public:
+ /** Reserved system repository alias \c @System. */
+ static const std::string & systemRepoAlias();
+
+ bool isSystemRepo( CRepo * repo_r ) const
+ { return repo_r && _pool->installed == repo_r; }
+
+ CRepo * systemRepo() const
+ { return _pool->installed; }
+
+ /** Get rootdir (for file conflicts check) */
+ Pathname rootDir() const
+ {
+ const char * rd = ::pool_get_rootdir( _pool );
+ return( rd ? rd : "/" );
+ }
+
+ /** Set rootdir (for file conflicts check) */
+ void rootDir( const Pathname & root_r )
+ {
+ if ( root_r.empty() || root_r == "/" )
+ ::pool_set_rootdir( _pool, nullptr );
+ else
+ ::pool_set_rootdir( _pool, root_r.c_str() );
+ }
public:
/** \name Actions invalidating housekeeping data.
*/
//@{
/** Creating a new repo named \a name_r. */
- RepoIdType _createRepo( const std::string & name_r )
- {
- setDirty(__FUNCTION__, name_r.c_str() );
- return ::repo_create( _pool, name_r.c_str() );
- }
+ CRepo * _createRepo( const std::string & name_r );
- /** Creating a new repo named \a name_r. */
- void _deleteRepo( ::_Repo * repo_r )
- {
- setDirty(__FUNCTION__, repo_r->name );
- ::repo_free( repo_r, /*reuseids*/false );
- eraseRepoInfo( repo_r );
- }
+ /** Delete repo \a repo_r from pool. */
+ void _deleteRepo( CRepo * repo_r );
+
+ /** Adding solv file to a repo.
+ * Except for \c isSystemRepo_r, solvables of incompatible architecture
+ * are filtered out.
+ */
+ int _addSolv( CRepo * repo_r, FILE * file_r );
- /** Adding solv file to a repo. */
- int _addSolv( ::_Repo * repo_r, FILE * file_r );
+ /** Adding helix file to a repo.
+ * Except for \c isSystemRepo_r, solvables of incompatible architecture
+ * are filtered out.
+ */
+ int _addHelix( CRepo * repo_r, FILE * file_r );
/** Adding Solvables to a repo. */
- detail::SolvableIdType _addSolvables( ::_Repo * repo_r, unsigned count_r )
- {
- setDirty(__FUNCTION__, repo_r->name );
- return ::repo_add_solvable_block( repo_r, count_r );
- }
+ detail::SolvableIdType _addSolvables( CRepo * repo_r, unsigned count_r );
//@}
+ /** Helper postprocessing the repo after adding solv or helix files. */
+ void _postRepoAdd( CRepo * repo_r );
+
public:
/** a \c valid \ref Solvable has a non NULL repo pointer. */
- bool validSolvable( const ::_Solvable & slv_r ) const
+ bool validSolvable( const CSolvable & slv_r ) const
{ return slv_r.repo; }
/** \overload Check also for id_r being in range of _pool->solvables. */
bool validSolvable( SolvableIdType id_r ) const
{ return id_r < unsigned(_pool->nsolvables) && validSolvable( _pool->solvables[id_r] ); }
/** \overload Check also for slv_r being in range of _pool->solvables. */
- bool validSolvable( const ::_Solvable * slv_r ) const
+ bool validSolvable( const CSolvable * slv_r ) const
{ return _pool->solvables <= slv_r && slv_r <= _pool->solvables+_pool->nsolvables && validSolvable( *slv_r ); }
public:
- ::_Pool * getPool() const
+ CPool * getPool() const
{ return _pool; }
/** \todo a quick check whether the repo was meanwhile deleted. */
- ::_Repo * getRepo( RepoIdType id_r ) const
+ CRepo * getRepo( RepoIdType id_r ) const
{ return id_r; }
/** Return pointer to the sat-solvable or NULL if it is not valid.
* \see \ref validSolvable.
*/
- ::_Solvable * getSolvable( SolvableIdType id_r ) const
+ CSolvable * getSolvable( SolvableIdType id_r ) const
{
if ( validSolvable( id_r ) )
return &_pool->solvables[id_r];
/** */
const RepoInfo & repoInfo( RepoIdType id_r )
{ return _repoinfos[id_r]; }
- /** */
- void setRepoInfo( RepoIdType id_r, const RepoInfo & info_r )
- { _repoinfos[id_r] = info_r; }
+ /** Also adjust repo priority and subpriority accordingly. */
+ void setRepoInfo( RepoIdType id_r, const RepoInfo & info_r );
/** */
void eraseRepoInfo( RepoIdType id_r )
{ _repoinfos.erase( id_r ); }
public:
- /** \name Requested locales. */
+ /** Returns the id stored at \c offset_r in the internal
+ * whatprovidesdata array.
+ */
+ const sat::detail::IdType whatProvidesData( unsigned offset_r )
+ { return _pool->whatprovidesdata[offset_r]; }
+
+ /** Returns offset into the internal whatprovidesdata array.
+ * Use \ref whatProvidesData to get the stored Id.
+ */
+ unsigned whatProvides( Capability cap_r )
+ { prepare(); return ::pool_whatprovides( _pool, cap_r.id() ); }
+
+ public:
+ /// \name Requested locales.
+ /// The requested LocaleSets managed in _requestedLocalesTracker
+ /// are unexpanded; i.e. they contain just the pure user selection.
+ /// The resolver however uses expanded sets ('de_DE' will also
+ /// include its fallback locales 'de', (en); here in the namespace:
+ /// callback and in the Resolver itself).
//@{
- void setRequestedLocales( const LocaleSet & locales_r );
- bool addRequestedLocale( const Locale & locale_r );
- bool eraseRequestedLocale( const Locale & locale_r );
+ /** */
+ void setTextLocale( const Locale & locale_r );
+
+
+ /** Start tracking changes based on this \a locales_r.
+ * Usually called on TargetInit.
+ */
+ void initRequestedLocales( const LocaleSet & locales_r );
+
+ /** Added since last initRequestedLocales. */
+ const LocaleSet & getAddedRequestedLocales() const
+ { return _requestedLocalesTracker.added(); }
+ /** Removed since last initRequestedLocales. */
+ const LocaleSet & getRemovedRequestedLocales() const
+ { return _requestedLocalesTracker.removed(); }
+
+ /** Current set of requested Locales. */
const LocaleSet & getRequestedLocales() const
- { return _requestedLocales; }
+ { return _requestedLocalesTracker.current(); }
bool isRequestedLocale( const Locale & locale_r ) const
- {
- LocaleSet::const_iterator it( _requestedLocales.find( locale_r ) );
- return it != _requestedLocales.end();
- }
+ { return _requestedLocalesTracker.contains( locale_r ); }
- const LocaleSet & getAvailableLocales() const
- {
- if ( _availableLocales.size() != _localeCollector.size() )
- {
- _availableLocales.clear();
- for_( it, _localeCollector.begin(), _localeCollector.end() )
- _availableLocales.insert( Locale( *it ) );
- }
- return _availableLocales;
- }
+ /** User change (tracked). */
+ void setRequestedLocales( const LocaleSet & locales_r );
+ /** User change (tracked). */
+ bool addRequestedLocale( const Locale & locale_r );
+ /** User change (tracked). */
+ bool eraseRequestedLocale( const Locale & locale_r );
+
+ /** All Locales occurring in any repo. */
+ const LocaleSet & getAvailableLocales() const;
bool isAvailableLocale( const Locale & locale_r ) const
{
return it != avl.end();
}
- //@}
+ typedef base::SetTracker<IdStringSet> TrackedLocaleIds;
+
+ /** Expanded _requestedLocalesTracker for solver.*/
+ const TrackedLocaleIds & trackedLocaleIds() const;
+ //@}
+
+ public:
+ /** \name Multiversion install. */
+ //@{
+ typedef SolvableSet MultiversionList;
+
+ const MultiversionList & multiversionList() const;
+
+ bool isMultiversion( const Solvable & solv_r ) const;
+
+ void multiversionSpecChanged();
+ //@}
+
+ public:
+ /** \name Installed on behalf of a user request hint. */
+ //@{
+ /** Get ident list of all autoinstalled solvables. */
+ StringQueue autoInstalled() const
+ { return _autoinstalled; }
+
+ /** Set ident list of all autoinstalled solvables. */
+ void setAutoInstalled( const StringQueue & autoInstalled_r )
+ { _autoinstalled = autoInstalled_r; }
+
+ bool isOnSystemByUser( IdString ident_r ) const
+ { return !_autoinstalled.contains( ident_r.id() ); }
+ //@}
+
+ public:
+ /** accessor for etc/sysconfig/storage reading file on demand */
+ const std::set<std::string> & requiredFilesystems() const;
private:
/** sat-pool. */
- ::_Pool * _pool;
+ CPool * _pool;
/** Serial number. */
SerialNumber _serial;
/** Watch serial number. */
std::map<RepoIdType,RepoInfo> _repoinfos;
/** */
- LocaleSet _requestedLocales;
- mutable LocaleSet _availableLocales;
- mutable std::tr1::unordered_set<IdString> _localeCollector;
- mutable std::tr1::unordered_set<IdString> _locale2Solver;
+ base::SetTracker<LocaleSet> _requestedLocalesTracker;
+ mutable scoped_ptr<TrackedLocaleIds> _trackedLocaleIdsPtr;
+
+ mutable scoped_ptr<LocaleSet> _availableLocalesPtr;
+
+ /** */
+ void multiversionListInit() const;
+ mutable scoped_ptr<MultiversionList> _multiversionListPtr;
+
+ /** */
+ sat::StringQueue _autoinstalled;
+
+ /** filesystems mentioned in /etc/sysconfig/storage */
+ mutable scoped_ptr<std::set<std::string> > _requiredFilesystemsPtr;
};
///////////////////////////////////////////////////////////////////