[elbe-devel] [PATCH] rpcaptcache: Rewrite mark_install_devpkgs()

Olivier Dion dion at linutronix.de
Tue Aug 11 17:31:58 CEST 2020


The main problem with this method was that it added to the 'dev_list'
all packages that were in the 'src_list', without checking for the
source's version.

This leads to some bug for example on stretch and stretch-backports
where libext2fs-dev is from source package e2fsprogs for the latter,
but not the former.  Thus, incorrectly marking the -dev package as
installed, even tho it's the source package from stretch that is
installed.

Signed-off-by: Olivier Dion <dion at linutronix.de>
---
 elbepack/rpcaptcache.py | 109 ++++++++++++++++++++++++++--------------
 1 file changed, 71 insertions(+), 38 deletions(-)

diff --git a/elbepack/rpcaptcache.py b/elbepack/rpcaptcache.py
index b02f2f04..c83ee00d 100644
--- a/elbepack/rpcaptcache.py
+++ b/elbepack/rpcaptcache.py
@@ -141,55 +141,88 @@ class RPCAPTCache(InChRootObject):
                        from_user=from_user)
 
     def mark_install_devpkgs(self, ignore_pkgs, ignore_dev_pkgs):
-        ignore_pkgs.discard('libc6')  # we don't want to ignore libc
+
+        # we don't want to ignore libc
+        ignore_pkgs.discard('libc6')
         ignore_pkgs.discard('libstdc++5')
         ignore_pkgs.discard('libstdc++6')
-        # list all debian src packages of all installed packages that don't
-        # come from debootstrap
-        src_list = [
-            p.candidate.source_name for p in self.cache if (
-                p.is_installed and p.name not in ignore_pkgs)]
-        version_dict = {
-            p.name: p.candidate.version for p in self.cache if (
-                p.is_installed and p.name not in ignore_pkgs)}
-        # go through all packages, remember package if its source package
-        # matches one of the installed packages and the binary package is a
-        # '-dev' package
-        dev_list = [
-            s for s in self.cache if (
-                s.candidate.source_name in src_list and (
-                    s.name.endswith('-dev')))]
-        for p in dev_list:
-            if p.name not in ignore_dev_pkgs:
-                name_no_suffix = p.name[:-len('-dev')]
-                if name_no_suffix in version_dict:
-                    version = version_dict[name_no_suffix]
-                    candidate = p.versions.get(version)
-                    if candidate:
-                        p.candidate = candidate
-                p.mark_install()
-        # ensure that the symlinks package will be installed (it's needed for
-        # fixing links inside the sysroot
-        self.cache['symlinks'].mark_install()
 
-        for p in ignore_dev_pkgs:
-            self.cache[p].mark_delete()
+        # list all debian src packages of all installed packages that
+        # don't come from debootstrap
+        src_name_lst = []
+        version_dict = {}
+
+        for pkg in self.cache:
+            if pkg.is_installed and pkg.name not in ignore_pkgs:
+                src_name = pkg.candidate.source_name
+                src_name_lst.append(src_name)
+                version_dict[pkg.name] = pkg.candidate.version
+                version_dict[src_name] = pkg.candidate.version
+
+        def mark_install(pkg_lst, suffix):
+
+            for pkg in pkg_lst:
+
+                if pkg.name in ignore_dev_pkgs:
+                    continue
 
-        dbgsym_list = [
-                s.name + '-dbgsym' for s in self.cache if (
-                    s.is_installed or s.marked_install)]
+                name_no_suffix = pkg.name[:-len(suffix)]
 
-        for p in dbgsym_list:
-            if p in self.cache:
-                pkg = self.cache[p]
-                name_no_suffix = pkg.name[:-len('-dbgsym')]
                 if name_no_suffix in version_dict:
-                    version = version_dict[name_no_suffix]
+
+                    version   = version_dict[name_no_suffix]
                     candidate = pkg.versions.get(version)
+
                     if candidate:
                         pkg.candidate = candidate
+
                 pkg.mark_install()
 
+        # go through all packages, remember package if its source
+        # package matches one of the installed packages and the binary
+        # package is a '-dev' package
+        dev_lst = []
+
+        for pkg in self.cache:
+
+            if not pkg.name.endswith("-dev"):
+                continue
+
+            src_name = pkg.candidate.source_name
+
+            if src_name not in version_dict:
+                continue
+
+            src_version = pkg.candidate.source_version
+
+            if src_version != version_dict[src_name]:
+                continue
+
+            dev_lst.append(pkg)
+
+        mark_install(dev_lst, "-dev")
+
+        # ensure that the symlinks package will be installed (it's
+        # needed for fixing links inside the sysroot
+        self.cache['symlinks'].mark_install()
+
+        for pkg in ignore_dev_pkgs:
+            self.cache[pkg].mark_delete()
+
+        dbgsym_lst = []
+
+        for pkg in self.cache:
+
+            if pkg.is_installed or pkg.marked_install:
+
+                dbg_pkg = "%s-dbgsym" % pkg.name
+
+                if dbg_pkg in self.cache:
+                    dbgsym_lst.append(self.cache[dbg_pkg])
+
+        mark_install(dbgsym_lst, "-dbgsym")
+
+
     def cleanup(self, exclude_pkgs):
         for p in self.cache:
             if p.is_installed and not \
-- 
2.28.0



More information about the elbe-devel mailing list