# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

import shlex

from _emerge.AbstractEbuildProcess import AbstractEbuildProcess
import portage
from portage import os


class MiscFunctionsProcess(AbstractEbuildProcess):
    """
    Spawns misc-functions.sh with an existing ebuild environment.
    """

    __slots__ = ("commands", "ld_preload_sandbox")

    def _start(self):
        settings = self.settings
        portage_bin_path = settings["PORTAGE_BIN_PATH"]
        misc_sh_binary = os.path.join(
            portage_bin_path, os.path.basename(portage.const.MISC_SH_BINARY)
        )

        self.args = [shlex.quote(misc_sh_binary)] + self.commands
        if (
            self.logfile is None
            and self.settings.get("PORTAGE_BACKGROUND") != "subprocess"
        ):
            self.logfile = settings.get("PORTAGE_LOG_FILE")

        AbstractEbuildProcess._start(self)

    def _spawn(self, args, **kwargs):
        from portage.package.ebuild.doebuild import spawn

        # If self.ld_preload_sandbox is None, default to free=False,
        # in alignment with the spawn(free=False) default.
        kwargs.setdefault(
            "free",
            False if self.ld_preload_sandbox is None else not self.ld_preload_sandbox,
        )

        if self._dummy_pipe_fd is not None:
            self.settings["PORTAGE_PIPE_FD"] = str(self._dummy_pipe_fd)

        if "fakeroot" in self.settings.features:
            kwargs["fakeroot"] = True

        # Temporarily unset EBUILD_PHASE so that bashrc code doesn't
        # think this is a real phase.
        phase_backup = self.settings.pop("EBUILD_PHASE", None)

        # Use a separate sandbox log file to avoid clobbering the real one.
        sandbox_log = self.settings.pop("SANDBOX_LOG", None)
        if sandbox_log is not None:
            self.settings["SANDBOX_LOG"] = os.path.join(
                self.settings["T"], "sandbox-misc.log"
            )

        try:
            return spawn(" ".join(args), self.settings, **kwargs)
        finally:
            if phase_backup is not None:
                self.settings["EBUILD_PHASE"] = phase_backup
            self.settings.pop("PORTAGE_PIPE_FD", None)
            self.settings.pop("SANDBOX_LOG", None)
            if sandbox_log is not None:
                self.settings["SANDBOX_LOG"] = sandbox_log
