summaryrefslogtreecommitdiff
blob: d1eae65e1b58fbdcc2511fa58d5d4edf8010b4e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# Copyright 2019-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

# QA check: ensure that Python modules are compiled after installing
# Maintainer: Python project <python@gentoo.org>

python_pyc_check() {
	local save=$(shopt -p nullglob)
	shopt -s nullglob
	local progs=( "${EPREFIX}"/usr/lib/python-exec/*/gpep517 )
	${save}

	local invalid=()
	local mismatched_timestamp=()
	local mismatched_data=()
	local missing=()
	local stray=()

	# Avoid running the check if sufficiently new gpep517 is not installed
	# yet. It's valid to schedule (for merge order) >=gpep517-8 after
	# packages which have this check run if they don't use distutils-r1.
	if [[ ${EAPI} == [0123] ]] || ! nonfatal has_version ">=dev-python/gpep517-8" ; then
		return
	fi

	for prog in "${progs[@]}"; do
		local impl=${prog%/*}
		impl=${impl##*/}

		[[ -d "${ED}"/usr/lib/${impl}/site-packages ]] || continue

		einfo "Verifying compiled files for ${impl}"
		local kind pyc py
		while IFS=: read -r kind pyc py extra; do
			case ${kind} in
				invalid)
					invalid+=( "${pyc}" )
					;;
				mismatched)
					case ${extra} in
						timestamp)
							mismatched_timestamp+=( "${pyc}" )
							;;
						*)
							mismatched_data+=( "${pyc}" )
							;;
					esac
					;;
				missing)
					missing+=( "${pyc}" )
					;;
				older)
					# older warnings were produced by earlier version
					# of gpep517 but the check was incorrect, so we just
					# ignore them
					;;
				stray)
					stray+=( "${pyc}" )
					;;
			esac
		done < <("${prog}" verify-pyc --destdir "${D}" --prefix "${EPREFIX}"/usr)
	done

	local found=
	if [[ ${missing[@]} ]]; then
		eqawarn
		eqawarn "QA Notice: This package installs one or more Python modules that are"
		eqawarn "not byte-compiled."
		eqawarn "The following files are missing:"
		eqawarn
		eqatag -v python-pyc.missing "${missing[@]}"
		found=1
	fi

	if [[ ${invalid[@]} ]]; then
		eqawarn
		eqawarn "QA Notice: This package installs one or more compiled Python modules"
		eqawarn "that seem to be invalid (do not have the correct header)."
		eqawarn "The following files are invalid:"
		eqawarn
		eqatag -v python-pyc.invalid "${invalid[@]}"
		found=1
	fi

	if [[ ${mismatched_data[@]} ]]; then
		eqawarn
		eqawarn "QA Notice: This package installs one or more compiled Python modules whose"
		eqawarn ".py files have different content (size or hash) than recorded:"
		eqawarn
		eqatag -v python-pyc.mismatched.data "${mismatched_data[@]}"
		found=1
	fi

	if [[ ${mismatched_timestamp[@]} ]]; then
		eqawarn
		eqawarn "QA Notice: This package installs one or more compiled Python modules whose"
		eqawarn ".py files have different timestamps than recorded:"
		eqawarn
		eqatag -v python-pyc.mismatched.timestamp "${mismatched_timestamp[@]}"
		found=1
	fi

	if [[ ${stray[@]} ]]; then
		eqawarn
		eqawarn "QA Notice: This package installs one or more compiled Python modules"
		eqawarn "that do not match installed modules (or their implementation)."
		eqawarn "The following files are stray:"
		eqawarn
		eqatag -v python-pyc.stray "${stray[@]}"
		found=1
	fi

	if [[ ${found} ]]; then
		eqawarn
		eqawarn "For more information on bytecode files and related issues, please see:"
		eqawarn "  https://projects.gentoo.org/python/guide/qawarn.html#compiled-bytecode-related-warnings"
	fi
}

python_pyc_check

: # guarantee successful exit

# vim:ft=ebuild