From 232221efafdff49c30ed288f5a97d97b9bc006cd Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Tue, 3 Dec 2024 15:38:14 -0500
Subject: [PATCH] common/hooks: use file for managing provides

python packages use this to automatically generate provides for each
module installed by the package.
---
 common/hooks/do-pkg/00-gen-pkg.sh            |  4 ++-
 common/hooks/pre-pkg/04-generate-provides.sh | 29 ++++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)
 create mode 100644 common/hooks/pre-pkg/04-generate-provides.sh

diff --git a/common/hooks/do-pkg/00-gen-pkg.sh b/common/hooks/do-pkg/00-gen-pkg.sh
index aa48214dc3a..06ff08b903b 100644
--- a/common/hooks/do-pkg/00-gen-pkg.sh
+++ b/common/hooks/do-pkg/00-gen-pkg.sh
@@ -40,6 +40,9 @@ genpkg() {
 	if [ -s ${XBPS_STATEDIR}/${pkgname}${suffix}-shlib-provides ]; then
 		_shprovides="$(<${XBPS_STATEDIR}/${pkgname}${suffix}-shlib-provides)"
 	fi
+	if [ -s ${XBPS_STATEDIR}/${pkgname}${suffix}-provides ]; then
+		_provides="$(<${XBPS_STATEDIR}/${pkgname}${suffix}-provides)"
+	fi
 	if [ -s ${XBPS_STATEDIR}/${pkgname}${suffix}-shlib-requires ]; then
 		_shrequires="$(<${XBPS_STATEDIR}/${pkgname}${suffix}-shlib-requires)"
 	fi
@@ -48,7 +51,6 @@ genpkg() {
 	fi
 
 	# Stripping whitespaces
-	local _provides="$(echo $provides)"
 	local _conflicts="$(echo $conflicts)"
 	local _replaces="$(echo $replaces)"
 	local _reverts="$(echo $reverts)"
diff --git a/common/hooks/pre-pkg/04-generate-provides.sh b/common/hooks/pre-pkg/04-generate-provides.sh
new file mode 100644
index 00000000000..f9c1a68e134
--- /dev/null
+++ b/common/hooks/pre-pkg/04-generate-provides.sh
@@ -0,0 +1,29 @@
+# vim: set ts=4 sw=4 et:
+#
+# This hook executes the following tasks:
+#	- Generates provides file with provides entries for xbps-create(1)
+
+generate_python_provides() {
+    local py3_bin="${XBPS_MASTERDIR}/usr/bin/python3"
+
+    if [ -z "$nopyprovides" ] && [ -d "${PKGDESTDIR}/${py3_sitelib}" ] && [ -x "${py3_bin}" ]; then
+        PYTHONPATH="${XBPS_MASTERDIR}/${py3_sitelib}-bootstrap" "${py3_bin}" \
+            "${XBPS_COMMONDIR}"/scripts/parse-py-metadata.py \
+            -S "${PKGDESTDIR}/${py3_sitelib}" -v "${pkgver}" provides
+    fi
+}
+
+hook() {
+    local -a _provides=()
+
+    # include explicit values from the template
+    read -r -a _provides <<< "$provides"
+
+    # get the canonical python package names for each python module
+    mapfile -t _provides -O "${#_provides[@]}" < <( generate_python_provides )
+
+    if [ "${#_provides[@]}" -gt 0 ]; then
+        echo "   ${_provides[*]}"
+        echo "${_provides[*]}" > "${XBPS_STATEDIR}/${pkgname}-provides"
+    fi
+}