diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c67ed22 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/libdnf-0.22.5.tar.gz diff --git a/.libdnf.metadata b/.libdnf.metadata new file mode 100644 index 0000000..cecb49a --- /dev/null +++ b/.libdnf.metadata @@ -0,0 +1 @@ +d456a4e02426c4fb837d85bfcfb2645ecb4d0788 SOURCES/libdnf-0.22.5.tar.gz diff --git a/SOURCES/0001-Add-best-as-default-behavior-RhBug16707761671683.patch b/SOURCES/0001-Add-best-as-default-behavior-RhBug16707761671683.patch new file mode 100644 index 0000000..e96d84d --- /dev/null +++ b/SOURCES/0001-Add-best-as-default-behavior-RhBug16707761671683.patch @@ -0,0 +1,25 @@ +From 9309e92332241ff1113433057c969cebf127734e Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Mon, 4 Feb 2019 16:11:18 +0100 +Subject: [PATCH] Add best as default behavior (RhBug:1670776,1671683) + +--- + libdnf/conf/ConfigMain.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libdnf/conf/ConfigMain.cpp b/libdnf/conf/ConfigMain.cpp +index 281d928..6964f3e 100644 +--- a/libdnf/conf/ConfigMain.cpp ++++ b/libdnf/conf/ConfigMain.cpp +@@ -284,7 +284,7 @@ class ConfigMain::Impl { + OptionEnum multilib_policy{"best", {"best", "all"}}; // :api + OptionBinding multilibPolicyBinding{owner, multilib_policy, "multilib_policy"}; + +- OptionBool best{false}; // :api ++ OptionBool best{true}; // :api + OptionBinding bestBinding{owner, best, "best"}; + + OptionBool install_weak_deps{true}; +-- +libgit2 0.27.7 + diff --git a/SOURCES/0002-Add-support-for-Module-advisories.patch b/SOURCES/0002-Add-support-for-Module-advisories.patch new file mode 100644 index 0000000..5c74a78 --- /dev/null +++ b/SOURCES/0002-Add-support-for-Module-advisories.patch @@ -0,0 +1,274 @@ +From 27112644c0e17510fa8e07ba4949b9fbd89655bc Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Thu, 17 Jan 2019 16:04:48 +0100 +Subject: [PATCH] Add support for Module advisories + +--- + libdnf/sack/CMakeLists.txt | 1 + + libdnf/sack/advisory.cpp | 21 +++++++++++++++++++++ + libdnf/sack/advisory.hpp | 2 ++ + libdnf/sack/advisorymodule.cpp | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + libdnf/sack/advisorymodule.hpp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 195 insertions(+) + create mode 100644 libdnf/sack/advisorymodule.cpp + create mode 100644 libdnf/sack/advisorymodule.hpp + +diff --git a/libdnf/sack/CMakeLists.txt b/libdnf/sack/CMakeLists.txt +index e1c6be1..9921c74 100644 +--- a/libdnf/sack/CMakeLists.txt ++++ b/libdnf/sack/CMakeLists.txt +@@ -1,6 +1,7 @@ + SET (SACK_SOURCES + ${SACK_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/advisory.cpp ++ ${CMAKE_CURRENT_SOURCE_DIR}/advisorymodule.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/advisorypkg.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/advisoryref.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/packageset.cpp +diff --git a/libdnf/sack/advisory.cpp b/libdnf/sack/advisory.cpp +index d006bcc..bb9e7f4 100644 +--- a/libdnf/sack/advisory.cpp ++++ b/libdnf/sack/advisory.cpp +@@ -24,6 +24,7 @@ + + #include "advisory.hpp" + #include "advisorypkg.hpp" ++#include "advisorymodule.hpp" + #include "advisoryref.hpp" + #include "../dnf-advisory-private.hpp" + #include "../dnf-advisoryref.h" +@@ -133,6 +134,26 @@ Advisory::getPackages(std::vector & pkglist, bool withFilemanes) co + dataiterator_free(&di); + } + ++std::vector Advisory::getModules() const ++{ ++ std::vector moduleList; ++ Dataiterator di; ++ Pool *pool = dnf_sack_get_pool(sack); ++ ++ dataiterator_init(&di, pool, 0, advisory, UPDATE_MODULE, 0, 0); ++ while (dataiterator_step(&di)) { ++ dataiterator_setpos(&di); ++ Id name = pool_lookup_id(pool, SOLVID_POS, UPDATE_MODULE_NAME); ++ Id stream = pool_lookup_id(pool, SOLVID_POS, UPDATE_MODULE_STREAM); ++ Id version = pool_lookup_id(pool, SOLVID_POS, UPDATE_MODULE_VERSION); ++ Id context = pool_lookup_id(pool, SOLVID_POS, UPDATE_MODULE_CONTEXT); ++ Id arch = pool_lookup_id(pool, SOLVID_POS, UPDATE_MODULE_ARCH); ++ moduleList.emplace_back(sack, advisory, name, stream, version, context, arch); ++ } ++ dataiterator_free(&di); ++ return moduleList; ++} ++ + void + Advisory::getReferences(std::vector & reflist) const + { +diff --git a/libdnf/sack/advisory.hpp b/libdnf/sack/advisory.hpp +index 3771257..5aa8dc6 100644 +--- a/libdnf/sack/advisory.hpp ++++ b/libdnf/sack/advisory.hpp +@@ -33,15 +33,17 @@ + namespace libdnf { + + struct AdvisoryPkg; ++struct AdvisoryModule; + + struct Advisory { + public: + Advisory(DnfSack *sack, Id advisory); + bool operator ==(const Advisory & other) const; + const char *getDescription() const; + DnfAdvisoryKind getKind() const; + const char *getName() const; + void getPackages(std::vector & pkglist, bool withFilemanes = true) const; ++ std::vector getModules() const; + void getReferences(std::vector & reflist) const; + const char *getRights() const; + const char *getSeverity() const; +diff --git a/libdnf/sack/advisorymodule.cpp b/libdnf/sack/advisorymodule.cpp +new file mode 100644 +index 0000000..a209b5f +--- /dev/null ++++ b/libdnf/sack/advisorymodule.cpp +@@ -0,0 +1,113 @@ ++/* ++ * Copyright (C) 2019 Red Hat, Inc. ++ * ++ * Licensed under the GNU Lesser General Public License Version 2.1 ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#include ++ ++#include ++ ++#include "advisory.hpp" ++#include "advisorymodule.hpp" ++#include "../dnf-sack-private.hpp" ++ ++namespace libdnf { ++ ++class AdvisoryModule::Impl { ++private: ++ friend AdvisoryModule; ++ DnfSack *sack; ++ Id advisory; ++ Id name; ++ Id stream; ++ Id version; ++ Id context; ++ Id arch; ++}; ++ ++AdvisoryModule::AdvisoryModule(DnfSack *sack, Id advisory, Id name, Id stream, Id version, Id context, Id arch) : pImpl(new Impl) ++{ ++ pImpl->sack = sack; ++ pImpl->advisory = advisory; ++ pImpl->name = name; ++ pImpl->stream = stream; ++ pImpl->version = version; ++ pImpl->context = context; ++ pImpl->arch = arch; ++} ++AdvisoryModule::AdvisoryModule(const AdvisoryModule & src) : pImpl(new Impl) { *pImpl = *src.pImpl; } ++AdvisoryModule::AdvisoryModule(AdvisoryModule && src) : pImpl(new Impl) { pImpl.swap(src.pImpl); } ++AdvisoryModule::~AdvisoryModule() = default; ++ ++AdvisoryModule & AdvisoryModule::operator=(const AdvisoryModule & src) { *pImpl = *src.pImpl; return *this; } ++ ++AdvisoryModule & ++AdvisoryModule::operator=(AdvisoryModule && src) noexcept ++{ ++ pImpl.swap(src.pImpl); ++ return *this; ++} ++ ++bool ++AdvisoryModule::nsvcaEQ(AdvisoryModule & other) ++{ ++ return other.pImpl->name == pImpl->name && ++ other.pImpl->stream == pImpl->stream && ++ other.pImpl->version == pImpl->version && ++ other.pImpl->context == pImpl->context && ++ other.pImpl->arch == pImpl->arch; ++} ++ ++Advisory * AdvisoryModule::getAdvisory() const ++{ ++ return new Advisory(pImpl->sack, pImpl->advisory); ++} ++ ++const char * ++AdvisoryModule::getName() const ++{ ++ return pool_id2str(dnf_sack_get_pool(pImpl->sack), pImpl->name); ++} ++ ++const char * ++AdvisoryModule::getStream() const ++{ ++ return pool_id2str(dnf_sack_get_pool(pImpl->sack), pImpl->stream); ++} ++ ++const char * ++AdvisoryModule::getVersion() const ++{ ++ return pool_id2str(dnf_sack_get_pool(pImpl->sack), pImpl->version); ++} ++ ++const char * ++AdvisoryModule::getContext() const ++{ ++ return pool_id2str(dnf_sack_get_pool(pImpl->sack), pImpl->context); ++} ++ ++const char * ++AdvisoryModule::getArch() const ++{ ++ return pool_id2str(dnf_sack_get_pool(pImpl->sack), pImpl->arch); ++} ++ ++DnfSack * AdvisoryModule::getSack() { return pImpl->sack; } ++ ++} +diff --git a/libdnf/sack/advisorymodule.hpp b/libdnf/sack/advisorymodule.hpp +new file mode 100644 +index 0000000..1ad1ea7 +--- /dev/null ++++ b/libdnf/sack/advisorymodule.hpp +@@ -0,0 +1,58 @@ ++/* ++ * Copyright (C) 2019 Red Hat, Inc. ++ * ++ * Licensed under the GNU Lesser General Public License Version 2.1 ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++ ++#ifndef __ADVISORY_MODULE_HPP ++#define __ADVISORY_MODULE_HPP ++ ++#include ++ ++#include ++#include ++ ++#include "../dnf-types.h" ++#include "advisory.hpp" ++ ++namespace libdnf { ++ ++struct AdvisoryModule { ++public: ++ AdvisoryModule(DnfSack *sack, Id advisory, Id name, Id stream, Id version, Id context, Id arch); ++ AdvisoryModule(const AdvisoryModule & src); ++ AdvisoryModule(AdvisoryModule && src); ++ ~AdvisoryModule(); ++ AdvisoryModule & operator=(const AdvisoryModule & src); ++ AdvisoryModule & operator=(AdvisoryModule && src) noexcept; ++ bool nsvcaEQ(AdvisoryModule & other); ++ Advisory * getAdvisory() const; ++ const char * getName() const; ++ const char * getStream() const; ++ const char * getVersion() const; ++ const char * getContext() const; ++ const char * getArch() const; ++ DnfSack * getSack(); ++private: ++ class Impl; ++ std::unique_ptr pImpl; ++}; ++ ++} ++ ++#endif /* __ADVISORY_MODULE_HPP */ +-- +libgit2 0.27.7 + diff --git a/SOURCES/0003-Add-setter-of-ModuleContainer-for-PySack.patch b/SOURCES/0003-Add-setter-of-ModuleContainer-for-PySack.patch new file mode 100644 index 0000000..b81443e --- /dev/null +++ b/SOURCES/0003-Add-setter-of-ModuleContainer-for-PySack.patch @@ -0,0 +1,150 @@ +From a610bc80c2b798d83737aaaa759f1799b24f3a57 Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Fri, 1 Feb 2019 14:37:35 +0100 +Subject: [PATCH] Add setter of ModuleContainer for PySack + +--- + libdnf/dnf-sack-private.hpp | 3 ++- + libdnf/dnf-sack.cpp | 19 +++++++++++++++++++ + python/hawkey/sack-py.cpp | 48 +++++++++++++++++++++++++++++++++++++++++++++++- + 3 files changed, 68 insertions(+), 2 deletions(-) + +diff --git a/libdnf/dnf-sack-private.hpp b/libdnf/dnf-sack-private.hpp +index b058126..45241c4 100644 +--- a/libdnf/dnf-sack-private.hpp ++++ b/libdnf/dnf-sack-private.hpp +@@ -57,7 +57,8 @@ int dnf_sack_get_pool_nsolvables(DnfSack *sack); + * @return Map* + */ + libdnf::PackageSet *dnf_sack_get_pkg_solvables(DnfSack *sack); +- ++ModulePackageContainer * dnf_sack_set_module_container( ++ DnfSack *sack, ModulePackageContainer * newConteiner); + ModulePackageContainer * dnf_sack_get_module_container(DnfSack *sack); + void dnf_sack_make_provides_ready (DnfSack *sack); + Id dnf_sack_running_kernel (DnfSack *sack); +diff --git a/libdnf/dnf-sack.cpp b/libdnf/dnf-sack.cpp +index fb56937..43bb977 100644 +--- a/libdnf/dnf-sack.cpp ++++ b/libdnf/dnf-sack.cpp +@@ -2006,6 +2006,25 @@ dnf_sack_get_pool(DnfSack *sack) + } + + /** ++ * dnf_sack_set_module_container: (skip) ++ * @sack: a #DnfSack instance. ++ * ++ * Setss the internal ModulePackageContainer. ++ * ++ * Returns: The old ModulePackageContainer, that has to be freed manually. ++ * ++ * Since: 0.25.0 ++ */ ++ModulePackageContainer * ++dnf_sack_set_module_container(DnfSack *sack, ModulePackageContainer * newConteiner) ++{ ++ DnfSackPrivate *priv = GET_PRIVATE(sack); ++ auto oldConteiner = priv->moduleContainer; ++ priv->moduleContainer = newConteiner; ++ return oldConteiner; ++} ++ ++/** + * dnf_sack_get_module_container: (skip) + * @sack: a #DnfSack instance. + * +diff --git a/python/hawkey/sack-py.cpp b/python/hawkey/sack-py.cpp +index e925346..7f97075 100644 +--- a/python/hawkey/sack-py.cpp ++++ b/python/hawkey/sack-py.cpp +@@ -27,6 +27,7 @@ + #include "hy-util.h" + #include "dnf-version.h" + #include "dnf-sack-private.hpp" ++#include "libdnf/module/ModulePackageContainer.hpp" + + // pyhawkey + #include "exception-py.hpp" +@@ -47,6 +48,7 @@ typedef struct { + DnfSack *sack; + PyObject *custom_package_class; + PyObject *custom_package_val; ++ PyObject * ModulePackageContainerPy; + FILE *log_out; + } _SackObject; + +@@ -119,8 +121,13 @@ sack_dealloc(_SackObject *o) + { + Py_XDECREF(o->custom_package_class); + Py_XDECREF(o->custom_package_val); +- if (o->sack) ++ if (o->sack) { ++ if (auto moduleContainer = o->ModulePackageContainerPy) { ++ dnf_sack_set_module_container(o->sack, NULL); ++ Py_DECREF(moduleContainer); ++ } + g_object_unref(o->sack); ++ } + if (o->log_out) + fclose(o->log_out); + Py_TYPE(o)->tp_free(o); +@@ -135,6 +142,7 @@ sack_new(PyTypeObject *type, PyObject *args, PyObject *kwds) + self->sack = NULL; + self->custom_package_class = NULL; + self->custom_package_val = NULL; ++ self->ModulePackageContainerPy = NULL; + } + return (PyObject *)self; + } +@@ -324,10 +332,48 @@ set_installonly_limit(_SackObject *self, PyObject *obj, void *unused) + return 0; + } + ++static int ++set_module_container(_SackObject *self, PyObject *obj, void *unused) ++{ ++ auto swigContainer = reinterpret_cast< ModulePackageContainerPyObject * >( ++ PyObject_GetAttrString(obj, "this")); ++ if (swigContainer == nullptr) { ++ PyErr_SetString(PyExc_SystemError, "Unable to parse ModuleContainer object"); ++ return -1; ++ } ++ auto moduleContainer = swigContainer->ptr; ++ auto sack = self->sack; ++ if (auto oldConteynerPy = self->ModulePackageContainerPy) { ++ Py_XDECREF(oldConteynerPy); ++ auto oldContainer = dnf_sack_set_module_container(sack, moduleContainer); ++ } else { ++ auto oldContainer = dnf_sack_set_module_container(sack, moduleContainer); ++ if (oldContainer) { ++ delete oldContainer; ++ } ++ } ++ self->ModulePackageContainerPy = obj; ++ Py_INCREF(obj); ++ ++ return 0; ++} ++ ++static PyObject * ++get_module_container(_SackObject *self, void *unused) ++{ ++ if (auto moduleConteinerPy = self->ModulePackageContainerPy) { ++ Py_INCREF(moduleConteinerPy); ++ return moduleConteinerPy; ++ } ++ Py_RETURN_NONE; ++} ++ + static PyGetSetDef sack_getsetters[] = { + {(char*)"cache_dir", (getter)get_cache_dir, NULL, NULL, NULL}, + {(char*)"installonly", NULL, (setter)set_installonly, NULL, NULL}, + {(char*)"installonly_limit", NULL, (setter)set_installonly_limit, NULL, NULL}, ++ {(char*)"_moduleContainer", (getter)get_module_container, (setter)set_module_container, ++ NULL, NULL}, + {NULL} /* sentinel */ + }; + +-- +libgit2 0.27.7 + diff --git a/SOURCES/0004-Add-testing-if-advisory-is-applicable-for-query-and-package.patch b/SOURCES/0004-Add-testing-if-advisory-is-applicable-for-query-and-package.patch new file mode 100644 index 0000000..186ad64 --- /dev/null +++ b/SOURCES/0004-Add-testing-if-advisory-is-applicable-for-query-and-package.patch @@ -0,0 +1,154 @@ +From 4a7556fb53b49ed7e03323913af87998bd48b2b1 Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Tue, 5 Feb 2019 08:58:11 +0100 +Subject: [PATCH] Add testing if advisory is applicable for query and package + +--- + libdnf/hy-package.cpp | 5 ++++- + libdnf/sack/query.cpp | 16 +++++++++++----- + libdnf/utils/utils.cpp | 28 ++++++++++++++++++++++++++++ + libdnf/utils/utils.hpp | 5 +++++ + 4 files changed, 48 insertions(+), 6 deletions(-) + +diff --git a/libdnf/hy-package.cpp b/libdnf/hy-package.cpp +index 833e082..62f4bb6 100644 +--- a/libdnf/hy-package.cpp ++++ b/libdnf/hy-package.cpp +@@ -29,6 +29,7 @@ + * See also: #DnfContext + */ + ++#include "libdnf/utils/utils.hpp" + + #include + #include +@@ -1015,7 +1016,9 @@ dnf_package_get_advisories(DnfPackage *pkg, int cmp_type) + (cmp < 0 && (cmp_type & HY_LT)) || + (cmp == 0 && (cmp_type & HY_EQ))) { + advisory = dnf_advisory_new(sack, di.solvid); +- g_ptr_array_add(advisorylist, advisory); ++ if (libdnf::isAdvisoryApplicable(*advisory, sack)) { ++ g_ptr_array_add(advisorylist, advisory); ++ } + dataiterator_skip_solvable(&di); + } + } +diff --git a/libdnf/sack/query.cpp b/libdnf/sack/query.cpp +index f1e1076..b3029e2 100644 +--- a/libdnf/sack/query.cpp ++++ b/libdnf/sack/query.cpp +@@ -18,6 +18,8 @@ + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + ++#include "libdnf/utils/utils.hpp" ++ + #include + #include + #include +@@ -1518,7 +1520,9 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname) + eq = false; + } + if (eq) { +- advisory.getPackages(pkgs, false); ++ if (isAdvisoryApplicable(advisory, sack)) { ++ advisory.getPackages(pkgs, false); ++ } + break; + } + } +@@ -2049,18 +2053,20 @@ void + Query::getAdvisoryPkgs(int cmpType, std::vector & advisoryPkgs) + { + apply(); +- Pool *pool = dnf_sack_get_pool(pImpl->sack); ++ auto sack = pImpl->sack; ++ Pool *pool = dnf_sack_get_pool(sack); + std::vector pkgs; + Dataiterator di; + auto resultPset = pImpl->result.get(); + + // iterate over advisories + dataiterator_init(&di, pool, 0, 0, 0, 0, 0); + dataiterator_prepend_keyname(&di, UPDATE_COLLECTION); + while (dataiterator_step(&di)) { +- Advisory advisory(pImpl->sack, di.solvid); +- +- advisory.getPackages(pkgs); ++ Advisory advisory(sack, di.solvid); ++ if (isAdvisoryApplicable(advisory, sack)) { ++ advisory.getPackages(pkgs); ++ } + dataiterator_skip_solvable(&di); + } + dataiterator_free(&di); +diff --git a/libdnf/utils/utils.cpp b/libdnf/utils/utils.cpp +index a1ffb49..3833614 100644 +--- a/libdnf/utils/utils.cpp ++++ b/libdnf/utils/utils.cpp +@@ -1,4 +1,6 @@ + #include "utils.hpp" ++#include "libdnf/dnf-sack-private.hpp" ++#include "libdnf/sack/advisorymodule.hpp" + + #include + #include +@@ -10,6 +12,32 @@ + #include + #include + ++bool libdnf::isAdvisoryApplicable(libdnf::Advisory & advisory, DnfSack * sack) ++{ ++ auto moduleContainer = dnf_sack_get_module_container(sack); ++ if (!moduleContainer) { ++ return true; ++ } ++ auto moduleAdvisories = advisory.getModules(); ++ if (moduleAdvisories.empty()) { ++ return true; ++ } ++ for (auto & moduleAdvisory: moduleAdvisories) { ++ if (const char * name = moduleAdvisory.getName()) { ++ if (const char * stream = moduleAdvisory.getStream()) { ++ try { ++ if (moduleContainer->isEnabled(name, stream)) { ++ return true; ++ } ++ } catch (std::out_of_range) { ++ continue; ++ } ++ } ++ } ++ } ++ return false; ++} ++ + std::vector libdnf::string::split(const std::string &source, const char *delimiter, int maxSplit) + { + if (source.empty()) +diff --git a/libdnf/utils/utils.hpp b/libdnf/utils/utils.hpp +index aaab5b0..519339f 100644 +--- a/libdnf/utils/utils.hpp ++++ b/libdnf/utils/utils.hpp +@@ -1,6 +1,8 @@ + #ifndef LIBDNF_UTILS_HPP + #define LIBDNF_UTILS_HPP + ++#include "libdnf/sack/advisory.hpp" ++ + #include + #include + #include +@@ -25,6 +27,9 @@ private: + }; + + namespace libdnf { ++ ++bool isAdvisoryApplicable(Advisory & advisory, DnfSack * sack); ++ + namespace string { + inline std::string fromCstring(const char * cstring) { return cstring ? cstring : ""; } + std::vector split(const std::string &source, const char *delimiter, int maxSplit = -1); +-- +libgit2 0.27.7 + diff --git a/SOURCES/0005-Exclude-module-pkgs-that-have-conflict.patch b/SOURCES/0005-Exclude-module-pkgs-that-have-conflict.patch new file mode 100644 index 0000000..daf3e15 --- /dev/null +++ b/SOURCES/0005-Exclude-module-pkgs-that-have-conflict.patch @@ -0,0 +1,27 @@ +From 0f9e61f8325c59d06894079d43773346a70448e2 Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Mon, 11 Feb 2019 13:36:36 +0100 +Subject: [PATCH] Exclude module pkgs that have conflict + +--- + libdnf/module/ModulePackageContainer.cpp | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index a8c7483..964d55e 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -518,6 +518,10 @@ ModulePackageContainer::Impl::moduleSolve(const std::vector & + problems = goal.describeAllProblemRules(false); + ret = goal.run(DNF_NONE); + if (ret) { ++ // Conflicting modules has to be removed otherwice it could result than one of them will ++ // be active ++ auto conflictingPkgs = goal.listConflictPkgs(DNF_PACKAGE_STATE_AVAILABLE); ++ dnf_sack_add_excludes(moduleSack, conflictingPkgs.get()); + ret = goalWeak.run(DNF_NONE); + if (ret) { + auto logger(libdnf::Log::getLogger()); +-- +libgit2 0.27.7 + diff --git a/SPECS/libdnf.spec b/SPECS/libdnf.spec new file mode 100644 index 0000000..8b855fd --- /dev/null +++ b/SPECS/libdnf.spec @@ -0,0 +1,482 @@ +%global libsolv_version 0.6.35-6 +%global libmodulemd_version 1.6.1 +%global dnf_conflict 4.0.9.2-4 +%global swig_version 3.0.12 + +%bcond_with valgrind + +# Do not build bindings for python3 for RHEL <= 7 +%if 0%{?rhel} && 0%{?rhel} <= 7 +%bcond_with python3 +%else +%bcond_without python3 +%endif + +%if 0%{?rhel} > 7 || 0%{?fedora} > 29 +# Disable python2 build by default +%bcond_with python2 +%else +%bcond_without python2 +%endif + +%if 0%{?rhel} && ! 0%{?centos} +%bcond_without rhsm +%else +%bcond_with rhsm +%endif + +%global _cmake_opts \\\ + -DENABLE_RHSM_SUPPORT=%{?with_rhsm:ON}%{!?with_rhsm:OFF} \\\ + %{nil} + +Name: libdnf +Version: 0.22.5 +Release: 4%{?dist} +Summary: Library providing simplified C and Python API to libsolv +License: LGPLv2+ +URL: https://github.com/rpm-software-management/libdnf +Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz +Patch0001: 0001-Add-best-as-default-behavior-RhBug16707761671683.patch +Patch0002: 0002-Add-support-for-Module-advisories.patch +Patch0003: 0003-Add-setter-of-ModuleContainer-for-PySack.patch +Patch0004: 0004-Add-testing-if-advisory-is-applicable-for-query-and-package.patch +Patch0005: 0005-Exclude-module-pkgs-that-have-conflict.patch + +BuildRequires: cmake +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: libsolv-devel >= %{libsolv_version} +BuildRequires: pkgconfig(librepo) +BuildRequires: pkgconfig(check) +%if %{with valgrind} +BuildRequires: valgrind +%endif +BuildRequires: pkgconfig(gio-unix-2.0) >= 2.46.0 +BuildRequires: pkgconfig(gtk-doc) +BuildRequires: rpm-devel >= 4.11.0 +%if %{with rhsm} +BuildRequires: pkgconfig(librhsm) >= 0.0.3 +%endif +BuildRequires: pkgconfig(sqlite3) +BuildRequires: pkgconfig(json-c) +BuildRequires: pkgconfig(cppunit) +BuildRequires: pkgconfig(libcrypto) +BuildRequires: pkgconfig(modulemd) >= %{libmodulemd_version} +BuildRequires: pkgconfig(smartcols) +BuildRequires: gettext +BuildRequires: gpgme-devel + +Requires: libmodulemd%{?_isa} >= %{libmodulemd_version} +Requires: libsolv%{?_isa} >= %{libsolv_version} + +%description +A Library providing simplified C and Python API to libsolv. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: libsolv-devel%{?_isa} >= %{libsolv_version} + +%description devel +Development files for %{name}. + +%if %{with python2} +%package -n python2-%{name} +%{?python_provide:%python_provide python2-%{name}} +Summary: Python 2 bindings for the libdnf library. +Requires: %{name}%{?_isa} = %{version}-%{release} +BuildRequires: python2-devel +%if 0%{?rhel} == 7 +BuildRequires: python-sphinx +BuildRequires: swig3 >= %{swig_version} +%else +BuildRequires: python2-sphinx +BuildRequires: swig >= %{swig_version} +%endif + +%description -n python2-%{name} +Python 2 bindings for the libdnf library. +%endif # with python2 + +%if %{with python3} +%package -n python3-%{name} +%{?python_provide:%python_provide python3-%{name}} +Summary: Python 3 bindings for the libdnf library. +Requires: %{name}%{?_isa} = %{version}-%{release} +BuildRequires: python3-devel +BuildRequires: python3-sphinx +BuildRequires: swig >= %{swig_version} + +%description -n python3-%{name} +Python 3 bindings for the libdnf library. +%endif + +%if %{with python2} +%package -n python2-hawkey +Summary: Python 2 bindings for the hawkey library +%{?python_provide:%python_provide python2-hawkey} +BuildRequires: python2-devel +%if 0%{?rhel} && 0%{?rhel} <= 7 +BuildRequires: python-nose +%else +BuildRequires: python2-nose +%endif +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: python2-%{name} = %{version}-%{release} +# Fix problem with hawkey - dnf version incompatibility +# Can be deleted for distros where only python2-dnf >= 2.0.0 +Conflicts: python2-dnf < %{dnf_conflict} +Conflicts: python-dnf < %{dnf_conflict} + +%description -n python2-hawkey +Python 2 bindings for the hawkey library. +%endif # with python2 + +%if %{with python3} +%package -n python3-hawkey +Summary: Python 3 bindings for the hawkey library +%{?python_provide:%python_provide python3-hawkey} +BuildRequires: python3-devel +BuildRequires: python3-nose +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: python3-%{name} = %{version}-%{release} +# Fix problem with hawkey - dnf version incompatibility +# Can be deleted for distros where only python3-dnf >= 2.0.0 +Conflicts: python3-dnf < %{dnf_conflict} +# Obsoletes F27 packages +Obsoletes: platform-python-hawkey < %{version}-%{release} + +%description -n python3-hawkey +Python 3 bindings for the hawkey library. +%endif + +%prep +%autosetup -p1 +%if %{with python2} +mkdir build-py2 +%endif # with python2 +%if %{with python3} +mkdir build-py3 +%endif + +%build +%if %{with python2} +pushd build-py2 + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python2} -DWITH_MAN=OFF ../ %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} + %make_build +popd +%endif # with python2 + +%if %{with python3} +pushd build-py3 + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python3} -DWITH_GIR=0 -DWITH_MAN=0 -Dgtkdoc=0 ../ %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} + %make_build +popd +%endif + +%check +if [ "$(id -u)" == "0" ] ; then + cat <&2 +Package tests cannot be run under superuser account. +Please build the package as non-root user. +ERROR + exit 1 +fi + +%if %{with python2} +pushd build-py2 + make ARGS="-V" test +popd +%endif # with python2 +%if %{with python3} +# Run just the Python tests, not all of them, since +# we have coverage of the core from the first build +pushd build-py3/python/hawkey/tests + make ARGS="-V" test +popd +%endif + +%install +%if %{with python2} +pushd build-py2 + %make_install +popd +%endif # with python2 +%if %{with python3} +pushd build-py3 + %make_install +popd +%endif + +%find_lang %{name} + +%if 0%{?rhel} && 0%{?rhel} <= 7 +%post -p /sbin/ldconfig +%postun -p /sbin/ldconfig +%else +%ldconfig_scriptlets +%endif + +%files -f %{name}.lang +%license COPYING +%doc README.md AUTHORS +%{_libdir}/%{name}.so.* +%{_libdir}/libdnf/plugins/README + +%files devel +%doc %{_datadir}/gtk-doc/html/%{name}/ +%{_libdir}/%{name}.so +%{_libdir}/pkgconfig/%{name}.pc +%{_includedir}/%{name}/ + +%if %{with python2} +%files -n python2-%{name} +%{python2_sitearch}/%{name}/ +%endif # with python2 + +%if %{with python3} +%files -n python3-%{name} +%{python3_sitearch}/%{name}/ +%endif + +%if %{with python2} +%files -n python2-hawkey +%{python2_sitearch}/hawkey/ +%endif # with python2 + +%if %{with python3} +%files -n python3-hawkey +%{python3_sitearch}/hawkey/ +%endif + +%changelog +* Tue Feb 12 2019 Jaroslav Mracek - 0.22.5-4 +- Backport patch to exclude module pkgs that have conflict (RhBug:1670496) + +* Fri Feb 08 2019 Jaroslav Mracek - 0.22.5-3 +- Backport patches to add support for modular updateinfoxml applicability + +* Wed Feb 06 2019 Pavla Kratochvilova - 0.22.5-2 +- Add patch: Add best as default behavior (RhBug1670776) + +* Mon Dec 17 2018 Daniel Mach - 0.22.4-1 +- Enhance LIBDNF plugins support +- [repo] Check whether metadata cache is expired (RhBug:1539620,1648274) +- [sack] Implement dnf_sack_get_rpmdb_version() + +* Fri Nov 23 2018 Jaroslav Mracek - 0.22.3-1 +- Permanently disable Python2 build for Fedora 30+ +- Update to 0.22.3 +- Modify solver_describe_decision to report cleaned (RhBug:1486749) +- [swdb] create persistent WAL files (RhBug:1640235) +- Relocate ModuleContainer save hook (RhBug:1632518) +- [transaction] Fix transaction item lookup for obsoleted packages (RhBug: 1642796) +- Fix memory leaks and memory allocations +- [repo] Possibility to extend downloaded repository metadata + +* Wed Oct 24 2018 Jaroslav Mracek - 0.22.0-2 +- Add patch Modify-solver_describe_decision-to-report-cleaned-RhBug1486749 +- Add patch swdb-create-persistent-WAL-files-RhBug1640235 +- Add patch Relocate-ModuleContainer-save-hook-RhBug1632518 +- Add patch Test-if-sack-is-present-and-run-save-module-persistor-RhBug1632518 + +* Mon Oct 15 2018 Jaroslav Mracek - 0.22.0-1 +- Fix segfault in repo_internalize_trigger (RhBug:1375895) +- Change sorting of installonly packages (RhBug:1627685) +- [swdb] Fixed pattern searching in history db (RhBug:1635542) +- Check correctly gpg for repomd when refresh is used (RhBug:1636743) +- [conf] Provide additional VectorString methods for compatibility with Python list. +- [plugins] add plugin loading and hooks into libdnf + +* Tue Sep 25 2018 Jaroslav Mracek - 0.20.0-1 +- [module] Report module solver errors +- [module] Enhance module commands and errors +- [transaction] Fixed several problems with SWDB +- Remove unneeded regex URL tests (RhBug:1598336) +- Allow quoted values in ini files (RhBug:1624056) +- Filter out not unique set of solver problems (RhBug:1564369) +- Resolves: rhbz#1614531 - dnf 3.2 does not depsolve correctly +- Resolves: rhbz#1614346 - dnf rollback doesn't work after install/downgrade/upgrade +- bug 1605274 - DNF crashes on * in installation repository URL +- Resolves: rhbz#1623383 - dnf.exceptions.ConfigError: Error parsing ... + +* Mon Sep 10 2018 Jaroslav Mracek - 0.19.1-1 +- Fix compilation errors on gcc-4.8.5 +- [module] Allow module queries on disabled modules (RhBug:1627081) + +* Fri Sep 07 2018 Jaroslav Mracek - 0.19.0-1 +- [query] Reldeps can contain a space char (RhBug:1612462) +- [transaction] Avoid adding duplicates via Transaction::addItem() +- Fix compilation errors on gcc-4.8.5 +- [module] Make available ModuleProfile using SWIG +- [module] Redesign module disable and reset + +* Fri Aug 31 2018 Daniel Mach - 0.18.0-1 +- [repo] Implement GPG key import +- [repo] Introduce Repo class replacing dnf.repo.Repo +- [context] Fix memory corruption in dnf_context +- [rhsm] Fix: RHSM don't write .repo file with same content (RhBug:1600452) +- [module] Create /etc/dnf/modules.d if it doesn't exist. +- [module] Forward C++ exceptions to bindings. + +* Thu Aug 16 2018 Daniel Mach - 0.17.2-2 +- [module] Create /etc/dnf/modules.d if it doesn't exist. +- [module] Forward C++ exceptions to bindings. + +* Mon Aug 13 2018 Daniel Mach - 0.17.2-1 +- [sqlite3] Change db locking mode to DEFAULT. +- [doc] Add libsmartcols-devel to devel deps. + +* Mon Aug 13 2018 Daniel Mach - 0.17.1-1 +- [module] Solve a problem in python constructor of NSVCAP if no version. +- [translations] Update translations from zanata. +- [transaction] Fix crash after using dnf.comps.CompsQuery and forking the process in Anaconda. +- [module] Support for resetting module state. +- [output] Introduce wrapper for smartcols. + +* Tue Aug 07 2018 Daniel Mach - 0.17.0-1 +- [conf] Add module_platform_id option. +- [module] Add ModulePackageContainer class. +- [module] Add ModulePersistor class. +- [sack] Module filtering made available in python API +- [sack] Module auto-enabling according to installed packages + +* Fri Jul 27 2018 Daniel Mach - 0.16.1-1 +- [module] Implement 'module_hotfixes' conf option to skip filtering RPMs from hotfix repos. +- [goal] Fix distupgrade filter, allow downgrades. +- [context] Allow to set module platform in context. +- [module] Introduce proper modular dependency solving. +- [module] Platform pseudo-module based on /etc/os-release. +- [goal] Add Goal::listSuggested(). +- [l10n] Support for translations, add gettext build dependency. + +* Sun Jul 22 2018 Daniel Mach - 0.16.0-1 +- Fix RHSM plugin +- Add support for logging +- Bump minimal libmodulemd version to 1.6.1 + +* Mon Jul 09 2018 Igor Gnatenko - 0.15.2-2 +- Fix librhsm support logic + +* Fri Jun 29 2018 Jaroslav Mracek - 0.15.2-1 +- Update to 0.15.1 +- Resolves: rhbz#1595487 + +* Fri Jun 29 2018 Igor Gnatenko - 0.15.1-2 +- Restore proper ldconfig_scriptlets + +* Tue Jun 26 2018 Jaroslav Mracek - 0.15.1-1 +- Update to 0.15.1 + +* Fri Jun 15 2018 Miro Hrončok - 0.11.1-6 +- Rebuilt for Python 3.7 + +* Wed Feb 07 2018 Fedora Release Engineering - 0.11.1-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Tue Jan 30 2018 Igor Gnatenko - 0.11.1-4 +- Switch to %%ldconfig_scriptlets + +* Tue Nov 07 2017 Igor Gnatenko - 0.11.1-3 +- Use better Obsoletes for platform-python + +* Fri Nov 03 2017 Igor Gnatenko - 0.11.1-2 +- Remove platform-python subpackage + +* Mon Oct 16 2017 Jaroslav Mracek - 0.11.1-1 +- Rerelease of 0.11.1-1 +- Improvement query performance +- Run file query in hy_subject_get_best_solution only for files (arguments that start with ``/`` or + ``*/``) +- Resolves: rhbz#1498207 - DNF crash during upgrade installation F26 -> F27 + +* Tue Oct 10 2017 Igor Gnatenko - 0.11.0-1 +- Update to 0.11.0 + +* Mon Oct 02 2017 Jaroslav Mracek - 0.10.1-2 +- Rerelease of 0.10.1-1 + +* Wed Sep 27 2017 Jaroslav Mracek - 0.10.1-1 +- Update to 0.10.1 +- It improves query performance with name and arch filters. Also nevra filter will now + handle string with or without epoch. +- Additionally for python bindings it renames NEVRA._has_just_name() to NEVRA.has_just_name() due + to movement of code into c part of library. +- Resolves: rhbz#1260242 - --exclude does not affect dnf remove's removal of requirements +- Resolves: rhbz#1485881 - DNF claims it cannot install package, which have been already installed +- Resolves: rhbz#1361187 - [abrt] python-ipython-console: filter_updown(): python3.5 killed by SIGABRT + +* Fri Sep 15 2017 Igor Gnatenko - 0.9.3-8 +- Disable platform python on old releases + +* Tue Aug 15 2017 Lumír Balhar - 0.9.3-7 +- Add platform-python subpackage + +* Fri Aug 11 2017 Igor Gnatenko - 0.9.3-6 +- Rebuilt after RPM update (№ 3) + +* Thu Aug 10 2017 Igor Gnatenko - 0.9.3-5 +- Rebuilt for RPM soname bump + +* Thu Aug 10 2017 Igor Gnatenko - 0.9.3-4 +- Rebuilt for RPM soname bump + +* Thu Aug 03 2017 Fedora Release Engineering - 0.9.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 0.9.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Mon Jul 24 2017 Jaroslav Mracek - 0.9.3-1 +- Update to 0.9.3 + +* Sat Jul 01 2017 Igor Gnatenko - 0.9.2-1 +- Update to 0.9.2 + +* Mon Jun 12 2017 Jaroslav Mracek - 0.9.1-1 +- Update to 0.9.1 + +* Mon May 22 2017 Jaroslav Mracek - 0.9.0-1 +- Update to 0.9.0 + +* Tue May 02 2017 Jaroslav Mracek - 0.8.2-1 +- Update to 0.8.2 + +* Fri Mar 24 2017 Igor Gnatenko - 0.8.1-1 +- Update to 0.8.1 + +* Tue Mar 21 2017 Jaroslav Mracek - 0.8.0-1 +- Update to 0.8.0 + +* Mon Feb 20 2017 Igor Gnatenko - 0.7.4-1 +- Update to 0.7.4 + +* Fri Feb 10 2017 Igor Gnatenko - 0.7.3-1 +- Update to 0.7.3 + +* Wed Feb 08 2017 Igor Gnatenko - 0.7.2-1 +- 0.7.2 + +* Fri Jan 06 2017 Igor Gnatenko - 0.7.1-1 +- 0.7.1 + +* Wed Dec 21 2016 Peter Robinson 0.7.0-0.7gitf9b798c +- Rebuild for Python 3.6 + +* Mon Dec 19 2016 Igor Gnatenko - 0.7.0-0.6gitf9b798c +- Use new upstream URL + +* Tue Dec 13 2016 Stratakis Charalampos - 0.7.0-0.5gitf9b798c +- Rebuild for Python 3.6 + +* Tue Dec 06 2016 Martin Hatina - 0.7.0-0.4gitf9b798c +- Increase conflict version of dnf + +* Thu Dec 01 2016 Igor Gnatenko - 0.7.0-0.3gitf9b798c +- Update to latest snapshot + +* Fri Nov 04 2016 Igor Gnatenko - 0.7.0-0.2git8bd77f8 +- Update to latest snapshot + +* Thu Sep 29 2016 Igor Gnatenko - 0.7.0-0.1git179c0a6 +- Initial package