From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <gentoo-commits+bounces-1732942-garchives=archives.gentoo.org@lists.gentoo.org>
Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (4096 bits))
	(No client certificate requested)
	by finch.gentoo.org (Postfix) with ESMTPS id 635261581EE
	for <garchives@archives.gentoo.org>; Mon, 31 Mar 2025 17:07:06 +0000 (UTC)
Received: from lists.gentoo.org (bobolink.gentoo.org [140.211.166.189])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (4096 bits))
	(No client certificate requested)
	(Authenticated sender: relay-lists.gentoo.org@gentoo.org)
	by smtp.gentoo.org (Postfix) with ESMTPSA id 4DDB53430F5
	for <garchives@archives.gentoo.org>; Mon, 31 Mar 2025 17:07:06 +0000 (UTC)
Received: from bobolink.gentoo.org (localhost [127.0.0.1])
	by bobolink.gentoo.org (Postfix) with ESMTP id 72BFC1104B1;
	Mon, 31 Mar 2025 17:07:02 +0000 (UTC)
Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (4096 bits))
	(No client certificate requested)
	by bobolink.gentoo.org (Postfix) with ESMTPS id 67CC71104B1
	for <gentoo-commits@lists.gentoo.org>; Mon, 31 Mar 2025 17:07:02 +0000 (UTC)
Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (4096 bits))
	(No client certificate requested)
	by smtp.gentoo.org (Postfix) with ESMTPS id 16BD2343199
	for <gentoo-commits@lists.gentoo.org>; Mon, 31 Mar 2025 17:07:02 +0000 (UTC)
Received: from localhost.localdomain (localhost [IPv6:::1])
	by oystercatcher.gentoo.org (Postfix) with ESMTP id 96E0A17EE
	for <gentoo-commits@lists.gentoo.org>; Mon, 31 Mar 2025 17:07:00 +0000 (UTC)
From: "Sam James" <sam@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Content-Transfer-Encoding: 8bit
Content-type: text/plain; charset=UTF-8
Reply-To: gentoo-dev@lists.gentoo.org, "Sam James" <sam@gentoo.org>
Message-ID: <1743440745.e41c5c3ca4cb468f2fa85f2c48f08f1541b1d32f.sam@gentoo>
Subject: [gentoo-commits] repo/gentoo:master commit in: app-emulation/cloud-init/
X-VCS-Repository: repo/gentoo
X-VCS-Files: app-emulation/cloud-init/cloud-init-24.4-r4.ebuild app-emulation/cloud-init/cloud-init-9999.ebuild
X-VCS-Directories: app-emulation/cloud-init/
X-VCS-Committer: sam
X-VCS-Committer-Name: Sam James
X-VCS-Revision: e41c5c3ca4cb468f2fa85f2c48f08f1541b1d32f
X-VCS-Branch: master
Date: Mon, 31 Mar 2025 17:07:00 +0000 (UTC)
Precedence: bulk
List-Post: <mailto:gentoo-commits@lists.gentoo.org>
List-Help: <mailto:gentoo-commits+help@lists.gentoo.org>
List-Unsubscribe: <mailto:gentoo-commits+unsubscribe@lists.gentoo.org>
List-Subscribe: <mailto:gentoo-commits+subscribe@lists.gentoo.org>
List-Id: Gentoo Linux mail <gentoo-commits.gentoo.org>
X-BeenThere: gentoo-commits@lists.gentoo.org
X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply
X-Archives-Salt: 1ba5f3b4-c7ef-48da-be66-502922e13ac9
X-Archives-Hash: 8437d366f403746c52a338995dd0c226

commit:     e41c5c3ca4cb468f2fa85f2c48f08f1541b1d32f
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Mon Mar 31 17:04:31 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Mon Mar 31 17:05:45 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=e41c5c3c

app-emulation/cloud-init: port to python-single-r1

The package isn't suitable for PEP517, as it installs data files and
it simply happens to be written in Python, rather than intending to be
imported and so on.

