# 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/. import os import attr import yaml from mozilla_version.gecko import FirefoxVersion from ..cli import BaseTryParser from ..push import push_to_try, vcs TARGET_TASKS = { "staging": "staging_release_builds", "release-sim": "release_simulation", } def read_file(path): with open(path) as fh: return fh.read() class ReleaseParser(BaseTryParser): name = "release" arguments = [ [ ["-v", "--version"], { "metavar": "STR", "required": True, "action": "store", "type": FirefoxVersion.parse, "help": "The version number to use for the staging release.", }, ], [ ["--migration"], { "metavar": "STR", "action": "append", "dest": "migrations", "choices": [ "central-to-beta", "beta-to-release", "early-to-late-beta", "release-to-esr", ], "help": "Migration to run for the release (can be specified multiple times).", }, ], [ ["--no-limit-locales"], { "action": "store_false", "dest": "limit_locales", "help": "Don't build a limited number of locales in the staging release.", }, ], [ ["--tasks"], { "choices": TARGET_TASKS.keys(), "default": "staging", "help": "Which tasks to run on-push.", }, ], ] common_groups = ["push"] task_configs = ["disable-pgo", "worker-overrides"] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.set_defaults(migrations=[]) def run( version, migrations, limit_locales, tasks, try_config=None, stage_changes=False, dry_run=False, message="{msg}", closed_tree=False, ): app_version = attr.evolve(version, beta_number=None, is_esr=False) files_to_change = { "browser/config/version.txt": "{}\n".format(app_version), "browser/config/version_display.txt": "{}\n".format(version), "config/milestone.txt": "{}\n".format(app_version), } with open("browser/config/version.txt") as f: current_version = FirefoxVersion.parse(f.read()) format_options = { "current_major_version": current_version.major_number, "next_major_version": version.major_number, "current_weave_version": current_version.major_number + 2, "next_weave_version": version.major_number + 2, } if "beta-to-release" in migrations and "early-to-late-beta" not in migrations: migrations.append("early-to-late-beta") release_type = version.version_type.name.lower() if release_type not in ("beta", "release", "esr"): raise Exception( "Can't do staging release for version: {} type: {}".format( version, version.version_type ) ) elif release_type == "esr": release_type += str(version.major_number) task_config = { "version": 2, "parameters": { "target_tasks_method": TARGET_TASKS[tasks], "optimize_target_tasks": True, "release_type": release_type, }, } if try_config: task_config["parameters"]["try_task_config"] = try_config with open(os.path.join(vcs.path, "taskcluster/ci/config.yml")) as f: migration_configs = yaml.safe_load(f) for migration in migrations: migration_config = migration_configs["merge-automation"]["behaviors"][migration] for (path, from_, to) in migration_config["replacements"]: if path in files_to_change: contents = files_to_change[path] else: contents = read_file(path) from_ = from_.format(**format_options) to = to.format(**format_options) files_to_change[path] = contents.replace(from_, to) if limit_locales: files_to_change["browser/locales/l10n-changesets.json"] = read_file( os.path.join(vcs.path, "browser/locales/l10n-onchange-changesets.json") ) files_to_change["browser/locales/shipped-locales"] = "en-US\n" + read_file( os.path.join(vcs.path, "browser/locales/onchange-locales") ) msg = "staging release: {}".format(version) return push_to_try( "release", message.format(msg=msg), stage_changes=stage_changes, dry_run=dry_run, closed_tree=closed_tree, try_task_config=task_config, files_to_change=files_to_change, )