fune/taskcluster/gecko_taskgraph/transforms/split_by_locale.py
Ben Hearsum abd2a1fcbb Bug 1814727: add tasks for attributing l10n builds r=ahal
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
2023-03-13 19:04:06 +00:00

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