summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał Górny <mgorny@gentoo.org>2017-08-15 10:11:10 +0200
committerMichał Górny <mgorny@gentoo.org>2017-08-26 23:16:07 +0200
commitb6ac1641c752db48841f671e0ce7c4e1e98e1933 (patch)
treeb71e5021e27da82d0745ef29b3485a6ac72b0a32
parentdigraph: search for relevant priority in descending order (diff)
downloadportage-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-xbin/misc-functions.sh57
-rw-r--r--pym/portage/package/ebuild/doebuild.py5
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):