43 void _doSplit( IdString & _ident, ResKind & _kind, IdString & _name )
57 _ident = IdString(
str::form(
"%s:%s", _kind.c_str(), _ident.c_str() ) );
62 _name = IdString( ::strchr( _ident.c_str(),
':' )+1 );
74 { _doSplit( _ident, _kind, _name ); }
78 { _doSplit( _ident, _kind, _name ); }
82 { _doSplit( _ident, _kind, _name ); }
87 { _doSplit( _ident, _kind, _name ); }
92 { _doSplit( _ident, _kind, _name ); }
105 #define NO_SOLVABLE_RETURN( VAL ) \
106 detail::CSolvable * _solvable( get() ); \
107 if ( ! _solvable ) return VAL
118 if ( nextS && nextS->repo == _solvable->repo )
129 const char * s = ::solvable_lookup_str( _solvable, attr.
id() );
130 return s ? s : std::string();
139 s = ::solvable_lookup_str_poollang( _solvable, attr.
id() );
145 if ( (s = ::solvable_lookup_str_lang( _solvable, attr.
id(), l.c_str(), 0 )) )
149 s = ::solvable_lookup_str_lang( _solvable, attr.
id(), 0, 0 );
151 return s ? s : std::string();
157 return ::solvable_lookup_num( _solvable, attr.
id(), 0 );
163 return ::solvable_lookup_num( _solvable, attr.
id(), notfound_r );
169 return ::solvable_lookup_bool( _solvable, attr.
id() );
175 return ::solvable_lookup_id( _solvable, attr.
id() );
182 const char * s = ::solvable_lookup_checksum( _solvable, attr.
id(), &chksumtype );
185 switch ( chksumtype )
194 return CheckSum( std::string(), s );
200 inline Pathname lookupDatadirIn(
Repository repor_r )
202 static const SolvAttr susetagsDatadir(
"susetags:datadir" );
207 if ( ! datadir.empty() )
208 ret = datadir.begin().asString();
211 LookupAttr datadir( susetagsDatadir, repor_r );
212 if ( ! datadir.empty() )
213 ret = datadir.begin().asString();
225 const char * file = ::solvable_lookup_location( _solvable, &medianr );
234 switch (
repository().info().type().toEnum() )
239 if ( ! path.empty() )
275 switch ( _solvable->arch )
290 const char * sep = ::strchr( ident,
':' );
295 return ResKind( std::string( ident, sep-ident ) );
303 switch ( _solvable->arch )
315 return( ::strchr( ident,
':' ) == 0 );
320 unsigned ksize = ::strlen( kind );
321 return( ::strncmp( ident, kind, ksize ) == 0
322 && ident[ksize] ==
':' );
329 const char * sep = ::strchr( ident,
':' );
330 return( sep ? sep+1 : ident );
336 return Edition( _solvable->evr );
342 switch ( _solvable->arch )
356 return IdString( _solvable->vendor );
437 return rhssolvable && ( _solvable == rhssolvable || ::solvable_identical( _solvable, rhssolvable ) );
445 return offs_r ?
Capabilities( idarraydata_r + offs_r ) : Capabilities();
453 return _getCapabilities( _solvable->repo->idarraydata, _solvable->provides );
458 return _getCapabilities( _solvable->repo->idarraydata, _solvable->requires );
463 return _getCapabilities( _solvable->repo->idarraydata, _solvable->conflicts );
468 return _getCapabilities( _solvable->repo->idarraydata, _solvable->obsoletes );
473 return _getCapabilities( _solvable->repo->idarraydata, _solvable->recommends );
478 return _getCapabilities( _solvable->repo->idarraydata, _solvable->suggests );
483 return _getCapabilities( _solvable->repo->idarraydata, _solvable->enhances );
488 return _getCapabilities( _solvable->repo->idarraydata, _solvable->supplements );
494 ::Offset offs = _solvable->requires;
507 if (
str::hasPrefix( caprep.name().c_str(), namespace_r ) && *(caprep.name().c_str()+namespace_r.size()) ==
'(' )
521 if (
str::hasPrefix( caprep.name().c_str(), namespace_r ) && *(caprep.name().c_str()+namespace_r.size()) ==
'(' )
523 std::string value( caprep.name().c_str()+namespace_r.size()+1 );
524 value[value.size()-1] =
'\0';
525 ret.insert(
Capability( value, caprep.op(), caprep.ed() ) );
538 int invokeOnEachSupportedLocale(
Capability cap_r,
function<
bool (
const Locale &)> fnc_r )
543 switch ( detail.capRel() )
549 int res = invokeOnEachSupportedLocale( detail.lhs(), fnc_r );
552 int res2 = invokeOnEachSupportedLocale( detail.rhs(), fnc_r );
560 if ( detail.lhs().id() == NAMESPACE_LANGUAGE )
562 return ( !fnc_r || fnc_r(
Locale(
IdString(detail.rhs().id()) ) ) ) ? 1 : -1;
579 inline int invokeOnEachSupportedLocale( Capabilities cap_r,
function<
bool (Locale)> fnc_r )
582 for_( cit, cap_r.begin(), cap_r.end() )
584 int res = invokeOnEachSupportedLocale( *cit, fnc_r );
598 bool operator()(
const Locale & locale_r )
const
617 return invokeOnEachSupportedLocale(
supplements(), bind( std::not_equal_to<Locale>(), locale_r, _1 ) ) < 0;
622 if ( locales_r.empty() )
625 return invokeOnEachSupportedLocale(
supplements(), NoMatchIn(locales_r) ) < 0;
634 invokeOnEachSupportedLocale(
supplements(), functor::collector( std::inserter( ret, ret.begin() ) ) );
648 unsigned medianr = 0U;
649 const char * file = ::solvable_lookup_location( _solvable, &medianr );
652 else if ( ! medianr )
703 if ( ret.empty() && isKind<Product>() )
706 std::string riname(
name() );
719 if ( isKind<Product>() )
722 std::string riname(
name() );
735 return str << (obj.
isSystem() ?
"systemSolvable" :
"noSolvable" );
737 return str <<
"(" << obj.
id() <<
")"
739 <<
'-' << obj.
edition() <<
'.' << obj.
arch() <<
"("
748 #define OUTS(X) if ( ! obj[Dep::X].empty() ) str << endl << " " #X " " << obj[Dep::X]