From 227cf617dd6afd7583f1c864c66ba2ca95e3d09d Mon Sep 17 00:00:00 2001 From: Pavla Kratochvilova Date: Wed, 24 Jun 2020 08:48:49 +0200 Subject: [PATCH 1/2] Accept '==' as an operator in reldeps (RhBug:1847946) Although rpm doesn't support this and using '==' can result in an unexpected behavior, libdnf accepted '==' by mistake for some time and other tools (namely Ansible Tower) already rely on it. This brings back the '==' support with a deprecation warning. https://bugzilla.redhat.com/show_bug.cgi?id=1847946 --- libdnf/repo/DependencySplitter.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/libdnf/repo/DependencySplitter.cpp b/libdnf/repo/DependencySplitter.cpp index 0030ea6d3..402962286 100644 --- a/libdnf/repo/DependencySplitter.cpp +++ b/libdnf/repo/DependencySplitter.cpp @@ -20,16 +20,21 @@ #include "DependencySplitter.hpp" #include "../dnf-sack.h" +#include "../log.hpp" #include "../utils/regex/regex.hpp" +#include "bgettext/bgettext-lib.h" +#include "tinyformat/tinyformat.hpp" + namespace libdnf { static const Regex RELDEP_REGEX = - Regex("^(\\S*)\\s*(<=|>=|<|>|=)?\\s*(\\S*)$", REG_EXTENDED); + Regex("^(\\S*)\\s*(<=|>=|<|>|=|==)?\\s*(\\S*)$", REG_EXTENDED); static bool getCmpFlags(int *cmp_type, std::string matchCmpType) { + auto logger(Log::getLogger()); int subexpr_len = matchCmpType.size(); auto match_start = matchCmpType.c_str(); if (subexpr_len == 2) { @@ -41,6 +46,13 @@ getCmpFlags(int *cmp_type, std::string matchCmpType) *cmp_type |= HY_GT; *cmp_type |= HY_EQ; } + else if (strncmp(match_start, "==", 2) == 0) { + auto msg = tfm::format(_("Using '==' operator in reldeps can result in an undefined " + "behavior. It is deprecated and the support will be dropped " + "in future versions. Use '=' operator instead.")); + logger->warning(msg); + *cmp_type |= HY_EQ; + } else return false; } else if (subexpr_len == 1) { From 1f9b14f1d30113a602e18f60ef7ba1f11aead10f Mon Sep 17 00:00:00 2001 From: Pavla Kratochvilova Date: Wed, 24 Jun 2020 13:08:48 +0200 Subject: [PATCH 2/2] Add tests for '==' operator in reldeps --- python/hawkey/tests/tests/test_reldep.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/python/hawkey/tests/tests/test_reldep.py b/python/hawkey/tests/tests/test_reldep.py index 8b479cfd7..a9f6cae6f 100644 --- a/python/hawkey/tests/tests/test_reldep.py +++ b/python/hawkey/tests/tests/test_reldep.py @@ -61,6 +61,11 @@ def test_custom_querying(self): reldep = hawkey.Reldep(self.sack, "P-lib = 3-3") q = hawkey.Query(self.sack).filter(provides=reldep) self.assertLength(q, 1) + # '==' operator is deprecated and the support will be dropped in future + # versions (see bug 1847946) + reldep = hawkey.Reldep(self.sack, "P-lib == 3-3") + q = hawkey.Query(self.sack).filter(provides=reldep) + self.assertLength(q, 1) reldep = hawkey.Reldep(self.sack, "P-lib >= 3") q = hawkey.Query(self.sack).filter(provides=reldep) self.assertLength(q, 1)