Unfortunately, for the remaining PEP517 holdouts, there's little pressure
upstream for them to port to a proper build system yet, as while setuptools
deprecated the `setup.py` entrypoint some time ago, there's no removal
in sight yet, so the only pressing side is on Gentoo's where we want
to cleanup distutils-r1's support for that.

It was arguably a mistake to really have these packages use distutils-r1
in the first place.

The obvious workaround for now is to invoke setup.py manually w/ python-single-r1,
and punt the question until setuptools removal of the entrypoint looks
closer (at which time, other distros will be putting pressure on upstreams
too). Of course, if at the time of such a setuptools change, the package
is still not fixed, then we'd have to remove it.

(The same issues apply to bug #922160 which isn't fixed by this, but
hopefully won't be an actual problem until that aforementioned removal
in setuptools itself of the other bits.)

Bug: https://bugs.gentoo.org/922160
Closes: https://bugs.gentoo.org/850964
Closes: https://bugs.gentoo.org/909872
Closes: https://bugs.gentoo.org/952196
Signed-off-by: Sam James <sam <AT> gentoo.org>

 app-emulation/cloud-init/cloud-init-24.4-r4.ebuild | 124 +++++++++++++++++++++
 app-emulation/cloud-init/cloud-init-9999.ebuild    |  91 +++++++++------
 2 files changed, 178 insertions(+), 37 deletions(-)

