#!/bin/bash -eE # (c) Nicolás Reynolds # Released under GPLv3 # # Performs chroot cleanup smartly, it only removes the unneeded packages or # leaves you with a cleansystem # # See: HOOKPREBUILD DRYRUN=${DRYRUN:-false} ################################################################################ # Define these here to avoid having dependencies on outside files msg() { local mesg=$1; shift printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 } msg2() { local mesg=$1; shift printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 } error() { local mesg=$1; shift printf "${RED}==> $(gettext "ERROR:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 } ################################################################################ if [[ ! -f /.arch-chroot ]] && ! ${DRYRUN}; then error "(chcleanup): Must be run inside of a chroot" exit 1 fi source /etc/libretools.d/chroot.conf # If we're running makepkg if [ -f PKGBUILD ]; then export CARCH="$(. /etc/makepkg.conf; printf '%s' "$CARCH")" source PKGBUILD CHROOTEXTRAPKG+=("${depends[@]}" "${makedepends[@]}" "${checkdepends[@]}") fi msg "Cleaning chroot..." pacman -Sy || true TEMPDIR="$(mktemp --tmpdir -d $(basename $0).XXXXX)" cp -a /var/lib/pacman/sync "${TEMPDIR}/" cleanup_log="${TEMPDIR}"/libretools-cleanup.log # Get the full list of packages needed by dependencies, including the base system pacman -b "${TEMPDIR}" \ -Sp --print-format "%n" \ base-devel "${CHROOTEXTRAPKG[@]}" \ >"${cleanup_log}" # Diff installed packages against a clean chroot then remove leftovers packages=($(comm -23 <(pacman -Qq | sort -u) \ <(sort -u "${cleanup_log}"))) RET=0 if [[ ${#packages[@]} != 0 ]]; then msg2 "Removing %d packages" ${#packages[@]} if ${DRYRUN}; then echo "${packages[@]}" else # Only remove leftovers, -Rcs removes too much pacman --noconfirm -Rn "${packages[@]}" || RET=$? fi fi # Cleanup rm -rf "${TEMPDIR}" exit $RET