Extend the QA check mechanics in Portage to support post-postinst QA checks. They are like post-install QA checks, except they are run after pkg_postinst(), and so they can be used to verify that necessary postinst actions were performed (e.g. regenerating caches). --- bin/misc-functions.sh | 57 ++++++++++++++++++++++++++++++++++ pym/portage/package/ebuild/doebuild.py | 5 ++- 2 files changed, 61 insertions(+), 1 deletion(-)
diff --git a/bin/misc-functions.sh b/bin/misc-functions.sh index 079369313..18cddea21 100755 --- a/bin/misc-functions.sh +++ b/bin/misc-functions.sh @@ -256,6 +256,63 @@ install_qa_check() { rm -f "${ED}"/usr/share/info/dir{,.gz,.bz2} || die "rm failed!" } +postinst_qa_check() { + local d f paths qa_checks=() + if ! ___eapi_has_prefix_variables; then + local EPREFIX= EROOT=${ROOT} + fi + + cd "${EROOT}" || die "cd failed" + + # Collect the paths for QA checks, highest prio first. + paths=( + # sysadmin overrides + "${PORTAGE_OVERRIDE_EPREFIX}"/usr/local/lib/postinst-qa-check.d + # system-wide package installs + "${PORTAGE_OVERRIDE_EPREFIX}"/usr/lib/postinst-qa-check.d + ) + + # Now repo-specific checks. + # (yes, PORTAGE_ECLASS_LOCATIONS contains repo paths...) + for d in "${PORTAGE_ECLASS_LOCATIONS[@]}"; do + paths+=( + "${d}"/metadata/postinst-qa-check.d + ) + done + + paths+=( + # Portage built-in checks + "${PORTAGE_OVERRIDE_EPREFIX}"/usr/lib/portage/postinst-qa-check.d + "${PORTAGE_BIN_PATH}"/postinst-qa-check.d + ) + + # Collect file names of QA checks. We need them early to support + # overrides properly. + for d in "${paths[@]}"; do + for f in "${d}"/*; do + [[ -f ${f} ]] && qa_checks+=( "${f##*/}" ) + done + done + + # Now we need to sort the filenames lexically, and process + # them in order. + while read -r -d '' f; do + # Find highest priority file matching the basename. + for d in "${paths[@]}"; do + [[ -f ${d}/${f} ]] && break + done + + # Run in a subshell to treat it like external script, + # but use 'source' to pass all variables through. + ( + # Allow inheriting eclasses. + # XXX: we want this only in repository-wide checks. + _IN_INSTALL_QA_CHECK=1 + source "${d}/${f}" || eerror "Post-postinst QA check ${f} failed to run" + ) + done < <(printf "%s\0" "${qa_checks[@]}" | LC_ALL=C sort -u -z) +} + install_mask() { local root="$1" shift diff --git a/pym/portage/package/ebuild/doebuild.py b/pym/portage/package/ebuild/doebuild.py index 14d96f57c..ac697a763 100644 --- a/pym/portage/package/ebuild/doebuild.py +++ b/pym/portage/package/ebuild/doebuild.py @@ -1738,7 +1738,10 @@ _post_phase_cmds = { "preinst_sfperms", "preinst_selinux_labels", "preinst_suid_scan", - ] + ], + + "postinst" : [ + "postinst_qa_check"], } def _post_phase_userpriv_perms(mysettings): -- 2.14.1