diff --git a/app-emulation/cloud-init/cloud-init-24.4-r4.ebuild b/app-emulation/cloud-init/cloud-init-24.4-r4.ebuild
new file mode 100644
index 000000000000..99a282a85204
--- /dev/null
+++ b/app-emulation/cloud-init/cloud-init-24.4-r4.ebuild
@@ -0,0 +1,124 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{10..13} )
+inherit edo python-single-r1 udev
+
+DESCRIPTION="Cloud instance initialisation magic"
+HOMEPAGE="https://launchpad.net/cloud-init"
+
+if [[ ${PV} == *9999 ]]; then
+	inherit git-r3
+	EGIT_REPO_URI="https://git.launchpad.net/cloud-init"
+else
+	SRC_URI="https://launchpad.net/${PN}/trunk/${PV}/+download/${P}.tar.gz"
+	KEYWORDS="~amd64 ~arm64 ~loong ~ppc64 ~x86"
+fi
+
+LICENSE="GPL-3"
+SLOT="0"
+IUSE="selinux test"
+RESTRICT="!test? ( test )"
+REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+
+COMMON_DEPEND="
+	$(python_gen_cond_dep '
+		dev-python/jinja2[${PYTHON_USEDEP}]
+		dev-python/oauthlib[${PYTHON_USEDEP}]
+		dev-python/pyserial[${PYTHON_USEDEP}]
+		>=dev-python/configobj-5.0.2[${PYTHON_USEDEP}]
+		dev-python/pyyaml[${PYTHON_USEDEP}]
+		dev-python/requests[${PYTHON_USEDEP}]
+		dev-python/jsonpatch[${PYTHON_USEDEP}]
+		dev-python/jsonschema[${PYTHON_USEDEP}]
+		dev-python/netifaces[${PYTHON_USEDEP}]
+	')
+"
+BDEPEND="
+	${COMMON_DEPEND}
+	$(python_gen_cond_dep '
+		dev-python/setuptools[${PYTHON_USEDEP}]
+	')
+	test? (
+		$(python_gen_cond_dep '
+			dev-python/mock[${PYTHON_USEDEP}]
+			dev-python/passlib[${PYTHON_USEDEP}]
+			dev-python/pytest[${PYTHON_USEDEP}]
+			dev-python/pytest-mock[${PYTHON_USEDEP}]
+			dev-python/responses[${PYTHON_USEDEP}]
+		')
+	)
+"
+RDEPEND="
+	${COMMON_DEPEND}
+	${PYTHON_DEPS}
+	net-analyzer/macchanger
+	net-analyzer/openbsd-netcat
+	sys-apps/iproute2
+	sys-fs/growpart
+	virtual/logger
+	selinux? ( sec-policy/selinux-cloudinit )
+"
+
+PATCHES=(
+	"${FILESDIR}/${PN}-24.2-systemd.patch"
+	"${FILESDIR}/${PN}-24.4-netcat.patch"
+)
+
+EPYTEST_IGNORE=(
+	# Can't find file
+	tests/unittests/config/test_apt_configure_sources_list_v1.py
+	tests/unittests/config/test_apt_configure_sources_list_v3.py
+	# PORTAGE_TMPDIR too long for unix sockets
+	tests/unittests/test_all_stages.py
+	# TODO
+	tests/unittests/config/test_schema.py
+)
+
+src_prepare() {
+	default
+
+	# Fix location of documentation installation
+	sed -i "s:USR + \"/share/doc/cloud-init:USR + \"/share/doc/${PF}:" setup.py || die
+
+	if [[ ${PV} == *9999 ]] ; then
+		sed -i 's/version=get_version(),/version=9999,/g' setup.py || die
+	fi
+}
+
+src_compile() {
+	edo ${EPYTHON} setup.py build
+}
+
+src_test() {
+	epytest
+}
+
+src_install() {
+	edo ${EPYTHON} setup.py install \
+		--prefix="${EPREFIX}/usr" \
+		--root="${D}" \
+		--init-system=sysvinit_openrc,systemd \
+		--distro gentoo
+	python_optimize
+
+	keepdir /etc/cloud
+
+	# installs as non-executable
+	chmod +x "${D}"/etc/init.d/* || die
+}
+
+pkg_prerm() {
+	udev_reload
+}
+
+pkg_postinst() {
+	udev_reload
+
+	elog "cloud-init-local needs to be run in the boot runlevel because it"
+	elog "modifies services in the default runlevel.  When a runlevel is started"
+	elog "it is cached, so modifications that happen to the current runlevel"
+	elog "while you are in it are not acted upon."
+}

diff --git a/app-emulation/cloud-init/cloud-init-9999.ebuild b/app-emulation/cloud-init/cloud-init-9999.ebuild
index 128407ca66ec..9f7db580b998 100644
--- a/app-emulation/cloud-init/cloud-init-9999.ebuild
+++ b/app-emulation/cloud-init/cloud-init-9999.ebuild
@@ -1,14 +1,13 @@
-# Copyright 1999-2024 Gentoo Authors
+# Copyright 1999-2025 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
 EAPI=8
 
-# Disabled for now: bug #850628
-#DISTUTILS_USE_PEP517=setuptools
-# https://bugs.launchpad.net/cloud-init/+bug/1978328
-PYTHON_COMPAT=( python3_10 python3_11 python3_12 )
+PYTHON_COMPAT=( python3_{10..13} )
+inherit edo python-single-r1 udev
 
-inherit distutils-r1 udev
+DESCRIPTION="Cloud instance initialisation magic"
+HOMEPAGE="https://launchpad.net/cloud-init"
 
 if [[ ${PV} == *9999 ]]; then
 	inherit git-r3
@@ -18,36 +17,43 @@ else
 	KEYWORDS="~amd64 ~arm64 ~loong ~ppc64 ~x86"
 fi
 
-DESCRIPTION="Cloud instance initialisation magic"
-HOMEPAGE="https://launchpad.net/cloud-init"
-
 LICENSE="GPL-3"
 SLOT="0"
-IUSE="selinux"
-
-CDEPEND="
-	dev-python/jinja2[${PYTHON_USEDEP}]
-	dev-python/oauthlib[${PYTHON_USEDEP}]
-	dev-python/pyserial[${PYTHON_USEDEP}]
-	>=dev-python/configobj-5.0.2[${PYTHON_USEDEP}]
-	dev-python/pyyaml[${PYTHON_USEDEP}]
-	dev-python/requests[${PYTHON_USEDEP}]
-	dev-python/jsonpatch[${PYTHON_USEDEP}]
-	dev-python/jsonschema[${PYTHON_USEDEP}]
-	dev-python/netifaces[${PYTHON_USEDEP}]
+IUSE="selinux test"
+RESTRICT="!test? ( test )"
+REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+
+COMMON_DEPEND="
+	$(python_gen_cond_dep '
+		dev-python/jinja2[${PYTHON_USEDEP}]
+		dev-python/oauthlib[${PYTHON_USEDEP}]
+		dev-python/pyserial[${PYTHON_USEDEP}]
+		>=dev-python/configobj-5.0.2[${PYTHON_USEDEP}]
+		dev-python/pyyaml[${PYTHON_USEDEP}]
+		dev-python/requests[${PYTHON_USEDEP}]
+		dev-python/jsonpatch[${PYTHON_USEDEP}]
+		dev-python/jsonschema[${PYTHON_USEDEP}]
+		dev-python/netifaces[${PYTHON_USEDEP}]
+	')
 "
 BDEPEND="
-	${CDEPEND}
-	test? (
-		dev-python/mock[${PYTHON_USEDEP}]
-		dev-python/passlib[${PYTHON_USEDEP}]
-		dev-python/pytest-mock[${PYTHON_USEDEP}]
-		dev-python/responses[${PYTHON_USEDEP}]
+	${COMMON_DEPEND}
+	$(python_gen_cond_dep '
 		dev-python/setuptools[${PYTHON_USEDEP}]
+	')
+	test? (
+		$(python_gen_cond_dep '
+			dev-python/mock[${PYTHON_USEDEP}]
+			dev-python/passlib[${PYTHON_USEDEP}]
+			dev-python/pytest[${PYTHON_USEDEP}]
+			dev-python/pytest-mock[${PYTHON_USEDEP}]
+			dev-python/responses[${PYTHON_USEDEP}]
+		')
 	)
 "
 RDEPEND="
-	${CDEPEND}
+	${COMMON_DEPEND}
+	${PYTHON_DEPS}
 	net-analyzer/macchanger
 	net-analyzer/openbsd-netcat
 	sys-apps/iproute2
@@ -60,29 +66,40 @@ EPYTEST_IGNORE=(
 	# Can't find file
 	tests/unittests/config/test_apt_configure_sources_list_v1.py
 	tests/unittests/config/test_apt_configure_sources_list_v3.py
+	# PORTAGE_TMPDIR too long for unix sockets
+	tests/unittests/test_all_stages.py
+	# TODO
+	tests/unittests/config/test_schema.py
 )
 
-distutils_enable_tests pytest
+src_prepare() {
+	default
 
-python_prepare_all() {
 	# Fix location of documentation installation
-	sed -i "s:USR + '/share/doc/cloud-init:USR + '/share/doc/${PF}:" setup.py || die
+	sed -i "s:USR + \"/share/doc/cloud-init:USR + \"/share/doc/${PF}:" setup.py || die
 
 	if [[ ${PV} == *9999 ]] ; then
 		sed -i 's/version=get_version(),/version=9999,/g' setup.py || die
 	fi
+}
 
-	distutils-r1_python_prepare_all
+src_compile() {
+	edo ${EPYTHON} setup.py build
 }
 
-python_install() {
-	distutils-r1_python_install --init-system=sysvinit_openrc,systemd --distro gentoo
+src_test() {
+	epytest
 }
 
-python_install_all() {
-	keepdir /etc/cloud
+src_install() {
+	edo ${EPYTHON} setup.py install \
+		--prefix="${EPREFIX}/usr" \
+		--root="${D}" \
+		--init-system=sysvinit_openrc,systemd \
+		--distro gentoo
+	python_optimize
 
-	distutils-r1_python_install_all
+	keepdir /etc/cloud
 
 	# installs as non-executable
 	chmod +x "${D}"/etc/init.d/* || die