Skip to contentSkip to conversation

classes: Update to use corrected bb.utils.explode_dep_versions2 API

PATCH In review Richard Purdie 2 participants 3 messages Oct 2, 2012

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 classes: Update to use corrected bb.utils.explode_dep_versions2 API

The bb.utils.explode_dep_versions function has issues where dependency information can be lost. The API doesn't support maintaining the correct information so this changes to use a new function which correctly handles the data.

---
NB: This applies on top of Mark's patch and reverts some components of it. When it comes to finally applying it, I may squash them together.

meta/classes/insane.bbclass +5 -4
index dddcd66..4f87c93 100644
@@ -656,14 +656,15 @@ def package_qa_check_deps(pkg, pkgdest, skip, d):
     def check_valid_deps(var):
         sane = True
         try:
-            rvar = bb.utils.explode_dep_versions(localdata.getVar(var, True) or "")
+            rvar = bb.utils.explode_dep_versions2(localdata.getVar(var, True) or "")
         except ValueError as e:
             bb.fatal("%s_%s: %s" % (var, pkg, e))
             raise e
         for dep in rvar:
-            if rvar[dep] and not rvar[dep].startswith(('< ', '= ', '> ', '<= ', '>=')):
-                error_msg = "%s_%s is invalid: %s (%s)   only comparisons <, =, >, <=, and >= are allowed" % (var, pkg, dep, rvar[dep])
-                sane = package_qa_handle_error("dep-cmp", error_msg, d)
+            for v in rvar[dep]:
+                if v and not v.startswith(('< ', '= ', '> ', '<= ', '>=')):
+                    error_msg = "%s_%s is invalid: %s (%s)   only comparisons <, =, >, <=, and >= are allowed" % (var, pkg, dep, v)
+                    sane = package_qa_handle_error("dep-cmp", error_msg, d)
         return sane
 
     sane = True
meta/classes/kernel.bbclass +3 -9
index 878fd6c..36bc3c7 100644
@@ -20,13 +20,6 @@ python __anonymous () {
     image = d.getVar('INITRAMFS_IMAGE', True)
     if image:
         d.setVar('INITRAMFS_TASK', '${INITRAMFS_IMAGE}:do_rootfs')
-
-    # RPROVIDES_kernel-base += "kernel-${KERNEL_VERSION}"
-    rprovides = bb.utils.explode_dep_versions(d.getVar("RPROVIDES_kernel-base", True) or "")
-    dep = d.expand("kernel-${KERNEL_VERSION}")
-    if not dep in rprovides:
-        rprovides[dep] = ""
-    d.setVar("RPROVIDES_kernel-base", bb.utils.join_deps(rprovides, commasep=False))
 }
 
 inherit kernel-arch deploy
@@ -276,6 +269,7 @@ RDEPENDS_kernel = "kernel-base"
 RDEPENDS_kernel-base ?= "kernel-image"
 PKG_kernel-image = "kernel-image-${@legitimize_package_name('${KERNEL_VERSION}')}"
 PKG_kernel-base = "kernel-${@legitimize_package_name('${KERNEL_VERSION}')}"
+RPROVIDES_kernel-base += "kernel-${KERNEL_VERSION}"
 ALLOW_EMPTY_kernel = "1"
 ALLOW_EMPTY_kernel-base = "1"
 ALLOW_EMPTY_kernel-image = "1"
