From 9360135b2c2a346ae6b1c309445564ade6daa6b1 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 18 Sep 2018 09:01:12 +0200 Subject: [PATCH] Minimize the number of manually installed packages in images by marking dependencies of metapackages as automatically installed. --- debian/changelog | 7 +++++ debian/control | 1 + live-build/auto/build | 2 ++ live-build/auto/minimize-manual.py | 48 ++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 live-build/auto/minimize-manual.py diff --git a/debian/changelog b/debian/changelog index e773ad65..76e885e8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +livecd-rootfs (2.536ubuntu1) UNRELEASED; urgency=medium + + * Minimize the number of manually installed packages in images by marking + dependencies of metapackages as automatically installed. + + -- Julian Andres Klode Tue, 18 Sep 2018 08:55:04 +0200 + livecd-rootfs (2.536) cosmic; urgency=medium * Fix live-server journald config snippet to actually disable journald rate diff --git a/debian/control b/debian/control index f6468b91..9d47c949 100644 --- a/debian/control +++ b/debian/control @@ -26,6 +26,7 @@ Depends: ${misc:Depends}, parted, procps, python-minimal | python, + python3-apt, python3-software-properties, qemu-utils, rsync, diff --git a/live-build/auto/build b/live-build/auto/build index 50831ba2..160f471a 100755 --- a/live-build/auto/build +++ b/live-build/auto/build @@ -445,6 +445,8 @@ EOF (cd chroot && find usr/share/doc -maxdepth 1 -type d | xargs du -s | sort -nr) echo END docdirs + live-build/auto/minimize-manual.py chroot + lb binary "$@" touch binary.success ) 2>&1 | tee binary.log diff --git a/live-build/auto/minimize-manual.py b/live-build/auto/minimize-manual.py new file mode 100644 index 00000000..712f35a4 --- /dev/null +++ b/live-build/auto/minimize-manual.py @@ -0,0 +1,48 @@ +#!/usr/bin/python3 +"""Minimize the number of manually installed packages in the image. + +Finds all manually meta packages and marks their dependencies as +automatically installed. +""" +import apt +import sys + + +def is_root(pkg): + return (pkg.is_installed and + not pkg.is_auto_installed and + (pkg.section == "metapackages" or + pkg.section.endswith("/metapackages"))) + + +c = apt.Cache(rootdir=sys.argv[1] if len(sys.argv) > 1 else None) + +roots = set(pkg for pkg in c if is_root(pkg)) +workset = set(roots) +seen = set() + +with c.actiongroup(): + while True: + + print("Iteration", file=sys.stderr) + to_proc = workset - seen + if not to_proc: + break + for pkg in sorted(to_proc): + print(" Visiting", pkg, file=sys.stderr) + + # Mark every + if pkg not in roots: + pkg.mark_auto() + + for dep in pkg.installed.dependencies + pkg.installed.recommends: + if dep.rawtype not in ('Depends', 'PreDepends', 'Recommends'): + continue + for bdep in dep.or_dependencies: + for v in bdep.target_versions: + if v.package.is_installed: + workset.add(v.package) + + seen.add(pkg) + + c.commit()