Patchwork [bitbake-devel,2/2] utils.py: explode_dep_version - add ability to deal with whitespace

login
register
mail settings
Submitter Mark Hatle
Date Sept. 28, 2012, 5:27 p.m.
Message ID <1348853270-29676-2-git-send-email-mark.hatle@windriver.com>
Download mbox | patch
Permalink /patch/37451/
State New
Headers show

Comments

Mark Hatle - Sept. 28, 2012, 5:27 p.m.
Add the ability to deal with arbitrary whitespace.  Support the comparison
operators of: <, >, =, <=, >=, =<, =>, <<, >>, ==, and !=.

This list was generated based on behavior of deb, opkg and rpm.

Note, In OE the last six are not expected to be supported, but someone
may try to use them.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 lib/bb/utils.py |   56 +++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 42 insertions(+), 14 deletions(-)

Patch

diff --git a/lib/bb/utils.py b/lib/bb/utils.py
index fa5d2ab..3a18a39 100644
--- a/lib/bb/utils.py
+++ b/lib/bb/utils.py
@@ -148,24 +148,52 @@  def explode_dep_versions(s):
     l = s.replace(",", "").split()
     lastdep = None
     lastver = ""
+    incmp = False
     inversion = False
     for i in l:
         if i[0] == '(':
+            incmp = True
+            i = i[1:].strip()
+            if not i:
+                continue
+
+        if incmp:
+            incmp = False
             inversion = True
-            lastver = i[1:] or ""
-            #j = []
-        elif inversion and i.endswith(')'):
-            inversion = False
-            lastver = lastver + " " + (i[:-1] or "")
-            r[lastdep] = lastver
-        elif not inversion:
-            if i in r:
-                raise ValueError("Error, item %s appeared in dependency string '%s' multiple times.  explode_dep_versions cannot cope with this." % (i, s))
-            r[i] = None
-            lastdep = i
-            lastver = ""
-        elif inversion:
-            lastver = lastver + " " + i
+            # This list is based on behavior and supported comparisons from deb, opkg and rpm.
+            #
+            # Even though =<, <<, ==, !=, =>, and >> may not be supported, 
+            # we list each possibly valid item. 
+            # The build system is responsible for validation of what it supports.
+            if i.startswith(('<=', '=<', '<<', '==', '!=', '>=', '=>', '>>')):
+                lastver = i[0:2]
+                i = i[2:]
+            elif i.startswith(('<', '>', '=')):
+                lastver = i[0:1]
+                i = i[1:]
+            else:
+                # This is an unsupported case!
+                lastver = (i or "")
+                i = ""
+            i.strip()
+            if not i:
+                continue
+
+        if inversion:
+            if i.endswith(')'):
+                i = i[:-1] or ""
+                inversion = False
+            if i:
+                lastver = lastver + " " + (i or "")
+                r[lastdep] = lastver
+            continue
+
+        #if not inversion:
+        if i in r:
+            raise ValueError("Error, item %s appeared in dependency string '%s' multiple times.  explode_dep_versions cannot cope with this." % (i, s))
+        r[i] = None
+        lastdep = i
+        lastver = ""
 
     return r