[oe-commits] [openembedded-core] 10/28: rootfs.py: remove update-alternatives correctly

git at git.openembedded.org git at git.openembedded.org
Fri Oct 6 11:05:50 UTC 2017


This is an automated email from the git hooks/post-receive script.

rpurdie pushed a commit to branch master-next
in repository openembedded-core.

commit 0a8639593c11ef0cfb3a3a514b17e36318b8e8f2
Author: Mikko Ylinen <mikko.ylinen at linux.intel.com>
AuthorDate: Wed Sep 27 11:08:14 2017 +0300

    rootfs.py: remove update-alternatives correctly
    
    With "read-only-rootfs" in IMAGE_FEATURES, packages in ROOTFS_RO_UNNEEDED
    are removed when building the rootfs. The list of packages to remove is
    passed to the package manager and the list is sorted so that
    update-alternatives provider is the last entry. This is with the
    assumption that the last entry on the list/command line is removed last.
    
    However, it turns out rpm does not care about "last on the command
    line" and update-alternatives provider is removed before other the
    packages get to run their %preun scripts for update-alternatives.
    
    This leaves broken alternative symlinks in rootfs.
    
    The fix is to first remove all but update-alternatives provider and
    after that update-alternatives provider in its own remove() call.
    
    Signed-off-by: Mikko Ylinen <mikko.ylinen at linux.intel.com>
    Signed-off-by: Ross Burton <ross.burton at intel.com>
---
 meta/lib/oe/rootfs.py | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py
index 71bd1a7..754ef56 100644
--- a/meta/lib/oe/rootfs.py
+++ b/meta/lib/oe/rootfs.py
@@ -261,15 +261,22 @@ class Rootfs(object, metaclass=ABCMeta):
             # Remove components that we don't need if it's a read-only rootfs
             unneeded_pkgs = self.d.getVar("ROOTFS_RO_UNNEEDED").split()
             pkgs_installed = image_list_installed_packages(self.d)
-            # Make sure update-alternatives is last on the command line, so
-            # that it is removed last. This makes sure that its database is
-            # available while uninstalling packages, allowing alternative
-            # symlinks of packages to be uninstalled to be managed correctly.
+            # Make sure update-alternatives is removed last. This is
+            # because its database has to available while uninstalling
+            # other packages, allowing alternative symlinks of packages
+            # to be uninstalled or to be managed correctly otherwise.
             provider = self.d.getVar("VIRTUAL-RUNTIME_update-alternatives")
             pkgs_to_remove = sorted([pkg for pkg in pkgs_installed if pkg in unneeded_pkgs], key=lambda x: x == provider)
 
+            # update-alternatives provider is removed in its own remove()
+            # call because all package managers do not guarantee the packages
+            # are removed in the order they given in the list (which is
+            # passed to the command line). The sorting done earlier is
+            # utilized to implement the 2-stage removal.
+            if len(pkgs_to_remove) > 1:
+                self.pm.remove(pkgs_to_remove[:-1], False)
             if len(pkgs_to_remove) > 0:
-                self.pm.remove(pkgs_to_remove, False)
+                self.pm.remove([pkgs_to_remove[-1]], False)
 
         if delayed_postinsts:
             self._save_postinsts()

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Openembedded-commits mailing list