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

import errno

from _emerge.CompositeTask import CompositeTask
from _emerge.SpawnProcess import SpawnProcess
from portage import os, _shell_quote, _unicode_encode
from portage.const import BASH_BINARY


class BinpkgEnvExtractor(CompositeTask):
    """
    Extract environment.bz2 for a binary or installed package.
    """

    __slots__ = ("settings",)

    def saved_env_exists(self):
        return os.path.exists(self._get_saved_env_path())

    def dest_env_exists(self):
        return os.path.exists(self._get_dest_env_path())

    def _get_saved_env_path(self):
        return os.path.join(os.path.dirname(self.settings["EBUILD"]), "environment.bz2")

    def _get_dest_env_path(self):
        return os.path.join(self.settings["T"], "environment")

    def _start(self):
        saved_env_path = self._get_saved_env_path()
        dest_env_path = self._get_dest_env_path()
        shell_cmd = (
            "${PORTAGE_BUNZIP2_COMMAND:-${PORTAGE_BZIP2_COMMAND} -d} -c -- %s > %s"
            % (_shell_quote(saved_env_path), _shell_quote(dest_env_path))
        )

        logfile = None
        if self.settings.get("PORTAGE_BACKGROUND") != "subprocess":
            logfile = self.settings.get("PORTAGE_LOG_FILE")

        extractor_proc = SpawnProcess(
            args=[BASH_BINARY, "-c", shell_cmd],
            background=self.background,
            env=self.settings.environ(),
            scheduler=self.scheduler,
            logfile=logfile,
        )

        self._start_task(extractor_proc, self._extractor_exit)

    def _remove_dest_env(self):
        try:
            os.unlink(self._get_dest_env_path())
        except OSError as e:
            if e.errno != errno.ENOENT:
                raise

    def _extractor_exit(self, extractor_proc):

        if self._default_exit(extractor_proc) != os.EX_OK:
            self._remove_dest_env()
            self.wait()
            return

        # This is a signal to ebuild.sh, so that it knows to filter
        # out things like SANDBOX_{DENY,PREDICT,READ,WRITE} that
        # would be preserved between normal phases.
        open(_unicode_encode(self._get_dest_env_path() + ".raw"), "wb").close()

        self._current_task = None
        self.returncode = os.EX_OK
        self.wait()
