commit:     fe510e099bc9a8055c3ee50fced47fc3dc7ba166
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Fri Mar  1 17:09:56 2024 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Fri Mar  1 18:08:51 2024 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=fe510e09

doebuild: Call _setup_locale

Call _setup_locale in order to prevent an AssertionError from
config.environ() for the config phase (or any other phase for
that matter).

For returnproc or returnpid assume that the event loop is running
so we can't run the event loop to call _setup_locale in this case
and we have to assume the caller took care of it (otherwise
config.environ() will raise AssertionError).

Update DoebuildFdPipesTestCase to use EAPI 8 and test the
pkg_config function with an ebuild located in /var/db/pkg just
like emerge --config does. Set LC_ALL=C just before doebuild
calls in order to try and trigger the config.environ()
split_LC_ALL assertion.

Bug: https://bugs.gentoo.org/925863
Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>

 lib/portage/package/ebuild/doebuild.py             |  8 +++
 lib/portage/tests/ebuild/test_doebuild_fd_pipes.py | 77 ++++++++++++----------
 2 files changed, 52 insertions(+), 33 deletions(-)

diff --git a/lib/portage/package/ebuild/doebuild.py 
b/lib/portage/package/ebuild/doebuild.py
index bc51fdff2d..942fa90101 100644
--- a/lib/portage/package/ebuild/doebuild.py
+++ b/lib/portage/package/ebuild/doebuild.py
@@ -43,6 +43,7 @@ portage.proxy.lazyimport.lazyimport(
     "portage.util._async.SchedulerInterface:SchedulerInterface",
     "portage.util._eventloop.global_event_loop:global_event_loop",
     "portage.util.ExtractKernelVersion:ExtractKernelVersion",
+    "_emerge.EbuildPhase:_setup_locale",
 )
 
 from portage import (
@@ -1034,6 +1035,13 @@ def doebuild(
             myebuild, mydo, myroot, mysettings, debug, use_cache, mydbapi
         )
 
+        # For returnproc or returnpid assume that the event loop is running
+        # so we can't run the event loop to call _setup_locale in this case
+        # and we have to assume the caller took care of it (otherwise
+        # config.environ() will raise AssertionError).
+        if not (returnproc or returnpid):
+            asyncio.run(_setup_locale(mysettings))
+
         if mydo in clean_phases:
             builddir_lock = None
             if not returnpid and "PORTAGE_BUILDDIR_LOCKED" not in mysettings:

diff --git a/lib/portage/tests/ebuild/test_doebuild_fd_pipes.py 
b/lib/portage/tests/ebuild/test_doebuild_fd_pipes.py
index 678486ed16..b38605bb90 100644
--- a/lib/portage/tests/ebuild/test_doebuild_fd_pipes.py
+++ b/lib/portage/tests/ebuild/test_doebuild_fd_pipes.py
@@ -1,4 +1,4 @@
-# Copyright 2013-2023 Gentoo Authors
+# Copyright 2013-2024 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
 import multiprocessing
@@ -27,20 +27,22 @@ class DoebuildFdPipesTestCase(TestCase):
 
         output_fd = self.output_fd
         ebuild_body = ["S=${WORKDIR}"]
-        for phase_func in (
-            "pkg_info",
-            "pkg_nofetch",
-            "pkg_pretend",
-            "pkg_setup",
-            "src_unpack",
-            "src_prepare",
-            "src_configure",
-            "src_compile",
-            "src_test",
-            "src_install",
+        for phase_func, default in (
+            ("pkg_info", False),
+            ("pkg_nofetch", False),
+            ("pkg_pretend", False),
+            ("pkg_setup", False),
+            ("pkg_config", False),
+            ("src_unpack", False),
+            ("src_prepare", True),
+            ("src_configure", False),
+            ("src_compile", False),
+            ("src_test", False),
+            ("src_install", False),
         ):
             ebuild_body.append(
-                ("%s() { echo ${EBUILD_PHASE}" " 1>&%s; }") % (phase_func, 
output_fd)
+                ("%s() { %secho ${EBUILD_PHASE}" " 1>&%s; }")
+                % (phase_func, "default; " if default else "", output_fd)
             )
 
         ebuild_body.append("")
@@ -48,7 +50,7 @@ class DoebuildFdPipesTestCase(TestCase):
 
         ebuilds = {
             "app-misct/foo-1": {
-                "EAPI": "5",
+                "EAPI": "8",
                 "MISC_CONTENT": ebuild_body,
             }
         }
@@ -103,24 +105,33 @@ class DoebuildFdPipesTestCase(TestCase):
                 type_name="ebuild",
             )
             settings.setcpv(pkg)
-            ebuildpath = portdb.findname(cpv)
-            self.assertNotEqual(ebuildpath, None)
-
-            for phase in (
-                "info",
-                "nofetch",
-                "pretend",
-                "setup",
-                "unpack",
-                "prepare",
-                "configure",
-                "compile",
-                "test",
-                "install",
-                "qmerge",
-                "clean",
-                "merge",
+
+            # Try to trigger the config.environ() split_LC_ALL assertion for 
bug 925863.
+            settings["LC_ALL"] = "C"
+
+            source_ebuildpath = portdb.findname(cpv)
+            self.assertNotEqual(source_ebuildpath, None)
+
+            for phase, tree, ebuildpath in (
+                ("info", "porttree", source_ebuildpath),
+                ("nofetch", "porttree", source_ebuildpath),
+                ("pretend", "porttree", source_ebuildpath),
+                ("setup", "porttree", source_ebuildpath),
+                ("unpack", "porttree", source_ebuildpath),
+                ("prepare", "porttree", source_ebuildpath),
+                ("configure", "porttree", source_ebuildpath),
+                ("compile", "porttree", source_ebuildpath),
+                ("test", "porttree", source_ebuildpath),
+                ("install", "porttree", source_ebuildpath),
+                ("qmerge", "porttree", source_ebuildpath),
+                ("clean", "porttree", source_ebuildpath),
+                ("merge", "porttree", source_ebuildpath),
+                ("clean", "porttree", source_ebuildpath),
+                ("config", "vartree", 
root_config.trees["vartree"].dbapi.findname(cpv)),
             ):
+                if ebuildpath is not source_ebuildpath:
+                    self.assertNotEqual(ebuildpath, None)
+
                 pr, pw = multiprocessing.Pipe(duplex=False)
 
                 producer = ForkProcess(
@@ -131,8 +142,8 @@ class DoebuildFdPipesTestCase(TestCase):
                     args=(QueryCommand._db, pw, ebuildpath, phase),
                     kwargs={
                         "settings": settings,
-                        "mydbapi": portdb,
-                        "tree": "porttree",
+                        "mydbapi": root_config.trees[tree].dbapi,
+                        "tree": tree,
                         "vartree": root_config.trees["vartree"],
                         "prev_mtimes": {},
                     },

Reply via email to