Source code

Revision control

Other Tools

# 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/.
from __future__ import absolute_import
import os
import sys
sys.path.insert(1, os.path.dirname(sys.path[0])) # noqa - don't warn about imports
from mozharness.base.log import FATAL
from mozharness.base.script import BaseScript
class Repackage(BaseScript):
def __init__(self, require_config_file=False):
script_kwargs = {
"all_actions": [
"setup",
"repackage",
],
}
BaseScript.__init__(
self, require_config_file=require_config_file, **script_kwargs
)
def setup(self):
dirs = self.query_abs_dirs()
self._run_tooltool()
mar_path = os.path.join(dirs["abs_input_dir"], "mar")
if self._is_windows():
mar_path += ".exe"
if mar_path and os.path.exists(mar_path):
self.chmod(mar_path, 0o755)
if self.config.get("run_configure", True):
self._get_mozconfig()
self._run_configure()
def query_abs_dirs(self):
if self.abs_dirs:
return self.abs_dirs
abs_dirs = super(Repackage, self).query_abs_dirs()
config = self.config
dirs = {}
dirs["abs_input_dir"] = os.path.join(abs_dirs["base_work_dir"], "fetches")
output_dir_suffix = []
if config.get("locale"):
output_dir_suffix.append(config["locale"])
if config.get("repack_id"):
output_dir_suffix.append(config["repack_id"])
dirs["abs_output_dir"] = os.path.join(
abs_dirs["abs_work_dir"], "outputs", *output_dir_suffix
)
for key in dirs.keys():
if key not in abs_dirs:
abs_dirs[key] = dirs[key]
self.abs_dirs = abs_dirs
return self.abs_dirs
def repackage(self):
config = self.config
dirs = self.query_abs_dirs()
subst = {
"package-name": config["package-name"],
# sfx-stub is only defined for Windows targets
"sfx-stub": config.get("sfx-stub"),
"installer-tag": config["installer-tag"],
"stub-installer-tag": config["stub-installer-tag"],
"wsx-stub": config["wsx-stub"],
}
subst.update(dirs)
if config.get("fetch-dir"):
subst.update({"fetch-dir": os.path.abspath(config["fetch-dir"])})
# Make sure the upload dir is around.
self.mkdir_p(dirs["abs_output_dir"])
for repack_config in config["repackage_config"]:
command = [sys.executable, "mach", "--log-no-times", "repackage"]
command.extend([arg.format(**subst) for arg in repack_config["args"]])
for arg, filename in repack_config["inputs"].items():
command.extend(
[
"--{}".format(arg),
os.path.join(dirs["abs_input_dir"], filename),
]
)
command.extend(
[
"--output",
os.path.join(dirs["abs_output_dir"], repack_config["output"]),
]
)
self.run_command(
command=command,
cwd=dirs["abs_src_dir"],
halt_on_failure=True,
env=self.query_env(),
)
def _run_tooltool(self):
config = self.config
dirs = self.query_abs_dirs()
manifest_src = os.environ.get("TOOLTOOL_MANIFEST")
if not manifest_src:
manifest_src = config.get("tooltool_manifest_src")
if not manifest_src:
return
cmd = [
sys.executable,
"-u",
os.path.join(dirs["abs_src_dir"], "mach"),
"artifact",
"toolchain",
"-v",
"--retry",
"4",
"--artifact-manifest",
os.path.join(dirs["abs_src_dir"], "toolchains.json"),
]
if manifest_src:
cmd.extend(
[
"--tooltool-manifest",
os.path.join(dirs["abs_src_dir"], manifest_src),
]
)
cache = config.get("tooltool_cache")
if cache:
cmd.extend(["--cache-dir", cache])
self.info(str(cmd))
self.run_command(cmd, cwd=dirs["abs_src_dir"], halt_on_failure=True)
def _get_mozconfig(self):
"""assign mozconfig."""
c = self.config
dirs = self.query_abs_dirs()
abs_mozconfig_path = ""
# first determine the mozconfig path
if c.get("src_mozconfig"):
self.info("Using in-tree mozconfig")
abs_mozconfig_path = os.path.join(dirs["abs_src_dir"], c["src_mozconfig"])
else:
self.fatal(
"'src_mozconfig' must be in the config "
"in order to determine the mozconfig."
)
# print its contents
self.read_from_file(abs_mozconfig_path, error_level=FATAL)
# finally, copy the mozconfig to a path that 'mach build' expects it to be
self.copyfile(
abs_mozconfig_path, os.path.join(dirs["abs_src_dir"], ".mozconfig")
)
def _run_configure(self):
dirs = self.query_abs_dirs()
command = [sys.executable, "mach", "--log-no-times", "configure"]
return self.run_command(
command=command,
cwd=dirs["abs_src_dir"],
output_timeout=60 * 3,
halt_on_failure=True,
)
if __name__ == "__main__":
repack = Repackage()
repack.run_and_exit()