diff options
Diffstat (limited to 'testing/mozharness/mozharness/mozilla/l10n/locales.py')
-rwxr-xr-x | testing/mozharness/mozharness/mozilla/l10n/locales.py | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/testing/mozharness/mozharness/mozilla/l10n/locales.py b/testing/mozharness/mozharness/mozilla/l10n/locales.py new file mode 100755 index 0000000000..83fadd0133 --- /dev/null +++ b/testing/mozharness/mozharness/mozilla/l10n/locales.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python +# ***** BEGIN LICENSE BLOCK ***** +# 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/. +# ***** END LICENSE BLOCK ***** +"""Localization. +""" + +import os +import pprint + +from mozharness.base.config import parse_config_file + + +# LocalesMixin {{{1 +class LocalesMixin(object): + def __init__(self, **kwargs): + """Mixins generally don't have an __init__. + This breaks super().__init__() for children. + However, this is needed to override the query_abs_dirs() + """ + self.abs_dirs = None + self.locales = None + self.gecko_locale_revisions = None + self.l10n_revisions = {} + + def query_locales(self): + if self.locales is not None: + return self.locales + c = self.config + ignore_locales = c.get("ignore_locales", []) + additional_locales = c.get("additional_locales", []) + # List of locales can be set by using different methods in the + # following order: + # 1. "MOZ_LOCALES" env variable: a string of locale:revision separated + # by space + # 2. self.config["locales"] which can be either coming from the config + # or from --locale command line argument + # 3. using self.config["locales_file"] l10n changesets file + locales = None + + # Environment variable + if not locales and "MOZ_LOCALES" in os.environ: + self.debug("Using locales from environment: %s" % os.environ["MOZ_LOCALES"]) + locales = os.environ["MOZ_LOCALES"].split() + + # Command line or config + if not locales and c.get("locales", []): + locales = c["locales"] + self.debug("Using locales from config/CLI: %s" % ", ".join(locales)) + + # parse locale:revision if set + if locales: + for l in locales: + if ":" in l: + # revision specified in locale string + locale, revision = l.split(":", 1) + self.debug("Using %s:%s" % (locale, revision)) + self.l10n_revisions[locale] = revision + # clean up locale by removing revisions + locales = [l.split(":")[0] for l in locales] + + if not locales and "locales_file" in c: + abs_dirs = self.query_abs_dirs() + locales_file = os.path.join(abs_dirs["abs_src_dir"], c["locales_file"]) + locales = self.parse_locales_file(locales_file) + + if not locales: + self.fatal("No locales set!") + + for locale in ignore_locales: + if locale in locales: + self.debug("Ignoring locale %s." % locale) + locales.remove(locale) + if locale in self.l10n_revisions: + del self.l10n_revisions[locale] + + for locale in additional_locales: + if locale not in locales: + self.debug("Adding locale %s." % locale) + locales.append(locale) + + if not locales: + return None + self.locales = locales + return self.locales + + def list_locales(self): + """Stub action method.""" + self.info("Locale list: %s" % str(self.query_locales())) + + def parse_locales_file(self, locales_file): + locales = [] + c = self.config + self.info("Parsing locales file %s" % locales_file) + platform = c.get("locales_platform", None) + + if locales_file.endswith("json"): + locales_json = parse_config_file(locales_file) + for locale in sorted(locales_json.keys()): + if isinstance(locales_json[locale], dict): + if platform and platform not in locales_json[locale]["platforms"]: + continue + self.l10n_revisions[locale] = locales_json[locale]["revision"] + else: + # some other way of getting this? + self.l10n_revisions[locale] = "default" + locales.append(locale) + else: + locales = self.read_from_file(locales_file).split() + self.info("self.l10n_revisions: %s" % pprint.pformat(self.l10n_revisions)) + self.info("locales: %s" % locales) + return locales + + def query_abs_dirs(self): + if self.abs_dirs: + return self.abs_dirs + abs_dirs = super(LocalesMixin, self).query_abs_dirs() + c = self.config + dirs = {} + dirs["abs_work_dir"] = os.path.join(c["base_work_dir"], c["work_dir"]) + dirs["abs_l10n_dir"] = os.path.abspath( + os.path.join(abs_dirs["abs_src_dir"], "../l10n-central") + ) + dirs["abs_locales_src_dir"] = os.path.join( + abs_dirs["abs_src_dir"], + c["locales_dir"], + ) + + dirs["abs_obj_dir"] = os.path.join(dirs["abs_work_dir"], c["objdir"]) + dirs["abs_locales_dir"] = os.path.join(dirs["abs_obj_dir"], c["locales_dir"]) + + for key in list(dirs.keys()): + if key not in abs_dirs: + abs_dirs[key] = dirs[key] + self.abs_dirs = abs_dirs + return self.abs_dirs + + # This requires self to inherit a VCSMixin. + def pull_locale_source(self, hg_l10n_base=None, parent_dir=None, vcs="hg"): + c = self.config + if not hg_l10n_base: + hg_l10n_base = c["hg_l10n_base"] + if parent_dir is None: + parent_dir = self.query_abs_dirs()["abs_l10n_dir"] + self.mkdir_p(parent_dir) + # This block is to allow for pulling buildbot-configs in Fennec + # release builds, since we don't pull it in MBF anymore. + if c.get("l10n_repos"): + repos = c.get("l10n_repos") + self.vcs_checkout_repos(repos, tag_override=c.get("tag_override")) + # Pull locales + locales = self.query_locales() + locale_repos = [] + for locale in locales: + tag = c.get("hg_l10n_tag", "default") + if self.l10n_revisions.get(locale): + tag = self.l10n_revisions[locale] + locale_repos.append( + {"repo": "%s/%s" % (hg_l10n_base, locale), "branch": tag, "vcs": vcs} + ) + revs = self.vcs_checkout_repos( + repo_list=locale_repos, + parent_dir=parent_dir, + tag_override=c.get("tag_override"), + ) + self.gecko_locale_revisions = revs + + +# __main__ {{{1 + +if __name__ == "__main__": + pass |