Patchwork [bitbake-devel,2/2,v2] utils.py: Allow explode_dep_versions comparisons to have arbitrary whitespace

login
register
mail settings
Submitter Mark Hatle
Date Sept. 30, 2012, 12:01 a.m.
Message ID <1348963305-26122-2-git-send-email-mark.hatle@windriver.com>
Download mbox | patch
Permalink /patch/37479/
State Accepted
Commit 39c1c12c58fadd854098cf14ebe92f4d307a36dd
Headers show

Comments

Mark Hatle - Sept. 30, 2012, 12:01 a.m.
Refactor the explode_dep_versions to be more lenient on whitespace values.

The required format is:
   foo (= 1.10)
   foo (=1.10)
   foo ( = 1.10)
   foo ( =1.10)
   foo ( = 1.10 )
   foo ( =1.10 )

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

Patch

diff --git a/lib/bb/utils.py b/lib/bb/utils.py
index d032ab2..a537338 100644
--- a/lib/bb/utils.py
+++ b/lib/bb/utils.py
@@ -147,26 +147,58 @@  def explode_dep_versions(s):
     r = {}
     l = s.replace(",", "").split()
     lastdep = None
+    lastcmp = ""
     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 "")
-            if lastdep in r and r[lastdep] and r[lastdep] != lastver:
-                raise ValueError("Error, item %s appeared in dependency string '%s' multiple times with different values.  explode_dep_versions cannot cope with this." % (lastdep, s))
-            r[lastdep] = lastver
-        elif not inversion:
-            if not (i in r and r[i]):
-                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(('<=', '=<', '<<', '==', '!=', '>=', '=>', '>>')):
+                lastcmp = i[0:2]
+                i = i[2:]
+            elif i.startswith(('<', '>', '=')):
+                lastcmp = i[0:1]
+                i = i[1:]
+            else:
+                # This is an unsupported case!
+                lastcmp = (i or "")
+                i = ""
+            i.strip()
+            if not i:
+                continue
+
+        if inversion:
+            if i.endswith(')'):
+                i = i[:-1] or ""
+                inversion = False
+                if lastver and i:
+                    lastver += " "
+            if i:
+                lastver += i
+                if lastdep in r and r[lastdep] and r[lastdep] != lastver:
+                    raise ValueError("Error, item %s appeared in dependency string '%s' multiple times with different values.  explode_dep_versions cannot cope with this." % (lastdep, s))
+                r[lastdep] = lastcmp + " " + lastver
+            continue
+
+        #if not inversion:
+        lastdep = i
+        lastver = ""
+        lastcmp = ""
+        if not (i in r and r[i]):
+            r[lastdep] = None
 
     return r