diff options
-rw-r--r-- | lib/bb/cooker.py | 40 | ||||
-rw-r--r-- | lib/bb/tests/utils.py | 33 | ||||
-rw-r--r-- | lib/bb/utils.py | 22 |
3 files changed, 69 insertions, 26 deletions
diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py index f77c6c053..0bbbc09c3 100644 --- a/lib/bb/cooker.py +++ b/lib/bb/cooker.py @@ -1096,42 +1096,30 @@ class BBCooker: # Check dependencies and store information for priority calculation deps = self.data.getVar("LAYERDEPENDS_%s" % c, True) if deps: - depnamelist = [] - deplist = deps.split() - for dep in deplist: - depsplit = dep.split(':') - if len(depsplit) > 1: - try: - depver = int(depsplit[1]) - except ValueError: - parselog.error("invalid version value in LAYERDEPENDS_%s: \"%s\"", c, dep) - errors = True - continue - else: - depver = None - dep = depsplit[0] - depnamelist.append(dep) - + try: + deplist = bb.utils.explode_dep_versions2(deps) + except bb.utils.VersionStringException as vse: + bb.fatal('Error parsing LAYERDEPENDS_%s: %s' % (c, str(vse))) + for dep, oplist in deplist.iteritems(): if dep in collection_list: - if depver: + for opstr in oplist: layerver = self.data.getVar("LAYERVERSION_%s" % dep, True) + (op, depver) = opstr.split() if layerver: try: - lver = int(layerver) - except ValueError: - parselog.error("invalid value for LAYERVERSION_%s: \"%s\"", c, layerver) - errors = True - continue - if lver != depver: - parselog.error("Layer '%s' depends on version %d of layer '%s', but version %d is enabled in your configuration", c, depver, dep, lver) + res = bb.utils.vercmp_string_op(layerver, depver, op) + except bb.utils.VersionStringException as vse: + bb.fatal('Error parsing LAYERDEPENDS_%s: %s' % (c, str(vse))) + if not res: + parselog.error("Layer '%s' depends on version %s of layer '%s', but version %s is currently enabled in your configuration. Check that you are using the correct matching versions/branches of these two layers.", c, opstr, dep, layerver) errors = True else: - parselog.error("Layer '%s' depends on version %d of layer '%s', which exists in your configuration but does not specify a version", c, depver, dep) + parselog.error("Layer '%s' depends on version %s of layer '%s', which exists in your configuration but does not specify a version. Check that you are using the correct matching versions/branches of these two layers.", c, opstr, dep) errors = True else: parselog.error("Layer '%s' depends on layer '%s', but this layer is not enabled in your configuration", c, dep) errors = True - collection_depends[c] = depnamelist + collection_depends[c] = deplist.keys() else: collection_depends[c] = [] diff --git a/lib/bb/tests/utils.py b/lib/bb/tests/utils.py index cf145f0d7..507de2de3 100644 --- a/lib/bb/tests/utils.py +++ b/lib/bb/tests/utils.py @@ -55,3 +55,36 @@ class VerCmpString(unittest.TestCase): result = bb.utils.explode_dep_versions2("foo ( =1.10 )") self.assertEqual(result, correctresult) + def test_vercmp_string_op(self): + compareops = [('1', '1', '=', True), + ('1', '1', '==', True), + ('1', '1', '!=', False), + ('1', '1', '>', False), + ('1', '1', '<', False), + ('1', '1', '>=', True), + ('1', '1', '<=', True), + ('1', '0', '=', False), + ('1', '0', '==', False), + ('1', '0', '!=', True), + ('1', '0', '>', True), + ('1', '0', '<', False), + ('1', '0', '>>', True), + ('1', '0', '<<', False), + ('1', '0', '>=', True), + ('1', '0', '<=', False), + ('0', '1', '=', False), + ('0', '1', '==', False), + ('0', '1', '!=', True), + ('0', '1', '>', False), + ('0', '1', '<', True), + ('0', '1', '>>', False), + ('0', '1', '<<', True), + ('0', '1', '>=', False), + ('0', '1', '<=', True)] + + for arg1, arg2, op, correctresult in compareops: + result = bb.utils.vercmp_string_op(arg1, arg2, op) + self.assertEqual(result, correctresult, 'vercmp_string_op("%s", "%s", "%s") != %s' % (arg1, arg2, op, correctresult)) + + # Check that clearly invalid operator raises an exception + self.assertRaises(bb.utils.VersionStringException, bb.utils.vercmp_string_op, '0', '0', '$') diff --git a/lib/bb/utils.py b/lib/bb/utils.py index 7ba123457..5ac9bcfbd 100644 --- a/lib/bb/utils.py +++ b/lib/bb/utils.py @@ -131,6 +131,28 @@ def vercmp_string(a, b): tb = split_version(b) return vercmp(ta, tb) +def vercmp_string_op(a, b, op): + """ + Compare two versions and check if the specified comparison operator matches the result of the comparison. + This function is fairly liberal about what operators it will accept since there are a variety of styles + depending on the context. + """ + res = vercmp_string(a, b) + if op in ('=', '=='): + return res == 0 + elif op == '<=': + return res <= 0 + elif op == '>=': + return res >= 0 + elif op in ('>', '>>'): + return res > 0 + elif op in ('<', '<<'): + return res < 0 + elif op == '!=': + return res != 0 + else: + raise VersionStringException('Unsupported comparison operator "%s"' % op) + def explode_deps(s): """ Take an RDEPENDS style string of format: |