Removing packages with dpkg one-by-one does not respect dependencies therefore use apt-get remove to reorder the packages properly. apt-get purge can't be used because it fails on unknown packages (i.e. not in the archive and not in config-files-remaining state). See #637853. But we can purge all packages in one dpkg call. Also apt-get in lenny is not able to properly purge previously removed packages.
Signed-off-by: Andreas Beckmann <[email protected]> --- piuparts.py | 29 ++++++++++++++++++++++------- 1 files changed, 22 insertions(+), 7 deletions(-) diff --git a/piuparts.py b/piuparts.py index b3d4667..7464f9b 100644 --- a/piuparts.py +++ b/piuparts.py @@ -864,12 +864,27 @@ class Chroot: vdict[name] = status return vdict + def remove_packages(self, packages): + """Remove packages in a chroot.""" + if not False: # ToDo: settings.remove_one_by_one + if packages: + self.run(["apt-get", "remove"] + packages, ignore_errors=True) + else: + self.remove_or_purge("remove", packages) + + def purge_packages(self, packages): + """Purge packages in a chroot.""" + if not False: # ToDo: settings.purge_one_by_one + if packages: + self.run(["dpkg", "--purge"] + packages, ignore_errors=True) + else: + self.remove_or_purge("purge", packages) + def remove_or_purge(self, operation, packages): - """Remove or purge packages in a chroot.""" + """Remove or purge packages in a chroot. No dependency ordering.""" for name in packages: self.run(["dpkg", "--" + operation, name], ignore_errors=True) self.run(["dpkg", "--remove", "--pending"], ignore_errors=True) - def restore_selections(self, changes, packages): """Restore package selections in a chroot by applying 'changes'. @@ -897,8 +912,8 @@ class Chroot: self.run_scripts("pre_remove") # First remove all packages. - self.remove_or_purge("remove", deps_to_remove + deps_to_purge + - nondeps_to_remove + nondeps_to_purge) + self.remove_packages(deps_to_remove + deps_to_purge + + nondeps_to_remove + nondeps_to_purge) # Run custom scripts after removing all packages. if settings.scriptsdir is not None: self.run_scripts("post_remove") @@ -915,13 +930,13 @@ class Chroot: if not settings.skip_logrotatefiles_test and logrotatefiles: installed = self.install_logrotate() self.check_output_logrotatefiles(logrotatefiles_list) - self.remove_or_purge("purge", installed) + self.purge_packages(installed) # Then purge all packages being depended on. - self.remove_or_purge("purge", deps_to_purge) + self.purge_packages(deps_to_purge) # Finally, purge actual packages. - self.remove_or_purge("purge", nondeps_to_purge) + self.purge_packages(nondeps_to_purge) # Run custom scripts after purge all packages. if settings.scriptsdir is not None: -- tg: (b51c8c4..) t/feat/apt-get-remove (depends on: t/fix/purge-logrotate) -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected]

