#!/usr/bin/env python
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
"""fx_desktop_build.py.

script harness to build nightly firefox within Mozilla's build environment
and developer machines alike
"""

import os
import sys

# load modules from parent dir
sys.path.insert(1, os.path.dirname(sys.path[0]))

import mozharness.base.script as script
from mozharness.mozilla.building.buildbase import (
    BUILD_BASE_CONFIG_OPTIONS,
    BuildingConfig,
    BuildScript,
)


class FxDesktopBuild(BuildScript, object):
    def __init__(self):
        buildscript_kwargs = {
            "config_options": BUILD_BASE_CONFIG_OPTIONS,
            "all_actions": [
                "get-secrets",
                "clobber",
                "build",
                "static-analysis-autotest",
                "valgrind-test",
                "multi-l10n",
                "package-source",
            ],
            "require_config_file": True,
            # Default configuration
            "config": {
                "is_automation": True,
                "debug_build": False,
                # nightly stuff
                "nightly_build": False,
                # Seed all clones with mozilla-unified. This ensures subsequent
                # jobs have a minimal `hg pull`.
                "clone_upstream_url": "https://hg.mozilla.org/mozilla-unified",
                "repo_base": "https://hg.mozilla.org",
                "profile_build_resources_path": "%(upload_path)s/profile_build_resources.json",
                "nightly_promotion_branches": ["mozilla-central", "mozilla-aurora"],
                # try will overwrite these
                "clone_with_purge": False,
                "clone_by_revision": False,
                "virtualenv_modules": [
                    "requests==2.8.1",
                ],
                "virtualenv_path": "venv",
            },
            "ConfigClass": BuildingConfig,
        }
        super(FxDesktopBuild, self).__init__(**buildscript_kwargs)

    def query_abs_dirs(self):
        if self.abs_dirs:
            return self.abs_dirs
        abs_dirs = super(FxDesktopBuild, self).query_abs_dirs()

        dirs = {
            # BuildFactories in factory.py refer to a 'build' dir on the slave.
            # This contains all the source code/objdir to compile.  However,
            # there is already a build dir in mozharness for every mh run. The
            # 'build' that factory refers to I named: 'src' so
            # there is a seperation in mh.  for example, rather than having
            # '{mozharness_repo}/build/build/', I have '{
            # mozharness_repo}/build/src/'
            "abs_obj_dir": os.path.join(abs_dirs["abs_work_dir"], self._query_objdir()),
            "upload_path": self.config["upload_env"]["UPLOAD_PATH"],
        }
        abs_dirs.update(dirs)
        self.abs_dirs = abs_dirs
        return self.abs_dirs

        # Actions {{{2

    @script.PreScriptRun
    def suppress_windows_modal_dialogs(self, *args, **kwargs):
        if self._is_windows():
            # Suppress Windows modal dialogs to avoid hangs
            import ctypes

            ctypes.windll.kernel32.SetErrorMode(0x8001)


if __name__ == "__main__":
    fx_desktop_build = FxDesktopBuild()
    fx_desktop_build.run_and_exit()
