[elbe-devel] [PATCH v3] virtapt/lookup_uri: handle 'provides'

Manuel Traut manut at linutronix.de
Wed Aug 15 12:41:32 CEST 2018


If going through the dependencies of a package 'provides' might
be used instead of a real package name.  If get_uri is used with
incl_deps=True lookup_uri can be called with a 'provides'
instead of a package name.

Extend lookup_uri with a loop that iterates over all packages
in the cache and check their 'provides'  if the package name
can't be found in the cache. If a 'provides' matches use the
according package to return its uri.

Signed-off-by: Manuel Traut <manut at linutronix.de>
---

changes since v1:
  * none

changes since v2:
  * added comment about ignored package priorities

 elbepack/virtapt.py | 55 ++++++++++++++++++++++++++++++++++-----------
 1 file changed, 42 insertions(+), 13 deletions(-)

diff --git a/elbepack/virtapt.py b/elbepack/virtapt.py
index deac0e8a..59fb93ba 100644
--- a/elbepack/virtapt.py
+++ b/elbepack/virtapt.py
@@ -29,11 +29,27 @@ def getdeps(pkg):
             yield d.target_pkg.name
 
 
+# target_pkg is either a 'package name' or a 'provides'
+#
+# ATTENTION: for provides pinning and priorities for package selection are
+#            ignored. This should be safe for now, because the code is only
+#            used for downloading 'elbe-bootstrap' and generating the SDKs
+#            host-sysroot. For generating host-sysroots there is no posibility
+#            to modify package priorities via elbe-xml.
 def lookup_uri(v, d, target_pkg):
-
-    pkg = v.cache[target_pkg]
-
-    c = d.get_candidate_ver(pkg)
+    try:
+        pkg = v.cache[target_pkg]
+        c = d.get_candidate_ver(pkg)
+    except KeyError:
+        pkg = None
+        c = None
+
+    if not c:
+        for pkg in v.cache.packages:
+            for x in pkg.provides_list:
+                if target_pkg == x[0]:
+                    return lookup_uri(v, d, x[2].parent_pkg.name)
+        return "", "", ""
 
     x = v.source.find_index(c.file_list[0][0])
 
@@ -226,15 +242,28 @@ class VirtApt:
         togo = [target_pkg]
         while len(togo):
             pp = togo.pop()
-            pkg= self.cache[pp]
-            c = d.get_candidate_ver(pkg)
-            for p in getdeps(c):
-                if len([y for y in deps if y[0] == p]):
-                    continue
-                if p != target_pkg and p == pp:
-                    continue
-                deps.append(lookup_uri(self, d, p))
-                togo.append(p)
+            try:
+                pkg= self.cache[pp]
+                c = d.get_candidate_ver(pkg)
+            except KeyError:
+                pkg = None
+                c = None
+            if not c:
+                for p in self.cache.packages:
+                    for x in p.provides_list:
+                        if pp == x[0]:
+                            pkg = self.cache[x[2].parent_pkg.name]
+                            c = d.get_candidate_ver(pkg)
+            if not c:
+                print("couldnt get candidate: %s" % pkg)
+            else:
+                for p in getdeps(c):
+                    if len([y for y in deps if y[0] == p]):
+                        continue
+                    if p != target_pkg and p == pp:
+                        continue
+                    deps.append(lookup_uri(self, d, p))
+                    togo.append(p)
 
         return deps
 
-- 
2.18.0




More information about the elbe-devel mailing list