@@ -435,10 +429,10 @@ python populate_packages_prepend () {
             old_desc = d.getVar('DESCRIPTION_' + pkg, True) or ""
             d.setVar('DESCRIPTION_' + pkg, old_desc + "; " + vals["description"])
 
-        rdepends = bb.utils.explode_dep_versions(d.getVar('RDEPENDS_' + pkg, True) or "")
+        rdepends = bb.utils.explode_dep_versions2(d.getVar('RDEPENDS_' + pkg, True) or "")
         for dep in get_dependencies(file, pattern, format):
             if not dep in rdepends:
-                rdepends[dep] = ""
+                rdepends[dep] = []
         d.setVar('RDEPENDS_' + pkg, bb.utils.join_deps(rdepends, commasep=False))
 
     module_deps = parse_depmod()
meta/classes/libc-common.bbclass +3 -10
index dc32c81..0f49936 100644
@@ -29,14 +29,7 @@ python populate_packages_prepend () {
         d.setVar('PKG_'+bpn+'-dev', 'libc6-dev')
         d.setVar('PKG_'+bpn+'-dbg', 'libc6-dbg')
         # For backward compatibility with old -dbg package
-
-        def add_dep(var, dep):
-            deps = bb.utils.explode_dep_versions(d.getVar(var + '_' + bpn, True) or "")
-            if not dep in deps:
-                deps[dep] = ""
-                d.setVar(var + '_' + bpn, bb.utils.join_deps(deps, commasep=False))
-
-        add_dep('RPROVIDES', 'libc-dbg')
-        add_dep('RCONFLICTS', 'libc-dbg')
-        add_dep('RREPLACES', 'libc-dbg')
+        d.appendVar('RPROVIDES_' + bpn + '-dbg', ' libc-dbg')
+        d.appendVar('RCONFLICTS_' + bpn + '-dbg', ' libc-dbg')
+        d.appendVar('RREPLACES_' + bpn + '-dbg', ' libc-dbg')
 }
meta/classes/multilib.bbclass +2 -2
index f162293..eaaad5f 100644
@@ -85,9 +85,9 @@ PACKAGEFUNCS_append = "do_package_qa_multilib"
 python do_package_qa_multilib() {
 
     def check_mlprefix(pkg, var, mlprefix):
-        values = bb.utils.explode_dep_versions(d.getVar('%s_%s' % (var, pkg), True) or d.getVar(var, True) or "")
+        values = bb.utils.explode_deps(d.getVar('%s_%s' % (var, pkg), True) or d.getVar(var, True) or "")
         candidates = []
-        for i in values.keys():
+        for i in values:
             if i.startswith('virtual/'):
                 i = i[len('virtual/'):]
             if (not i.startswith('kernel-module')) and (not i.startswith(mlprefix)):
meta/classes/package.bbclass +18 -28

116 lines not on this page · raw message

meta/classes/package_deb.bbclass +11 -10
index a25e5d7..d273cb0 100644
@@ -341,28 +341,29 @@ python do_package_deb () {
             # adjust these to the '<<' and '>>' equivalents
             #
             for dep in var:
-                if (var[dep] or "").startswith("< "):
-                    var[dep] = var[dep].replace("< ", "<< ")
-                elif (var[dep] or "").startswith("> "):
-                    var[dep] = var[dep].replace("> ", ">> ")
+                for i, v in enumerate(var[dep]):
+                    if (v or "").startswith("< "):
+                        var[dep][i] = var[dep][i].replace("< ", "<< ")
+                    elif (v or "").startswith("> "):
+                        var[dep][i] = var[dep][i].replace("> ", ">> ")
 
-        rdepends = bb.utils.explode_dep_versions(localdata.getVar("RDEPENDS", True) or "")
+        rdepends = bb.utils.explode_dep_versions2(localdata.getVar("RDEPENDS", True) or "")
         debian_cmp_remap(rdepends)
         for dep in rdepends:
                 if '*' in dep:
                         del rdepends[dep]
-        rrecommends = bb.utils.explode_dep_versions(localdata.getVar("RRECOMMENDS", True) or "")
+        rrecommends = bb.utils.explode_dep_versions2(localdata.getVar("RRECOMMENDS", True) or "")
         debian_cmp_remap(rrecommends)
         for dep in rrecommends:
                 if '*' in dep:
                         del rrecommends[dep]
-        rsuggests = bb.utils.explode_dep_versions(localdata.getVar("RSUGGESTS", True) or "")
+        rsuggests = bb.utils.explode_dep_versions2(localdata.getVar("RSUGGESTS", True) or "")
         debian_cmp_remap(rsuggests)
-        rprovides = bb.utils.explode_dep_versions(localdata.getVar("RPROVIDES", True) or "")
+        rprovides = bb.utils.explode_dep_versions2(localdata.getVar("RPROVIDES", True) or "")
         debian_cmp_remap(rprovides)
-        rreplaces = bb.utils.explode_dep_versions(localdata.getVar("RREPLACES", True) or "")
+        rreplaces = bb.utils.explode_dep_versions2(localdata.getVar("RREPLACES", True) or "")
         debian_cmp_remap(rreplaces)
-        rconflicts = bb.utils.explode_dep_versions(localdata.getVar("RCONFLICTS", True) or "")
+        rconflicts = bb.utils.explode_dep_versions2(localdata.getVar("RCONFLICTS", True) or "")
         debian_cmp_remap(rconflicts)
         if rdepends:
             ctrlfile.write("Depends: %s\n" % unicode(bb.utils.join_deps(rdepends)))
meta/classes/package_ipk.bbclass +11 -10
index 281ce59..019bd7c 100644
@@ -379,22 +379,23 @@ python do_package_ipk () {
             # adjust these to the '<<' and '>>' equivalents
             #
             for dep in var:
-                if (var[dep] or "").startswith("< "):
-                    var[dep] = var[dep].replace("< ", "<< ")
-                elif (var[dep] or "").startswith("> "):
-                    var[dep] = var[dep].replace("> ", ">> ")
+                for i, v in enumerate(var[dep]):
+                    if (v or "").startswith("< "):
+                        var[dep][i] = var[dep][i].replace("< ", "<< ")
+                    elif (v or "").startswith("> "):
+                        var[dep][i] = var[dep][i].replace("> ", ">> ")
 
-        rdepends = bb.utils.explode_dep_versions(localdata.getVar("RDEPENDS", True) or "")
+        rdepends = bb.utils.explode_dep_versions2(localdata.getVar("RDEPENDS", True) or "")
         debian_cmp_remap(rdepends)
-        rrecommends = bb.utils.explode_dep_versions(localdata.getVar("RRECOMMENDS", True) or "")
+        rrecommends = bb.utils.explode_dep_versions2(localdata.getVar("RRECOMMENDS", True) or "")
         debian_cmp_remap(rrecommends)
-        rsuggests = bb.utils.explode_dep_versions(localdata.getVar("RSUGGESTS", True) or "")
+        rsuggests = bb.utils.explode_dep_versions2(localdata.getVar("RSUGGESTS", True) or "")
         debian_cmp_remap(rsuggests)
-        rprovides = bb.utils.explode_dep_versions(localdata.getVar("RPROVIDES", True) or "")
+        rprovides = bb.utils.explode_dep_versions2(localdata.getVar("RPROVIDES", True) or "")
         debian_cmp_remap(rprovides)
-        rreplaces = bb.utils.explode_dep_versions(localdata.getVar("RREPLACES", True) or "")
+        rreplaces = bb.utils.explode_dep_versions2(localdata.getVar("RREPLACES", True) or "")
         debian_cmp_remap(rreplaces)
-        rconflicts = bb.utils.explode_dep_versions(localdata.getVar("RCONFLICTS", True) or "")
+        rconflicts = bb.utils.explode_dep_versions2(localdata.getVar("RCONFLICTS", True) or "")
         debian_cmp_remap(rconflicts)
 
         if rdepends:
meta/classes/package_rpm.bbclass +19 -18
index 6256d6f..c491775 100644
@@ -609,7 +609,7 @@ python write_specfile () {
         return name
 
     def strip_multilib_deps(deps, d):
-        depends = bb.utils.explode_dep_versions(deps or "")
+        depends = bb.utils.explode_dep_versions2(deps or "")
         newdeps = {}
         for dep in depends:
             newdeps[strip_multilib(dep, d)] = depends[dep]
@@ -637,18 +637,20 @@ python write_specfile () {
     def translate_vers(varname, d):
         depends = d.getVar(varname, True)
         if depends:
-            depends_dict = bb.utils.explode_dep_versions(depends)
+            depends_dict = bb.utils.explode_dep_versions2(depends)
             newdeps_dict = {}
             for dep in depends_dict:
-                ver = depends_dict[dep]
-                if dep and ver:
+                verlist = []
+                for ver in depends_dict[dep]:
                     if '-' in ver:
                         subd = oe.packagedata.read_subpkgdata_dict(dep, d)
                         if 'PKGV' in subd:
                             pv = subd['PKGV']
                             reppv = pv.replace('-', '+')
-                            ver = ver.replace(pv, reppv)
-                newdeps_dict[dep] = ver
+                            verlist.append(ver.replace(pv, reppv))
+                    else:
+                        verlist.append(ver)
+                newdeps_dict[dep] = verlist
             depends = bb.utils.join_deps(newdeps_dict)
             d.setVar(varname, depends.strip())
 
@@ -657,14 +659,13 @@ python write_specfile () {
     def print_deps(variable, tag, array, d):
         depends = variable
         if depends:
-            depends_dict = bb.utils.explode_dep_versions(depends)
+            depends_dict = bb.utils.explode_dep_versions2(depends)
             for dep in depends_dict:
-                ver = depends_dict[dep]
-                if dep and ver:
+                for ver in depends_dict[dep]:
                     ver = ver.replace('(', '')
                     ver = ver.replace(')', '')
                     array.append("%s: %s %s" % (tag, dep, ver))
-                else:
+                if not len(depends_dict[dep]):
                     array.append("%s: %s" % (tag, dep))
 
     def walk_files(walkpath, target, conffiles):
@@ -833,9 +834,9 @@ python write_specfile () {
         spec_preamble_bottom.append('Group: %s' % splitsection)
 
         # Replaces == Obsoletes && Provides
-        robsoletes = bb.utils.explode_dep_versions(splitrobsoletes or "")
-        rprovides = bb.utils.explode_dep_versions(splitrprovides or "")
-        rreplaces = bb.utils.explode_dep_versions(splitrreplaces or "")
+        robsoletes = bb.utils.explode_dep_versions2(splitrobsoletes or "")
+        rprovides = bb.utils.explode_dep_versions2(splitrprovides or "")
+        rreplaces = bb.utils.explode_dep_versions2(splitrreplaces or "")
         for dep in rreplaces:
             if not dep in robsoletes:
                 robsoletes[dep] = rreplaces[dep]
@@ -854,7 +855,7 @@ python write_specfile () {
 
         # conflicts can not be in a provide!  We will need to filter it.
         if splitrconflicts:
-            depends_dict = bb.utils.explode_dep_versions(splitrconflicts)
+            depends_dict = bb.utils.explode_dep_versions2(splitrconflicts)
             newdeps_dict = {}
             for dep in depends_dict:
                 if dep not in splitrprovides:
@@ -925,9 +926,9 @@ python write_specfile () {
     tail_source(d)
 
     # Replaces == Obsoletes && Provides
-    robsoletes = bb.utils.explode_dep_versions(srcrobsoletes or "")
-    rprovides = bb.utils.explode_dep_versions(srcrprovides or "")
-    rreplaces = bb.utils.explode_dep_versions(srcrreplaces or "")
+    robsoletes = bb.utils.explode_dep_versions2(srcrobsoletes or "")
+    rprovides = bb.utils.explode_dep_versions2(srcrprovides or "")
+    rreplaces = bb.utils.explode_dep_versions2(srcrreplaces or "")
     for dep in rreplaces:
         if not dep in robsoletes:
             robsoletes[dep] = rreplaces[dep]
@@ -947,7 +948,7 @@ python write_specfile () {
     
     # conflicts can not be in a provide!  We will need to filter it.
     if srcrconflicts:
-        depends_dict = bb.utils.explode_dep_versions(srcrconflicts)
+        depends_dict = bb.utils.explode_dep_versions2(srcrconflicts)
         newdeps_dict = {}
         for dep in depends_dict:
             if dep not in srcrprovides:
#1 lore raw
Quoted 18 lines · Richard Purdie

The bb.utils.explode_dep_versions function has issues where dependency information can be lost. The API doesn't support maintaining the correct information so this changes to use a new function which correctly handles the data.

meta/classes/libc-common.bbclass +0 -4
index dc32c81..0f49936 100644
@@ -29,14 +29,7 @@ python populate_packages_prepend () {
          d.setVar('PKG_'+bpn+'-dev', 'libc6-dev')
          d.setVar('PKG_'+bpn+'-dbg', 'libc6-dbg')
          # For backward compatibility with old -dbg package
-
-        def add_dep(var, dep):
-            deps = bb.utils.explode_dep_versions(d.getVar(var + '_' + bpn, True) or "")
-            if not dep in deps:

meta/classes/libc-common.bbclass python populate_packages_prepend () { · line 35

Quoted 10 lines
meta/classes/libc-common.bbclass +3 -6
-                deps[dep] = ""
-                d.setVar(var + '_' + bpn, bb.utils.join_deps(deps, commasep=False))
-
-        add_dep('RPROVIDES', 'libc-dbg')
-        add_dep('RCONFLICTS', 'libc-dbg')
-        add_dep('RREPLACES', 'libc-dbg')
+        d.appendVar('RPROVIDES_' + bpn + '-dbg', ' libc-dbg')
+        d.appendVar('RCONFLICTS_' + bpn + '-dbg', ' libc-dbg')
+        d.appendVar('RREPLACES_' + bpn + '-dbg', ' libc-dbg')
  }

The above is almost the same as the original code. The problem with appendVar is that then you get duplicate entries. With the new code, I know we won't get exceptions, but do we really want the duplicates?

Everything else looks good.

--Mark

#2 lore raw
Quoted 34 lines · Mark Hatle
Quoted 18 lines · Richard Purdie

The bb.utils.explode_dep_versions function has issues where dependency information can be lost. The API doesn't support maintaining the correct information so this changes to use a new function which correctly handles the data.

meta/classes/libc-common.bbclass +0 -4
index dc32c81..0f49936 100644
@@ -29,14 +29,7 @@ python populate_packages_prepend () {
          d.setVar('PKG_'+bpn+'-dev', 'libc6-dev')
          d.setVar('PKG_'+bpn+'-dbg', 'libc6-dbg')
          # For backward compatibility with old -dbg package
-
-        def add_dep(var, dep):
-            deps = bb.utils.explode_dep_versions(d.getVar(var + '_' + bpn, True) or "")
-            if not dep in deps:

meta/classes/libc-common.bbclass python populate_packages_prepend () { · line 35

Quoted 10 lines
meta/classes/libc-common.bbclass +3 -6
-                deps[dep] = ""
-                d.setVar(var + '_' + bpn, bb.utils.join_deps(deps, commasep=False))
-
-        add_dep('RPROVIDES', 'libc-dbg')
-        add_dep('RCONFLICTS', 'libc-dbg')
-        add_dep('RREPLACES', 'libc-dbg')
+        d.appendVar('RPROVIDES_' + bpn + '-dbg', ' libc-dbg')
+        d.appendVar('RCONFLICTS_' + bpn + '-dbg', ' libc-dbg')
+        d.appendVar('RREPLACES_' + bpn + '-dbg', ' libc-dbg')
  }

The above is almost the same as the original code. The problem with appendVar is that then you get duplicate entries. With the new code, I know we won't get exceptions, but do we really want the duplicates?

Quoted 1 line

Everything else looks good.

Its not really an error to have duplicates in the field. I'm fine with avoiding it where it makes sense but I don't like adding too much runtime cost or complexity.

In the above case it will get filtered out later anyway so I'm not really bothered by it and prefer the simpler syntax.

Cheers,

Richard