12 #ifndef ZYPP_MISC_HELIXHELPERS_H
13 #define ZYPP_MISC_HELIXHELPERS_H
20 #include <libxml/parser.h>
21 #include <libxml/xmlmemory.h>
25 #include <string_view>
31 template <
typename Tp>
49 std::string_view
name()
const {
return (std::string_view((
const char *)
_node->name)); }
50 xmlElementType
type()
const {
return (
_node->type); }
53 std::optional<XmlNode>
next()
const {
return (
_node->next == NULL ? std::optional<XmlNode>() :
XmlNode (
_node->next)); }
54 std::optional<XmlNode>
children()
const {
return (
_node->xmlChildrenNode == NULL ? std::optional<XmlNode>() :
XmlNode (
_node->xmlChildrenNode)); }
58 bool equals (
const std::string_view & n)
const {
return (strncasecmp (
name().data(), n.data(), n.length() ) == 0); }
62 std::map<std::string, std::string> res;
64 if ( !
attr->children )
67 res.insert( std::make_pair( std::string((
char *)
attr->name), std::string( (
char *)value.
value() ) ) );
76 *buf = xmlNodeGetContent (
_node);
78 ret = std::string ((
const char *)buf.
value());
83 std::string
getProp (
const std::string &
name,
const std::string & deflt =
"")
const {
87 *ret = xmlGetProp (
_node, (
const xmlChar *)
name.c_str());
90 gs = std::string ((
const char *)ret.
value());
109 *xml_s = xmlGetProp(
_node, (
const xmlChar *)
name.c_str());
111 target = std::string ((
const char *)xml_s.
value());
115 child =
_node->xmlChildrenNode;
118 if (strcasecmp((
const char *)(child->name),
name.c_str()) == 0) {
119 xml_s = xmlNodeGetContent(child);
121 target = std::string ((
const char *)xml_s.
value());
140 auto &target = t.
data();
141 auto architecture = setup.
getProp(
"arch" );
142 if ( !architecture.empty() )
145 target.architecture = (
zypp::Arch(architecture) );
149 if ( err ) *err =
zypp::str::Str() <<
"Bad architecture '" << architecture <<
"' in <setup...>";
157 if ( !
node->isElement() ) {
162 #define if_SolverFlag( N ) if ( node->equals( #N ) ) { target.N = true; }
163 if_SolverFlag( ignorealreadyrecommended )
else if (
node->equals(
"ignorealready" ) ) { target.ignorealreadyrecommended =
true; }
164 else if_SolverFlag( onlyRequires )
else if (
node->equals(
"ignorerecommended" ) ) { target.onlyRequires =
true; }
179 else if (
node->equals(
"focus") ) {
180 target.resolverFocus = zypp::resolverFocusFromString(
node->getProp(
"value") );
182 else if (
node->equals(
"system") ) {
187 node->getProp(
"file")
190 else if (
node->equals(
"hardwareInfo") ) {
191 target.hardwareInfoFile = target.globalPath /
node->getProp(
"path");
193 else if (
node->equals(
"modalias") ) {
194 target.modaliasList.push_back(
node->getProp(
"name") );
196 else if (
node->equals(
"multiversion") ) {
197 target.multiversionSpec.insert(
node->getProp(
"name") );
199 else if (
node->equals (
"channel")) {
200 std::string name =
node->getProp(
"name");
201 std::string file =
node->getProp(
"file");
202 std::string type =
node->getProp(
"type");
205 std::string priority =
node->getProp(
"priority");
206 if ( !priority.empty() ) {
207 prio = zypp::str::strtonum<unsigned>( priority );
217 else if (
node->equals(
"source") )
219 std::string
url =
node->getProp(
"url");
220 std::string alias =
node->getProp(
"name");
228 else if (
node->equals(
"force-install") )
231 node->getProp(
"channel"),
232 node->getProp(
"package"),
233 node->getProp(
"kind")
236 else if (
node->equals(
"mediaid") )
238 target.show_mediaid =
true;
240 else if (
node->equals(
"arch") ) {
241 MIL <<
"<arch...> deprecated, use <setup arch=\"...\"> instead" << std::endl;
242 std::string architecture =
node->getProp(
"name");
243 if ( architecture.empty() ) {
244 ERR <<
"Property 'name=' in <arch.../> missing or empty" << std::endl;
247 MIL <<
"Setting architecture to '" << architecture <<
"'" << std::endl;
248 target.architecture =
zypp::Arch( architecture );
251 else if (
node->equals(
"locale") )
254 std::string fate =
node->getProp(
"fate");
256 ERR <<
"Bad or missing name in <locale...>" << std::endl;
258 else if ( fate ==
"added" ) {
259 target.localesTracker.added().insert( loc );
261 else if ( fate ==
"removed" ) {
262 target.localesTracker.removed().insert( loc );
265 target.localesTracker.current().insert( loc );
268 else if (
node->equals(
"autoinst") ) {
271 else if (
node->equals(
"systemCheck") ) {
272 target.systemCheck = target.globalPath /
node->getProp(
"path");
274 else if (
node->equals(
"setlicencebit") ) {
275 target.set_licence =
true;
278 ERR <<
"Unrecognized tag '" <<
node->name() <<
"' in setup" << std::endl;
288 const auto & content =
node.getContent();
289 if ( !content.empty() ) {
290 testcaseNode.
value() = content;
294 for (
auto childNode =
node.children(); childNode; childNode = childNode->next() ) {
295 auto testNode = std::make_shared<zypp::misc::testcase::TestcaseTrial::Node>();
298 testcaseNode.
children().push_back( testNode );
307 if (!
node->isElement()) {
314 target.
nodes().push_back( testcaseNode );