17#include <zypp/base/LogTools.h>
18#include <zypp/base/IOStream.h>
19#include <zypp/base/StringV.h>
21#include <zypp/PathInfo.h>
26#include <zypp/PathInfo.h>
27#include <zypp-core/parser/IniDict>
29#undef ZYPP_BASE_LOGGER_LOGGROUP
30#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::VendorAttr"
67 static const IdString suse {
"suse" };
68 static const IdString opensuse {
"opensuse" };
74 auto isSuse = [sid,oid](
unsigned v )->
bool {
return v==sid || v==oid; };
80 std::map<unsigned,VendorList> lists;
82 lists[el.second].push_back( el.first );
85 for (
auto el : lists ) {
90 if ( fnc_r && !fnc_r( std::move(vlist) ) )
103 typedef std::unordered_map<IdString, VendorMatchEntry>
VendorMatch;
124 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
127 {
return new Impl( *
this ); }
176 unsigned targetId = _vendorGroupId + 1;
180 for ( std::string & vendor : vendorList_r )
184 if ( _vendorGroupMap.count( vendor ) )
186 unsigned joinId = _vendorGroupMap[vendor];
187 if ( targetId == _vendorGroupId + 1 ) {
190 else if ( targetId != joinId ) {
192 for (
auto & el : _vendorGroupMap ) {
193 if ( el.second == joinId )
194 el.second = targetId;
202 for ( std::string & vendor : vendorList_r ) {
203 if ( ! vendor.empty() )
204 _vendorGroupMap[vendor] = targetId;
207 if ( targetId == _vendorGroupId + 1 )
211 vendorMatchIdReset();
217 str <<
"Equivalent vendors:";
219 str << endl <<
" [" << p.second <<
"] " << p.first;
245 MIL <<
"Initial: " << *
this << endl;
252 MIL <<
"Initial " << initial_r <<
": " << *
this << endl;
260 if (
PathInfo pi { dirname_r }; ! pi.isDir() ) {
261 MIL <<
"Not a directory " << pi << endl;
266 [
this](
const Pathname & dir_r,
const std::string & str_r )->
bool
277 if (
PathInfo pi { filename_r }; ! pi.isFile() ) {
278 MIL <<
"Not a file " << pi << endl;
283 for (
const auto & el : dict.entries(
"main") )
285 if ( el.first ==
"vendors" )
288 strv::split( el.second,
",", strv::Trim::trim,
289 [&tmp]( std::string_view word ) {
290 if ( ! word.empty() )
291 tmp.push_back( std::string(word) );
301 {
_pimpl->addVendorList( std::move(vendorList_r) ); }
304 {
return _pimpl->foreachVendorList( std::move(fnc_r) ); }
319 for (
const auto & el : list_r )
320 tmp.push_back( std::string(el) );
329 {
return _pimpl->equivalent( lVendor, rVendor );}
342 {
return _pimpl->relaxedEquivalent( lVendor, rVendor );}
Integral type with defined initial value when default constructed.
Access to the sat-pools string space.
std::string asString() const
Conversion to std::string
Combining sat::Solvable and ResStatus.
VendorAttr implementation.
bool relaxedEquivalent(IdString lVendor, IdString rVendor) const
Return whether two vendor strings should be treated as equivalent or are (suse/opensuse).
VendorMatch _vendorMatch
Cache mapping vendor strings to equivalence class ID.
std::map< std::string, unsigned > VendorGroupMap
unsigned vendorMatchId(IdString vendor) const
Helper mapping a vendor string to its eqivalence class ID.
bool equivalent(IdString lVendor, IdString rVendor) const
Return whether two vendor strings should be treated as equivalent.
Impl * clone() const
clone for RWCOW_pointer
void vendorMatchIdReset()
Reset vendor match cache if _vendorGroupMap was changed.
VendorGroupMap _vendorGroupMap
Vendor group definition. Equivalent groups share the same ID.
std::ostream & operator<<(std::ostream &str, const VendorAttr::Impl &obj)
Stream output.
friend std::ostream & operator<<(std::ostream &str, const Impl &obj)
unsigned _nextId
Least equivalence class ID in use (decremented).
std::unordered_map< IdString, VendorMatchEntry > VendorMatch
unsigned _vendorGroupId
Highest group ID in use (incremented).
DefaultIntegral< unsigned, 0 > VendorMatchEntry
void addVendorList(VendorList &&vendorList_r)
Add a new equivalent vendor set.
unsigned foreachVendorList(std::function< bool(VendorList)> fnc_r) const
Definition of vendor equivalence.
VendorAttr()
Ctor providing the default set.
static VendorAttr & noTargetInstance()
Singleton, settings used if no Target is active.
bool equivalent(const Vendor &lVendor, const Vendor &rVendor) const
Return whether two vendor strings should be treated as the same vendor.
bool addVendorFile(const Pathname &filename_r)
Adding new equivalent vendors described in a file.
RWCOW_pointer< Impl > _pimpl
Implementation class.
unsigned foreachVendorList(std::function< bool(VendorList)> fnc_r) const
Call fnc_r for each equivalent vendor list (return false to break).
bool relaxedEquivalent(const Vendor &lVendor, const Vendor &rVendor) const
Like equivalent but always unifies suse and openSUSE vendor.
static const VendorAttr & instance()
(Pseudo)Singleton, mapped to the current Target::vendorAttr settings or to noTargetInstance.
void _addVendorList(VendorList &&list_r)
std::vector< std::string > VendorList
Preferred type to pass equivalent vendor strings.
bool addVendorDirectory(const Pathname &dirname_r)
Adding new equivalent vendors described in a directory.
Pathname vendorPath() const
Directory for equivalent vendor definitions (configPath()/vendors.d)
static ZConfig & instance()
Singleton ctor.
Wrapper class for stat/lstat.
Parses a INI file and offers its structure as a dictionary.
A Solvable object within the sat Pool.
IdString vendor() const
The vendor.
String related utilities and Regular expression matching.
const StrMatcher & matchNoDots()
Convenience returning StrMatcher( "[^.]*", Match::GLOB )
int dirForEach(const Pathname &dir_r, const StrMatcher &matcher_r, function< bool(const Pathname &, const char *const)> fnc_r)
bool hasPrefix(const C_Str &str_r, const C_Str &prefix_r)
Return whether str_r has prefix prefix_r.
std::string toLower(const std::string &s)
Return lowercase version of s.
Easy-to use interface to the ZYPP dependency resolver.
std::ostream & operator<<(std::ostream &str, const SerialNumber &obj)
Solvable satSolvable() const
Return the corresponding sat::Solvable.