diff options
author | Michał Górny <mgorny@gentoo.org> | 2017-08-15 10:11:10 +0200 |
---|---|---|
committer | Michał Górny <mgorny@gentoo.org> | 2017-08-26 23:16:07 +0200 |
commit | b6ac1641c752db48841f671e0ce7c4e1e98e1933 (patch) | |
tree | b71e5021e27da82d0745ef29b3485a6ac72b0a32 | |
parent | digraph: search for relevant priority in descending order (diff) | |
download | portage-b6ac1641c752db48841f671e0ce7c4e1e98e1933.tar.gz portage-b6ac1641c752db48841f671e0ce7c4e1e98e1933.tar.bz2 portage-b6ac1641c752db48841f671e0ce7c4e1e98e1933.zip |
Support post-postinst QA checks
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).
Reviewed-by: Zac Medico <zmedico@gentoo.org>
-rwxr-xr-x | bin/misc-functions.sh | 57 | ||||
-rw-r--r-- | pym/portage/package/ebuild/doebuild.py | 5 |
2 files changed, 61 insertions, 1 deletions
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): |