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";
Helper providing more detailed information about a Capability.
sat::detail::IdType _archIfSimple
CapRel
Enum values corresponding with libsolv defines.
@ REL_NONE
Not an expression.
@ CAP_ARCH
Used internally.
Tri state Capability match result.
static const CapMatch irrelevant
static const CapMatch yes
sat::detail::IdType id() const
Expert backdoor.
static const Capability Null
No or Null Capability ( Id 0 ).
Capability()
Default ctor, Empty capability.
CapDetail detail() const
Helper providing more detailed information about a Capability.
const char * c_str() const
Conversion to const char *
static CapMatch _doMatch(sat::detail::IdType lhs, sat::detail::IdType rhs)
Match two Capabilities.
static bool isInterestingFileSpec(const IdString &name_r)
Test for a filename that is likely being REQUIRED.
static const Capability Empty
Empty Capability.
static Capability guessPackageSpec(const std::string &str_r)
Capability parser also guessing "libzypp-1.2.3-4.5.x86_64" formats.
Edition represents [epoch:]version[-release]
static const Edition noedition
Value representing noedition ("") This is in fact a valid Edition.
const char * c_str() const
Access to the sat-pools string space.
const char * c_str() const
Conversion to const char *
constexpr bool empty() const
Whether the string is empty.
IdType id() const
Expert backdoor.
std::string asString() const
Conversion to std::string
static const ResKind srcpackage
static ResPool instance()
Singleton ctor.
byIdent_iterator byIdentBegin(const ByIdent &ident_r) const
byIdent_iterator byIdentEnd(const ByIdent &ident_r) const
static Pool instance()
Singleton ctor.
detail::CPool * get() const
Expert backdoor.
Container of Solvable providing a Capability (read only).
bool empty() const
Whether the container is empty.
@ nosubs
Support for substring addressing of matches is not required.
Regular expression match result.
String related utilities and Regular expression matching.
static const IdType emptyId(1)
static const IdType noId(0)
int IdType
Generic Id type.
::s_Pool CPool
Wrapped libsolv C data type exposed as backdoor.
std::string numstring(char n, int w=0)
bool hasPrefix(const C_Str &str_r, const C_Str &prefix_r)
Return whether str_r has prefix prefix_r.
bool regex_match(const std::string &s, smatch &matches, const regex ®ex)
\relates regex \ingroup ZYPP_STR_REGEX \relates regex \ingroup ZYPP_STR_REGEX
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.
ResolverNamespace
The resolver's dependency namespaces.
bool overlaps(const Range< Tp, TCompare > &lhs, const Range< Tp, TCompare > &rhs)
const Arch Arch_empty(IdString::Empty)
std::ostream & operator<<(std::ostream &str, const SerialNumber &obj)
std::ostream & dumpOn(std::ostream &str, const Capability &obj)
std::string asString(const Patch::Category &obj)
static bool isRel(unsigned bits_r)
Test whether bits_r is a valid Rel (no extra bits set).
static PoolImpl & myPool()