forked from mirrors/gecko-dev
The kind is more or less the same as the en-US counterpart in the previous revision. As with the en-US attribution kind, this also does does _not_ use the `multi_dep` loader to set up the per-locale tasks. Of course, we do need to split by locale, which is now being done quite explicitly by the new `split_by_locale` that looks at the specified locales file, and uses specific platforms specified in the kind. As with the previous revision, please feel free to push back if any of you feel any of this is going in the wrong direction, is worse than multi_dep, etc. etc. Differential Revision: https://phabricator.services.mozilla.com/D170245
79 lines
3.2 KiB
Python
79 lines
3.2 KiB
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/.
|
|
"""
|
|
This transform splits the jobs it receives into per-locale tasks. Locales are
|
|
provided by the `locales-file`.
|
|
"""
|
|
|
|
from copy import deepcopy
|
|
from pprint import pprint
|
|
|
|
from taskgraph.transforms.base import TransformSequence
|
|
from taskgraph.util.schema import Schema
|
|
from voluptuous import Extra, Optional, Required
|
|
|
|
from gecko_taskgraph.transforms.l10n import parse_locales_file
|
|
|
|
transforms = TransformSequence()
|
|
|
|
split_by_locale_schema = Schema(
|
|
{
|
|
# The file to pull locale information from. This should be a json file
|
|
# such as browser/locales/l10n-changesets.json.
|
|
Required("locales-file"): str,
|
|
# The platform name in the form used by the locales files. Defaults to
|
|
# attributes.build_platform if not provided.
|
|
Optional("locale-file-platform"): str,
|
|
# A list of properties elsewhere in the job that need to have the locale
|
|
# name substituted into them. The referenced properties may be strings
|
|
# or lists. In the case of the latter, all list values will have
|
|
# substitutions performed.
|
|
Optional("properties-with-locale"): [str],
|
|
Extra: object,
|
|
}
|
|
)
|
|
|
|
|
|
transforms.add_validate(split_by_locale_schema)
|
|
|
|
|
|
@transforms.add
|
|
def add_command(config, jobs):
|
|
for job in jobs:
|
|
locales_file = job.pop("locales-file")
|
|
properties_with_locale = job.pop("properties-with-locale")
|
|
build_platform = job.pop(
|
|
"locale-file-platform", job["attributes"]["build_platform"]
|
|
)
|
|
|
|
for locale in parse_locales_file(locales_file, build_platform):
|
|
locale_job = deepcopy(job)
|
|
locale_job["attributes"]["locale"] = locale
|
|
for prop in properties_with_locale:
|
|
container, subfield = locale_job, prop
|
|
while "." in subfield:
|
|
f, subfield = subfield.split(".", 1)
|
|
if f not in container:
|
|
raise Exception(
|
|
f"Unable to find property {prop} to perform locale substitution on. Job is:\n{pprint(job)}"
|
|
)
|
|
container = container[f]
|
|
if not isinstance(container, dict):
|
|
raise Exception(
|
|
f"{container} is not a dict, cannot perform locale substitution. Job is:\n{pprint(job)}"
|
|
)
|
|
|
|
if isinstance(container[subfield], str):
|
|
container[subfield] = container[subfield].format(locale=locale)
|
|
elif isinstance(container[subfield], list):
|
|
for i in range(len(container[subfield])):
|
|
container[subfield][i] = container[subfield][i].format(
|
|
locale=locale
|
|
)
|
|
else:
|
|
raise Exception(
|
|
f"Don't know how to subtitute locale for value of type: {type(container[subfield])}; value is: {container[subfield]}"
|
|
)
|
|
|
|
yield locale_job
|