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

Reply via email to