13 #include <zypp/base/Logger.h> 15 #include <zypp/base/String.h> 16 #include <zypp/base/Regex.h> 17 #include <zypp/base/Gettext.h> 18 #include <zypp/base/Exception.h> 25 #include <zypp/sat/detail/PoolImpl.h> 39 template <
unsigned TLen = 5>
43 std::string & getNext()
54 for ( ; pos_r != std::string::npos; --pos_r )
56 char ch = str_r[pos_r];
57 if ( ch !=
' ' && ch !=
'\t' )
66 for ( ; pos_r != std::string::npos; --pos_r )
68 char ch = str_r[pos_r];
69 if ( ch ==
' ' || ch ==
'\t' )
76 void splitOpEdition( std::string & str_r, Rel & op_r, Edition & ed_r )
83 if ( (ch = backskipWs( str_r, ch )) != std::string::npos )
86 if ( (ch = backskipNWs( str_r, ch )) != std::string::npos )
89 if ( (ch = backskipWs( str_r, ch )) != std::string::npos )
92 ch = backskipNWs( str_r, ch );
93 if ( op_r.parseFrom( str_r.substr( ch+1, oe-ch ) ) )
96 ed_r = Edition( str_r.substr( eb+1, ee-eb ) );
97 if ( ch != std::string::npos )
98 ch = backskipWs( str_r, ch );
108 ch = str_r.find_last_of(
"<=>)" );
109 if ( ch != std::string::npos && str_r[ch] !=
')' )
114 ch = str_r.find_first_not_of(
" \t", oe+1 );
115 if ( ch != std::string::npos )
116 ed_r = Edition( str_r.substr( ch ) );
120 if ( str_r[oe] !=
'=' )
126 if ( ch != std::string::npos )
130 case '<': --ch; op_r =
Rel::LE;
break;
131 case '>': --ch; op_r =
Rel::GE;
break;
132 case '!': --ch; op_r =
Rel::NE;
break;
134 default: op_r =
Rel::EQ;
break;
140 if ( ch != std::string::npos )
141 ch = backskipWs( str_r, ch );
152 const std::string & name_r,
154 const Edition & ed_r,
155 const ResKind & kind_r )
158 sat::Solvable::SplitIdent
split( kind_r, name_r );
165 nid = ::pool_rel2id( pool_r, nid, IdString(ARCH_SRC).
id(), REL_ARCH,
true );
171 nid = ::pool_rel2id( pool_r, nid, arch_r.id(), REL_ARCH, true );
177 nid = ::pool_rel2id( pool_r, nid, ed_r.id(), op_r.bits(), true );
187 const std::string & name_r, Rel op_r,
const Edition & ed_r,
188 const ResKind & kind_r )
190 static const Arch srcArch( IdString(ARCH_SRC).
asString() );
191 static const Arch nosrcArch( IdString(ARCH_NOSRC).
asString() );
201 std::string name( name_r );
204 if ( asep != std::string::npos )
206 Arch ext( name_r.substr( asep+1 ) );
207 if ( ext.isBuiltIn() || ext == srcArch || ext == nosrcArch )
214 return relFromStr( pool_r, arch, name, op_r, ed_r, kind_r );
221 const std::string & str_r,
const ResKind & kind_r,
224 std::string name( str_r );
229 splitOpEdition( name, op, ed );
232 if ( arch_r.empty() )
233 return relFromStr( pool_r, name, op, ed, kind_r );
235 return relFromStr( pool_r, arch_r, name, op, ed, kind_r );
248 : _id( relFromStr( myPool().getPool(),
Arch_empty, str_r, prefix_r, flag_r ) )
252 : _id( relFromStr( myPool().getPool(),
Arch_empty, str_r.c_str(), prefix_r, flag_r ) )
256 : _id( relFromStr( myPool().getPool(), arch_r, str_r, prefix_r, flag_r ) )
260 : _id( relFromStr( myPool().getPool(), arch_r, str_r.c_str(), prefix_r, flag_r ) )
264 : _id( relFromStr( myPool().getPool(),
Arch_empty, str_r, prefix_r, flag_r ) )
268 : _id( relFromStr( myPool().getPool(),
Arch_empty, str_r, prefix_r, flag_r ) )
272 : _id( relFromStr( myPool().getPool(), arch_r, str_r, prefix_r, flag_r ) )
276 : _id( relFromStr( myPool().getPool(), arch_r, str_r, prefix_r, flag_r ) )
284 : _id( relFromStr( myPool().getPool(), name_r,
Rel(op_r),
Edition(ed_r), prefix_r ) )
287 : _id( relFromStr( myPool().getPool(), name_r, op_r,
Edition(ed_r), prefix_r ) )
290 : _id( relFromStr( myPool().getPool(), name_r, op_r, ed_r, prefix_r ) )
297 Capability::Capability(
const std::string & arch_r,
const std::string & name_r,
const std::string & op_r,
const std::string & ed_r,
const ResKind & prefix_r )
298 : _id( relFromStr( myPool().getPool(),
Arch(arch_r), name_r,
Rel(op_r),
Edition(ed_r), prefix_r ) )
301 : _id( relFromStr( myPool().getPool(),
Arch(arch_r), name_r, op_r,
Edition(ed_r), prefix_r ) )
304 : _id( relFromStr( myPool().getPool(),
Arch(arch_r), name_r, op_r, ed_r, prefix_r ) )
307 : _id( relFromStr( myPool().getPool(), arch_r, name_r,
Rel(op_r),
Edition(ed_r), prefix_r ) )
310 : _id( relFromStr( myPool().getPool(), arch_r, name_r, op_r,
Edition(ed_r), prefix_r ) )
313 : _id( relFromStr( myPool().getPool(), arch_r, name_r, op_r, ed_r, prefix_r ) )
321 : _id( ::pool_rel2id( myPool().getPool(), asIdString(namespace_r).id(), (value_r.empty() ? STRID_NULL : value_r.id() ), REL_NAMESPACE, true ) )
328 inline const char * opstr(
int op_r )
332 case REL_GT:
return " > ";
333 case REL_EQ:
return " = ";
334 case REL_LT:
return " < ";
335 case REL_GT|REL_EQ:
return " >= ";
336 case REL_LT|REL_EQ:
return " <= ";
337 case REL_GT|REL_LT:
return " != ";
338 case REL_GT|REL_LT|REL_EQ:
return " <=> ";
339 case REL_AND:
return " and ";
340 case REL_OR:
return " or ";
341 case REL_COND:
return " if ";
342 case REL_UNLESS:
return " unless ";
343 case REL_ELSE:
return " else ";
344 case REL_WITH:
return " with ";
345 case REL_WITHOUT:
return " without ";
347 return "UNKNOWNCAPREL";
350 inline bool isBoolOp(
int op_r )
365 inline bool needsBrace(
int op_r,
int parop_r )
367 return ( isBoolOp( parop_r ) || parop_r == 0 ) && isBoolOp( op_r )
368 && ( parop_r != op_r || op_r == REL_COND || op_r == REL_UNLESS || op_r == REL_ELSE )
369 && not ( ( parop_r == REL_COND || parop_r == REL_UNLESS ) && op_r == REL_ELSE );
374 if ( ISRELDEP(id_r) ) {
375 ::Reldep * rd = GETRELDEP( pool_r, id_r );
379 if ( rd->evr == ARCH_SRC || rd->evr == ARCH_NOSRC ) {
383 outs_r += IdString(rd->name).c_str();
386 cap2strHelper( outs_r, pool_r, rd->name, op );
388 cap2strHelper( outs_r, pool_r, rd->evr, op );
393 cap2strHelper( outs_r, pool_r, rd->name, op );
395 cap2strHelper( outs_r, pool_r, rd->evr, op );
400 if ( op == REL_FILECONFLICT )
402 cap2strHelper( outs_r, pool_r, rd->name, op );
406 if ( needsBrace( op, parop_r ) ) {
408 cap2strHelper( outs_r, pool_r, rd->name, op );
409 outs_r += opstr( op );
410 cap2strHelper( outs_r, pool_r, rd->evr, op );
415 cap2strHelper( outs_r, pool_r, rd->name, op );
416 outs_r += opstr( op );
417 cap2strHelper( outs_r, pool_r, rd->evr, op );
420 outs_r += IdString(id_r).c_str();
427 if ( not
id() )
return "";
430 static TempStrings<5> tempstrs;
432 std::string & outs { tempstrs.getNext() };
433 cap2strHelper( outs,
myPool().getPool(),
id(), 0 );
492 "/(s?bin|lib(64)?|etc)/|^/usr/(games/|share/(dict/words|magic\\.mime)$)|^/opt/gnome/games/",
530 if ( (pos = guess.rfind(
'-', pos-1 )) != std::string::npos )
585 if ( ! ISRELDEP(
_lhs) )
592 ::Reldep * rd = GETRELDEP(
myPool().getPool(),
_lhs );
601 if ( ! ISRELDEP(
_lhs) )
637 static const char archsep =
'.';
638 switch ( obj.
kind() )
641 return str <<
"<NoCap>";
655 return str <<
" " << obj.
op() <<
" " << obj.
ed();
664 cap2strHelper( outs, pool, obj.
lhs().
id(), op );
666 cap2strHelper( outs, pool, obj.
rhs().
id(), op );
671 cap2strHelper( outs, pool, obj.
lhs().
id(), op );
673 cap2strHelper( outs, pool, obj.
rhs().
id(), op );
680 return str <<
"<UnknownCap(" << obj.
lhs() <<
" " << obj.
capRel() <<
" " << obj.
rhs() <<
")>";
692 return str <<
"UnknownCap";
std::string asString(const Patch::Category &obj)
int IdType
Generic Id type.
Container of Solvable providing a Capability (read only).
bool empty() const
Whether the container is empty.
static CapMatch _doMatch(sat::detail::IdType lhs, sat::detail::IdType rhs)
Match two Capabilities.
static Capability guessPackageSpec(const std::string &str_r)
Capability parser also guessing "libzypp-1.2.3-4.5.x86_64" formats.
Helper providing more detailed information about a Capability.
IdType id() const
Expert backdoor.
const Arch Arch_empty(IdString::Empty)
String related utilities and Regular expression matching.
std::ostream & operator<<(std::ostream &str, const SerialNumber &obj)
static const ResKind srcpackage
Access to the sat-pools string space.
Edition represents [epoch:]version[-release]
static bool isInterestingFileSpec(const IdString &name_r)
Test for a filename that is likely being REQUIRED.
Support for substring addressing of matches is not required.
sat::detail::IdType id() const
Expert backdoor.
ResolverNamespace
The resolver's dependency namespaces.
static const CapMatch irrelevant
constexpr bool empty() const
Whether the string is empty.
unsigned split(const C_Str &line_r, TOutputIterator result_r, const C_Str &sepchars_r=" \, const Trim trim_r=NO_TRIM)
Split line_r into words.
static Pool instance()
Singleton ctor.
static const IdType emptyId(1)
static bool isRel(unsigned bits_r)
Test whether bits_r is a valid Rel (no extra bits set).
detail::CPool * get() const
Expert backdoor.
std::ostream & dumpOn(std::ostream &str, const Capability &obj)
static PoolImpl & myPool()
::s_Pool CPool
Wrapped libsolv C data type exposed as backdoor.
const char * c_str() const
Conversion to const char *
Tri state Capability match result.
static const Capability Null
No or Null Capability ( Id 0 ).
std::string numstring(char n, int w=0)
Regular expression match result.
sat::detail::IdType _archIfSimple
static const IdType noId(0)
static const Capability Empty
Empty Capability.
Capability()
Default ctor, Empty capability.
bool regex_match(const std::string &s, smatch &matches, const regex ®ex)
regex ZYPP_STR_REGEX regex ZYPP_STR_REGEX
byIdent_iterator byIdentEnd(const ByIdent &ident_r) const
std::string asString() const
Conversion to std::string
CapRel
Enum values corresponding with libsolv defines.
static const CapMatch yes
bool overlaps(const Range< Tp, TCompare > &lhs, const Range< Tp, TCompare > &rhs)
CapDetail detail() const
Helper providing more detailed information about a Capability.
Easy-to use interface to the ZYPP dependency resolver.
bool hasPrefix(const C_Str &str_r, const C_Str &prefix_r)
Return whether str_r has prefix prefix_r.
const char * c_str() const
byIdent_iterator byIdentBegin(const ByIdent &ident_r) const
static const Edition noedition
Value representing noedition ("") This is in fact a valid Edition.
const char * c_str() const
Conversion to const char *
static ResPool instance()
Singleton ctor.