Version in base suite: 128.10.0esr-1~deb12u1 Base version: firefox-esr_128.10.0esr-1~deb12u1 Target version: firefox-esr_128.10.1esr-1~deb12u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/f/firefox-esr/firefox-esr_128.10.0esr-1~deb12u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/f/firefox-esr/firefox-esr_128.10.1esr-1~deb12u1.dsc browser/config/version.txt | 2 browser/config/version_display.txt | 2 config/milestone.txt | 2 debian/changelog | 7 js/src/builtin/Promise.cpp | 46 +- js/src/jit/IonAnalysis.cpp | 4 sourcestamp.txt | 4 taskcluster/config.yml | 45 +- taskcluster/gecko_taskgraph/actions/merge_automation.py | 21 - taskcluster/gecko_taskgraph/config.py | 2 taskcluster/gecko_taskgraph/transforms/merge_automation.py | 10 taskcluster/gecko_taskgraph/transforms/release_version_bump.py | 42 -- taskcluster/gecko_taskgraph/transforms/resolve_landoscript_keyed_by.py | 45 ++ taskcluster/gecko_taskgraph/transforms/task.py | 171 ++++++++++ taskcluster/kinds/android-l10n/kind.yml | 26 - taskcluster/kinds/l10n-bump/kind.yml | 37 -- taskcluster/kinds/merge-automation/kind.yml | 35 +- taskcluster/kinds/release-early-tagging/kind.yml | 38 +- taskcluster/kinds/release-version-bump/kind.yml | 37 +- testing/mozharness/scripts/release/update-verify-config-creator.py | 8 20 files changed, 417 insertions(+), 167 deletions(-) diff -Nru firefox-esr-128.10.0esr/browser/config/version.txt firefox-esr-128.10.1esr/browser/config/version.txt --- firefox-esr-128.10.0esr/browser/config/version.txt 2025-04-21 19:07:11.000000000 +0000 +++ firefox-esr-128.10.1esr/browser/config/version.txt 2025-05-17 18:02:45.000000000 +0000 @@ -1 +1 @@ -128.10.0 +128.10.1 diff -Nru firefox-esr-128.10.0esr/browser/config/version_display.txt firefox-esr-128.10.1esr/browser/config/version_display.txt --- firefox-esr-128.10.0esr/browser/config/version_display.txt 2025-04-21 19:07:11.000000000 +0000 +++ firefox-esr-128.10.1esr/browser/config/version_display.txt 2025-05-17 18:02:45.000000000 +0000 @@ -1 +1 @@ -128.10.0esr +128.10.1esr diff -Nru firefox-esr-128.10.0esr/config/milestone.txt firefox-esr-128.10.1esr/config/milestone.txt --- firefox-esr-128.10.0esr/config/milestone.txt 2025-04-21 19:07:11.000000000 +0000 +++ firefox-esr-128.10.1esr/config/milestone.txt 2025-05-17 18:02:44.000000000 +0000 @@ -10,4 +10,4 @@ # hardcoded milestones in the tree from these two files. #-------------------------------------------------------- -128.10.0 +128.10.1 diff -Nru firefox-esr-128.10.0esr/debian/changelog firefox-esr-128.10.1esr/debian/changelog --- firefox-esr-128.10.0esr/debian/changelog 2025-04-29 22:50:47.000000000 +0000 +++ firefox-esr-128.10.1esr/debian/changelog 2025-05-17 21:41:48.000000000 +0000 @@ -1,3 +1,10 @@ +firefox-esr (128.10.1esr-1~deb12u1) bookworm-security; urgency=medium + + * New upstream release. + * Fixes for mfsa2025-37, also known as CVE-2025-4920, CVE-2025-4921. + + -- Mike Hommey Sun, 18 May 2025 06:41:48 +0900 + firefox-esr (128.10.0esr-1~deb12u1) bookworm-security; urgency=medium * New upstream release. diff -Nru firefox-esr-128.10.0esr/js/src/builtin/Promise.cpp firefox-esr-128.10.1esr/js/src/builtin/Promise.cpp --- firefox-esr-128.10.0esr/js/src/builtin/Promise.cpp 2025-04-21 19:07:14.000000000 +0000 +++ firefox-esr-128.10.1esr/js/src/builtin/Promise.cpp 2025-05-17 18:02:47.000000000 +0000 @@ -100,7 +100,7 @@ enum PromiseCombinatorElementFunctionSlots { PromiseCombinatorElementFunctionSlot_Data = 0, - PromiseCombinatorElementFunctionSlot_ElementIndex, + PromiseCombinatorElementFunctionSlot_ElementIndexOrResolveFunc, }; enum ReactionJobSlots { @@ -3137,7 +3137,8 @@ static JSFunction* NewPromiseCombinatorElementFunction( JSContext* cx, Native native, - Handle dataHolder, uint32_t index); + Handle dataHolder, uint32_t index, + Handle maybeResolveFunc); static bool PromiseAllResolveElementFunction(JSContext* cx, unsigned argc, Value* vp); @@ -3239,7 +3240,8 @@ // Steps 4.j-q. JSFunction* resolveFunc = NewPromiseCombinatorElementFunction( - cx, PromiseAllResolveElementFunction, dataHolder, index); + cx, PromiseAllResolveElementFunction, dataHolder, index, + UndefinedHandleValue); if (!resolveFunc) { return nullptr; } @@ -3885,7 +3887,8 @@ static JSFunction* NewPromiseCombinatorElementFunction( JSContext* cx, Native native, - Handle dataHolder, uint32_t index) { + Handle dataHolder, uint32_t index, + Handle maybeResolveFunc) { JSFunction* fn = NewNativeFunction( cx, native, 1, nullptr, gc::AllocKind::FUNCTION_EXTENDED, GenericObject); if (!fn) { @@ -3894,8 +3897,15 @@ fn->setExtendedSlot(PromiseCombinatorElementFunctionSlot_Data, ObjectValue(*dataHolder)); - fn->setExtendedSlot(PromiseCombinatorElementFunctionSlot_ElementIndex, - Int32Value(index)); + if (maybeResolveFunc.isObject()) { + fn->setExtendedSlot( + PromiseCombinatorElementFunctionSlot_ElementIndexOrResolveFunc, + maybeResolveFunc); + } else { + fn->setExtendedSlot( + PromiseCombinatorElementFunctionSlot_ElementIndexOrResolveFunc, + Int32Value(index)); + } return fn; } @@ -3928,6 +3938,14 @@ // Step 1. Let F be the active function object. JSFunction* fn = &args.callee().as(); + constexpr size_t indexOrResolveFuncSlot = + PromiseCombinatorElementFunctionSlot_ElementIndexOrResolveFunc; + if (fn->getExtendedSlot(indexOrResolveFuncSlot).isObject()) { + Value slotVal = fn->getExtendedSlot(indexOrResolveFuncSlot); + fn = &slotVal.toObject().as(); + } + MOZ_RELEASE_ASSERT(fn->getExtendedSlot(indexOrResolveFuncSlot).isInt32()); + // Promise.all functions // Step 2. If F.[[AlreadyCalled]] is true, return undefined. // Promise.allSettled functions @@ -3956,9 +3974,7 @@ // Step 4. Let index be F.[[Index]]. // Promise.allSettled functions // Step 5. Let index be F.[[Index]]. - int32_t idx = - fn->getExtendedSlot(PromiseCombinatorElementFunctionSlot_ElementIndex) - .toInt32(); + int32_t idx = fn->getExtendedSlot(indexOrResolveFuncSlot).toInt32(); MOZ_ASSERT(idx >= 0); *index = uint32_t(idx); @@ -4012,7 +4028,8 @@ // Steps 4.j-q. JSFunction* resolveFunc = NewPromiseCombinatorElementFunction( - cx, PromiseAllResolveElementFunction, dataHolder, index); + cx, PromiseAllResolveElementFunction, dataHolder, index, + UndefinedHandleValue); if (!resolveFunc) { return false; } @@ -4236,7 +4253,8 @@ // Steps 4.j-r. JSFunction* resolveFunc = NewPromiseCombinatorElementFunction( - cx, PromiseAllSettledResolveElementFunction, dataHolder, index); + cx, PromiseAllSettledResolveElementFunction, dataHolder, index, + UndefinedHandleValue); if (!resolveFunc) { return false; } @@ -4244,7 +4262,8 @@ // Steps 4.s-z. JSFunction* rejectFunc = NewPromiseCombinatorElementFunction( - cx, PromiseAllSettledRejectElementFunction, dataHolder, index); + cx, PromiseAllSettledRejectElementFunction, dataHolder, index, + resolveFunVal); if (!rejectFunc) { return false; } @@ -4473,7 +4492,8 @@ // Steps 4.j-q. JSFunction* rejectFunc = NewPromiseCombinatorElementFunction( - cx, PromiseAnyRejectElementFunction, dataHolder, index); + cx, PromiseAnyRejectElementFunction, dataHolder, index, + UndefinedHandleValue); if (!rejectFunc) { return false; } diff -Nru firefox-esr-128.10.0esr/js/src/jit/IonAnalysis.cpp firefox-esr-128.10.1esr/js/src/jit/IonAnalysis.cpp --- firefox-esr-128.10.0esr/js/src/jit/IonAnalysis.cpp 2025-04-21 19:07:14.000000000 +0000 +++ firefox-esr-128.10.1esr/js/src/jit/IonAnalysis.cpp 2025-05-17 18:02:48.000000000 +0000 @@ -3874,6 +3874,10 @@ } MOZ_ASSERT(space == MathSpace::Modulo || space == MathSpace::Infinite); + if (space == MathSpace::Modulo) { + return SimpleLinearSum(ins, 0); + } + MDefinition* lhs = ins->getOperand(0); MDefinition* rhs = ins->getOperand(1); if (lhs->type() != MIRType::Int32 || rhs->type() != MIRType::Int32) { diff -Nru firefox-esr-128.10.0esr/sourcestamp.txt firefox-esr-128.10.1esr/sourcestamp.txt --- firefox-esr-128.10.0esr/sourcestamp.txt 2025-04-21 19:07:50.000000000 +0000 +++ firefox-esr-128.10.1esr/sourcestamp.txt 2025-05-17 18:03:23.000000000 +0000 @@ -1,2 +1,2 @@ -20250421121556 -https://hg.mozilla.org/releases/mozilla-esr128/rev/8e875e7de75c05112284e9f6e91927b7bbe36e79 +20250517152055 +https://hg.mozilla.org/releases/mozilla-esr128/rev/cf43f46ebc3d13f3bec9da37ea2c8750b3dfaaf1 diff -Nru firefox-esr-128.10.0esr/taskcluster/config.yml firefox-esr-128.10.1esr/taskcluster/config.yml --- firefox-esr-128.10.0esr/taskcluster/config.yml 2025-04-21 19:07:20.000000000 +0000 +++ firefox-esr-128.10.1esr/taskcluster/config.yml 2025-05-17 18:02:54.000000000 +0000 @@ -550,12 +550,13 @@ - - browser/config/mozconfigs/macosx64/l10n-mozconfig - ac_add_options --with-branding=browser/branding/nightly - ac_add_options --enable-official-branding + - - .arcconfig + - FIREFOXAUTOLAND + - FIREFOXBETA merge-old-head: true base-tag: 'FIREFOX_BETA_{major_version}_BASE' end-tag: 'FIREFOX_BETA_{major_version}_END' - from-repo: 'https://hg.mozilla.org/mozilla-central' - from-branch: 'central' - to-repo: 'https://hg.mozilla.org/releases/mozilla-beta' + from-branch: 'main' to-branch: 'beta' early-to-late-beta: fetch-version-from: "browser/config/version.txt" @@ -565,7 +566,6 @@ - EARLY_BETA_OR_EARLIER=1 - EARLY_BETA_OR_EARLIER= merge-old-head: false - to-repo: 'https://hg.mozilla.org/releases/mozilla-beta' to-branch: 'beta' beta-to-release: fetch-version-from: "browser/config/version.txt" @@ -574,23 +574,26 @@ new-suffix: '' - filename: "mobile/android/version.txt" new-suffix: '' - replacements: [] + replacements: + - - .arcconfig + - FIREFOXBETA + - FIREFOXRELEASE merge-old-head: true base-tag: 'FIREFOX_RELEASE_{major_version}_BASE' end-tag: 'FIREFOX_RELEASE_{major_version}_END' - from-repo: 'https://hg.mozilla.org/releases/mozilla-beta' from-branch: 'beta' - to-repo: 'https://hg.mozilla.org/releases/mozilla-release' to-branch: 'release' release-to-esr: fetch-version-from: "browser/config/version.txt" version-files: - filename: "browser/config/version_display.txt" new-suffix: 'esr' - replacements: [] + replacements: + - - .arcconfig + - FIREFOXRELEASE + - FIREFOXESRONETWOEIGHT merge-old-head: false end-tag: "FIREFOX_ESR_{major_version}_BASE" - to-repo: 'https://hg.mozilla.org/releases/mozilla-esr128' to-branch: 'esr128' bump-central: fetch-version-from: "browser/config/version.txt" @@ -613,8 +616,7 @@ - 'WEAVE_VERSION = "1.{next_weave_version}.0"' merge-old-head: false end-tag: 'FIREFOX_NIGHTLY_{major_version}_END' - to-repo: 'https://hg.mozilla.org/mozilla-central' - to-branch: 'central' + to-branch: 'main' bump-esr128: fetch-version-from: "browser/config/version.txt" version-files: @@ -624,9 +626,9 @@ version-bump: "minor" - filename: "browser/config/version_display.txt" version-bump: "minor" + new-suffix: "esr" replacements: [] merge-old-head: false - to-repo: 'https://hg.mozilla.org/releases/mozilla-esr128' to-branch: 'esr128' scriptworker: @@ -837,6 +839,25 @@ implementation: treescript os: scriptworker worker-type: '{trust-domain}-1-tree-dev' + lando: + provisioner: scriptworker-k8s + implementation: landoscript + os: linux + worker-type: + by-project: + # Autoland is treated specially here because any landoscript + # tasks that run on it must be done on level 3 workers + # (so they can actually push changes). On other projects + # `release-level` would handle this just fine, but + # `autoland` is considered a "staging" release level for + # historical reasons. + # https://bugzilla.mozilla.org/show_bug.cgi?id=1960918 + # seeks to improve this situation. + autoland: '{trust-domain}-3-lando' + default: + by-release-level: + production: '{trust-domain}-3-lando' + staging: '{trust-domain}-1-lando' t-bitbar-gw.*: provisioner: proj-autophone implementation: generic-worker diff -Nru firefox-esr-128.10.0esr/taskcluster/gecko_taskgraph/actions/merge_automation.py firefox-esr-128.10.1esr/taskcluster/gecko_taskgraph/actions/merge_automation.py --- firefox-esr-128.10.0esr/taskcluster/gecko_taskgraph/actions/merge_automation.py 2025-04-21 19:07:20.000000000 +0000 +++ firefox-esr-128.10.1esr/taskcluster/gecko_taskgraph/actions/merge_automation.py 2025-05-17 18:02:54.000000000 +0000 @@ -30,25 +30,12 @@ "description": "Override other options and do not push changes", "default": True, }, - "push": { - "type": "boolean", - "description": "Push changes using to_repo and to_branch", - "default": False, - }, "behavior": { "type": "string", "description": "The type of release promotion to perform.", "enum": sorted(graph_config["merge-automation"]["behaviors"].keys()), "default": "central-to-beta", }, - "from-repo": { - "type": "string", - "description": "The URI of the source repository", - }, - "to-repo": { - "type": "string", - "description": "The push URI of the target repository", - }, "from-branch": { "type": "string", "description": "The fx head of the source, such as central", @@ -57,10 +44,6 @@ "type": "string", "description": "The fx head of the target, such as beta", }, - "ssh-user-alias": { - "type": "string", - "description": "The alias of an ssh account to use when pushing changes.", - }, "fetch-version-from": { "type": "string", "description": "Path to file used when querying current version.", @@ -80,12 +63,8 @@ } for field in [ - "from-repo", "from-branch", - "to-repo", "to-branch", - "ssh-user-alias", - "push", "fetch-version-from", ]: if input.get(field): diff -Nru firefox-esr-128.10.0esr/taskcluster/gecko_taskgraph/config.py firefox-esr-128.10.1esr/taskcluster/gecko_taskgraph/config.py --- firefox-esr-128.10.0esr/taskcluster/gecko_taskgraph/config.py 2025-04-21 19:07:20.000000000 +0000 +++ firefox-esr-128.10.1esr/taskcluster/gecko_taskgraph/config.py 2025-05-17 18:02:53.000000000 +0000 @@ -50,8 +50,6 @@ str: { Optional("from-branch"): str, Required("to-branch"): str, - Optional("from-repo"): str, - Required("to-repo"): str, Required("version-files"): [ { Required("filename"): str, diff -Nru firefox-esr-128.10.0esr/taskcluster/gecko_taskgraph/transforms/merge_automation.py firefox-esr-128.10.1esr/taskcluster/gecko_taskgraph/transforms/merge_automation.py --- firefox-esr-128.10.0esr/taskcluster/gecko_taskgraph/transforms/merge_automation.py 2025-04-21 19:07:20.000000000 +0000 +++ firefox-esr-128.10.1esr/taskcluster/gecko_taskgraph/transforms/merge_automation.py 2025-05-17 18:02:53.000000000 +0000 @@ -19,10 +19,10 @@ merge_config = config.params["merge_config"] fields = [ "routes", - "worker.push", + "scopes", "worker-type", "worker.l10n-bump-info", - "worker.source-repo", + "worker.lando-repo", ] for task in tasks: for field in fields: @@ -67,17 +67,13 @@ # Override defaults, useful for testing. for field in [ - "from-repo", "from-branch", - "to-repo", "to-branch", "fetch-version-from", + "lando-repo", ]: if merge_config.get(field): worker["merge-info"][field] = merge_config[field] worker["force-dry-run"] = merge_config["force-dry-run"] - worker["ssh-user"] = merge_config.get("ssh-user-alias", "merge_user") - if merge_config.get("push"): - worker["push"] = merge_config["push"] yield task diff -Nru firefox-esr-128.10.0esr/taskcluster/gecko_taskgraph/transforms/release_version_bump.py firefox-esr-128.10.1esr/taskcluster/gecko_taskgraph/transforms/release_version_bump.py --- firefox-esr-128.10.0esr/taskcluster/gecko_taskgraph/transforms/release_version_bump.py 2025-04-21 19:07:20.000000000 +0000 +++ firefox-esr-128.10.1esr/taskcluster/gecko_taskgraph/transforms/release_version_bump.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -# 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/. -""" -Transform the update generation task into an actual task description. -""" - -from taskgraph.transforms.base import TransformSequence -from taskgraph.util.schema import resolve_keyed_by - -transforms = TransformSequence() - - -@transforms.add -def handle_keyed_by(config, tasks): - """Resolve fields that can be keyed by platform, etc.""" - default_fields = [ - "worker.push", - "worker.bump-files", - "worker-type", - ] - for task in tasks: - fields = default_fields[:] - for additional_field in ( - "l10n-bump-info", - "source-repo", - "dontbuild", - "ignore-closed-tree", - ): - if additional_field in task["worker"]: - fields.append(f"worker.{additional_field}") - for field in fields: - resolve_keyed_by( - task, - field, - item_name=task["name"], - **{ - "project": config.params["project"], - "release-type": config.params["release_type"], - }, - ) - yield task diff -Nru firefox-esr-128.10.0esr/taskcluster/gecko_taskgraph/transforms/resolve_landoscript_keyed_by.py firefox-esr-128.10.1esr/taskcluster/gecko_taskgraph/transforms/resolve_landoscript_keyed_by.py --- firefox-esr-128.10.0esr/taskcluster/gecko_taskgraph/transforms/resolve_landoscript_keyed_by.py 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.10.1esr/taskcluster/gecko_taskgraph/transforms/resolve_landoscript_keyed_by.py 2025-05-17 18:02:53.000000000 +0000 @@ -0,0 +1,45 @@ +# 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/. +""" +Transform the update generation task into an actual task description. +""" + +from taskgraph.transforms.base import TransformSequence +from taskgraph.util.schema import resolve_keyed_by + +transforms = TransformSequence() + + +@transforms.add +def handle_keyed_by(config, tasks): + """Resolve fields that can be keyed by platform, etc.""" + default_fields = [ + "scopes", + "worker.push", + "worker.bump-files", + "worker-type", + ] + for task in tasks: + fields = default_fields[:] + for additional_field in ( + "l10n-bump-info", + "source-repo", + "lando-repo", + "hg-repo-url", + "dontbuild", + "ignore-closed-tree", + ): + if additional_field in task["worker"]: + fields.append(f"worker.{additional_field}") + for field in fields: + resolve_keyed_by( + task, + field, + item_name=task["name"], + **{ + "project": config.params["project"], + "release-type": config.params["release_type"], + }, + ) + yield task diff -Nru firefox-esr-128.10.0esr/taskcluster/gecko_taskgraph/transforms/task.py firefox-esr-128.10.1esr/taskcluster/gecko_taskgraph/transforms/task.py --- firefox-esr-128.10.0esr/taskcluster/gecko_taskgraph/transforms/task.py 2025-04-21 19:07:19.000000000 +0000 +++ firefox-esr-128.10.1esr/taskcluster/gecko_taskgraph/transforms/task.py 2025-05-17 18:02:53.000000000 +0000 @@ -1500,6 +1500,177 @@ @payload_builder( + "landoscript", + schema={ + Required("lando-repo"): str, + Optional("hg-repo-url"): str, + Optional("ignore-closed-tree"): bool, + Optional("dontbuild"): bool, + Optional("tags"): [Any("buildN", "release", None)], + Optional("force-dry-run"): bool, + Optional("android-l10n-import-info"): { + Required("from-repo-url"): str, + Required("toml-info"): [ + { + Required("toml-path"): str, + Required("dest-path"): str, + } + ], + }, + Optional("android-l10n-sync-info"): { + Required("from-branch"): str, + Required("toml-info"): [ + { + Required("toml-path"): str, + } + ], + }, + Optional("l10n-bump-info"): [ + { + Required("name"): str, + Required("path"): str, + Optional("l10n-repo-url"): str, + Optional("l10n-repo-target-branch"): str, + Optional("ignore-config"): object, + Required("platform-configs"): [ + { + Required("platforms"): [str], + Required("path"): str, + Optional("format"): str, + } + ], + } + ], + Optional("bump-files"): [str], + Optional("merge-info"): object, + }, +) +def build_landoscript_payload(config, task, task_def): + worker = task["worker"] + release_config = get_release_config(config) + task_def["payload"] = {"actions": [], "lando_repo": worker["lando-repo"]} + actions = task_def["payload"]["actions"] + + if worker.get("ignore-closed-tree") is not None: + task_def["payload"]["ignore_closed_tree"] = worker["ignore-closed-tree"] + + if worker.get("dontbuild"): + task_def["payload"]["dontbuild"] = True + + if worker.get("force-dry-run"): + task_def["payload"]["dry_run"] = True + + if worker.get("android-l10n-import-info"): + android_l10n_import_info = {} + for k, v in worker["android-l10n-import-info"].items(): + android_l10n_import_info[k.replace("-", "_")] = worker[ + "android-l10n-import-info" + ][k] + android_l10n_import_info["toml_info"] = [ + { + param_name.replace("-", "_"): param_value + for param_name, param_value in entry.items() + } + for entry in worker["android-l10n-import-info"]["toml-info"] + ] + task_def["payload"]["android_l10n_import_info"] = android_l10n_import_info + actions.append("android_l10n_import") + + if worker.get("android-l10n-sync-info"): + android_l10n_sync_info = {} + for k, v in worker["android-l10n-sync-info"].items(): + android_l10n_sync_info[k.replace("-", "_")] = worker[ + "android-l10n-sync-info" + ][k] + android_l10n_sync_info["toml_info"] = [ + { + param_name.replace("-", "_"): param_value + for param_name, param_value in entry.items() + } + for entry in worker["android-l10n-sync-info"]["toml-info"] + ] + task_def["payload"]["android_l10n_sync_info"] = android_l10n_sync_info + actions.append("android_l10n_sync") + + if worker.get("l10n-bump-info"): + l10n_bump_info = [] + l10n_repo_urls = set() + for lbi in worker["l10n-bump-info"]: + new_lbi = {} + if "l10n-repo-url" in lbi: + l10n_repo_urls.add(lbi["l10n-repo-url"]) + for k, v in lbi.items(): + new_lbi[k.replace("-", "_")] = lbi[k] + l10n_bump_info.append(new_lbi) + + task_def["payload"]["l10n_bump_info"] = l10n_bump_info + if len(l10n_repo_urls) > 1: + raise Exception( + "Must use the same l10n-repo-url for all files in the same task!" + ) + elif len(l10n_repo_urls) == 1: + actions.append("l10n_bump") + + if worker.get("tags"): + tag_names = [] + product = task["shipping-product"].upper() + version = release_config["version"].replace(".", "_") + buildnum = release_config["build_number"] + if "buildN" in worker["tags"]: + tag_names.extend( + [ + f"{product}_{version}_BUILD{buildnum}", + ] + ) + if "release" in worker["tags"]: + tag_names.extend([f"{product}_{version}_RELEASE"]) + tag_info = { + "tags": tag_names, + "hg_repo_url": worker["hg-repo-url"], + "revision": config.params[ + "{}head_rev".format(worker.get("repo-param-prefix", "")) + ], + } + task_def["payload"]["tag_info"] = tag_info + actions.append("tag") + + if worker.get("bump-files"): + bump_info = {} + bump_info["next_version"] = release_config["next_version"] + bump_info["files"] = worker["bump-files"] + task_def["payload"]["version_bump_info"] = bump_info + actions.append("version_bump") + + if worker.get("merge-info"): + merge_info = { + merge_param_name.replace("-", "_"): merge_param_value + for merge_param_name, merge_param_value in worker["merge-info"].items() + if merge_param_name != "version-files" + } + merge_info["version_files"] = [ + { + file_param_name.replace("-", "_"): file_param_value + for file_param_name, file_param_value in file_entry.items() + } + for file_entry in worker["merge-info"]["version-files"] + ] + # hack alert: co-opt the l10n_bump_info into the merge_info section + # this should be cleaned up to avoid l10n_bump_info ever existing + # in the payload + if task_def["payload"].get("l10n_bump_info"): + actions.remove("l10n_bump") + merge_info["l10n_bump_info"] = task_def["payload"].pop("l10n_bump_info") + + task_def["payload"]["merge_info"] = merge_info + actions.append("merge_day") + + scopes = set(task_def.get("scopes", [])) + scopes.add(f"project:releng:lando:repo:{worker['lando-repo']}") + scopes.update([f"project:releng:lando:action:{action}" for action in actions]) + task_def["scopes"] = sorted(scopes) + + +@payload_builder( "invalid", schema={ # an invalid task is one which should never actually be created; this is used in diff -Nru firefox-esr-128.10.0esr/taskcluster/kinds/android-l10n/kind.yml firefox-esr-128.10.1esr/taskcluster/kinds/android-l10n/kind.yml --- firefox-esr-128.10.0esr/taskcluster/kinds/android-l10n/kind.yml 2025-04-21 19:07:20.000000000 +0000 +++ firefox-esr-128.10.1esr/taskcluster/kinds/android-l10n/kind.yml 2025-05-17 18:02:54.000000000 +0000 @@ -5,6 +5,7 @@ loader: taskgraph.loader.transform:loader transforms: + - gecko_taskgraph.transforms.resolve_landoscript_keyed_by:transforms - gecko_taskgraph.transforms.task:transforms task-defaults: @@ -13,13 +14,9 @@ kind: build platform: fenix-android-all/opt tier: 1 - worker-type: tree + worker-type: lando worker: - implementation: treescript - tags: [] - bump: false - dontbuild: false - push: true + implementation: landoscript tasks: import: @@ -28,8 +25,10 @@ treeherder: symbol: android-l10n(I) worker: - ignore-closed-tree: true - source-repo: https://hg.mozilla.org/integration/autoland + lando-repo: + by-project: + try: staging-firefox-autoland + default: firefox-autoland android-l10n-import-info: from-repo-url: https://github.com/mozilla-l10n/android-l10n toml-info: @@ -42,14 +41,17 @@ sync: name: android_l10n_sync - description: Sync android-l10n strings from central to beta + description: Sync android-l10n strings from main to beta treeherder: symbol: android-l10n(S) worker: - ignore-closed-tree: false - source-repo: https://hg.mozilla.org/releases/mozilla-beta + lando-repo: + by-project: + try: staging-firefox-beta + default: firefox-beta + ignore-closed-tree: true android-l10n-sync-info: - from-repo-url: https://hg.mozilla.org/mozilla-central + from-branch: main toml-info: - toml-path: mobile/android/fenix/l10n.toml - toml-path: mobile/android/focus-android/l10n.toml diff -Nru firefox-esr-128.10.0esr/taskcluster/kinds/l10n-bump/kind.yml firefox-esr-128.10.1esr/taskcluster/kinds/l10n-bump/kind.yml --- firefox-esr-128.10.0esr/taskcluster/kinds/l10n-bump/kind.yml 2025-04-21 19:07:20.000000000 +0000 +++ firefox-esr-128.10.1esr/taskcluster/kinds/l10n-bump/kind.yml 2025-05-17 18:02:54.000000000 +0000 @@ -5,33 +5,34 @@ loader: taskgraph.loader.transform:loader transforms: - - gecko_taskgraph.transforms.release_version_bump:transforms + - gecko_taskgraph.transforms.resolve_landoscript_keyed_by:transforms - gecko_taskgraph.transforms.task:transforms task-defaults: - worker-type: tree + worker-type: lando worker: - implementation: treescript - tags: [] - bump: false + implementation: landoscript dontbuild: by-project: mozilla-beta: false default: true ignore-closed-tree: by-project: - autoland: true - default: false - push: + mozilla-beta: false + default: true + lando-repo: by-project: - mozilla-(central|beta): true - autoland: true - default: false - source-repo: - by-release-type: - beta: https://hg.mozilla.org/releases/mozilla-beta - nightly: https://hg.mozilla.org/mozilla-central - default: https://hg.mozilla.org/integration/autoland + mozilla-central: main + mozilla-beta: firefox-beta + mozilla-release: firefox-release + mozilla-esr128: firefox-esr128 + autoland: firefox-autoland + # change this if you want to test esr bumps against other + # branches on try; there's rarely a need though. + try: staging-firefox-autoland + # set a default to avoid failing tgdiff tests on other branches + # even though this doesn't run there + default: '' l10n-bump-info: by-release-type: # XXX whenever the `beta` config changes, make sure to make @@ -39,7 +40,6 @@ beta: - name: Firefox l10n changesets path: browser/locales/l10n-changesets.json - version-path: browser/config/version.txt l10n-repo-url: https://github.com/mozilla-l10n/firefox-l10n l10n-repo-target-branch: main ignore-config: @@ -84,7 +84,6 @@ path: mobile/locales/l10n-changesets.json l10n-repo-url: https://github.com/mozilla-l10n/firefox-l10n l10n-repo-target-branch: main - version-path: mobile/android/version.txt platform-configs: [ { @@ -102,7 +101,6 @@ path: browser/locales/l10n-changesets.json l10n-repo-url: https://github.com/mozilla-l10n/firefox-l10n l10n-repo-target-branch: main - version-path: browser/config/version.txt ignore-config: ja: - macosx64 @@ -145,7 +143,6 @@ path: mobile/locales/l10n-changesets.json l10n-repo-url: https://github.com/mozilla-l10n/firefox-l10n l10n-repo-target-branch: main - version-path: mobile/android/version.txt platform-configs: [ { diff -Nru firefox-esr-128.10.0esr/taskcluster/kinds/merge-automation/kind.yml firefox-esr-128.10.1esr/taskcluster/kinds/merge-automation/kind.yml --- firefox-esr-128.10.0esr/taskcluster/kinds/merge-automation/kind.yml 2025-04-21 19:07:20.000000000 +0000 +++ firefox-esr-128.10.1esr/taskcluster/kinds/merge-automation/kind.yml 2025-05-17 18:02:54.000000000 +0000 @@ -19,20 +19,38 @@ kind: build platform: firefox-release/opt description: Merge repositories for release management. - worker-type: tree + scopes: + - "queue:route:notify.matrix-room.*" + worker-type: lando worker: - implementation: treescript - tags: [] - bump: false + implementation: landoscript + # lando-repo is the _destination_ repository; not the one + # the task runs on. For this reason it is keyed on behavior + # instead of project. + lando-repo: + by-project: + try: + by-behavior: + central-to-beta: staging-firefox-beta + early-to-late-beta: staging-firefox-beta + beta-to-release: staging-firefox-release + release-to-esr: staging-firefox-esr128 + bump-central: staging-firefox-main + bump-esr128: staging-firefox-esr128 + default: + by-behavior: + central-to-beta: firefox-beta + early-to-late-beta: firefox-beta + beta-to-release: firefox-release + release-to-esr: firefox-esr128 + bump-central: firefox-main + bump-esr128: firefox-esr128 dontbuild: false - ignore-closed-tree: true - push: false l10n-bump-info: by-behavior: central-to-beta: - name: Firefox l10n changesets path: browser/locales/l10n-changesets.json - version-path: browser/config/version.txt l10n-repo-url: https://github.com/mozilla-l10n/firefox-l10n l10n-repo-target-branch: main ignore-config: @@ -69,7 +87,6 @@ }] - name: mobile l10n changesets path: mobile/locales/l10n-changesets.json - version-path: mobile/android/version.txt l10n-repo-url: https://github.com/mozilla-l10n/firefox-l10n l10n-repo-target-branch: main platform-configs: [ @@ -96,8 +113,6 @@ # #releaseduty-dev - "notify.matrix-room.!wGgsWXnVncJLSBYmuf:mozilla.org.on-pending" - "notify.matrix-room.!wGgsWXnVncJLSBYmuf:mozilla.org.on-resolved" - scopes: - - "queue:route:notify.matrix-room.*" extra: notify: matrixBody: diff -Nru firefox-esr-128.10.0esr/taskcluster/kinds/release-early-tagging/kind.yml firefox-esr-128.10.1esr/taskcluster/kinds/release-early-tagging/kind.yml --- firefox-esr-128.10.0esr/taskcluster/kinds/release-early-tagging/kind.yml 2025-04-21 19:07:20.000000000 +0000 +++ firefox-esr-128.10.1esr/taskcluster/kinds/release-early-tagging/kind.yml 2025-05-17 18:02:54.000000000 +0000 @@ -1,30 +1,44 @@ -# 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/. --- loader: taskgraph.loader.transform:loader transforms: - gecko_taskgraph.transforms.release_deps:transforms - - gecko_taskgraph.transforms.release_version_bump:transforms + - gecko_taskgraph.transforms.resolve_landoscript_keyed_by:transforms - gecko_taskgraph.transforms.task:transforms task-defaults: description: Release Promotion version tag for buildN run-on-projects: [] shipping-phase: promote - worker-type: tree + worker-type: lando worker: - implementation: treescript + implementation: landoscript tags: ['buildN'] - bump: false - dontbuild: true - push: + lando-repo: by-project: - mozilla-(beta|release|esr.*): true - maple: true - default: false - + mozilla-beta: firefox-beta + mozilla-release: firefox-release + mozilla-esr115: firefox-esr115 + mozilla-esr128: firefox-esr128 + try: + by-release-type: + beta: staging-firefox-beta + release: staging-firefox-release + release-rc: staging-firefox-release + esr115: staging-firefox-esr115 + esr128: staging-firefox-esr128 + default: "" + default: "" + # used to map hg revisions to the git revisions that landoscript needs + hg-repo-url: + by-project: + mozilla-beta: https://hg.mozilla.org/releases/mozilla-beta + mozilla-release: https://hg.mozilla.org/releases/mozilla-release + mozilla-esr115: https://hg.mozilla.org/releases/mozilla-esr115 + mozilla-esr128: https://hg.mozilla.org/releases/mozilla-esr128 + try: https://hg.mozilla.org/try + default: "" tasks: firefox: diff -Nru firefox-esr-128.10.0esr/taskcluster/kinds/release-version-bump/kind.yml firefox-esr-128.10.1esr/taskcluster/kinds/release-version-bump/kind.yml --- firefox-esr-128.10.0esr/taskcluster/kinds/release-version-bump/kind.yml 2025-04-21 19:07:20.000000000 +0000 +++ firefox-esr-128.10.1esr/taskcluster/kinds/release-version-bump/kind.yml 2025-05-17 18:02:54.000000000 +0000 @@ -6,7 +6,7 @@ transforms: - gecko_taskgraph.transforms.release_deps:transforms - - gecko_taskgraph.transforms.release_version_bump:transforms + - gecko_taskgraph.transforms.resolve_landoscript_keyed_by:transforms - gecko_taskgraph.transforms.task:transforms kind-dependencies: @@ -18,12 +18,34 @@ description: Release Promotion version bump/tag run-on-projects: [] shipping-phase: ship - worker-type: tree + worker-type: lando worker: - implementation: treescript - dontbuild: true + implementation: landoscript tags: ['release'] - bump: true + lando-repo: + by-project: + mozilla-beta: firefox-beta + mozilla-release: firefox-release + mozilla-esr115: firefox-esr115 + mozilla-esr128: firefox-esr128 + try: + by-release-type: + beta: staging-firefox-beta + release: staging-firefox-release + release-rc: staging-firefox-release + esr115: staging-firefox-esr115 + esr128: staging-firefox-esr128 + default: "" + default: "" + # used to map hg revisions to the git revisions that landoscript needs + hg-repo-url: + by-project: + mozilla-beta: https://hg.mozilla.org/releases/mozilla-beta + mozilla-release: https://hg.mozilla.org/releases/mozilla-release + mozilla-esr115: https://hg.mozilla.org/releases/mozilla-esr115 + mozilla-esr128: https://hg.mozilla.org/releases/mozilla-esr128 + try: https://hg.mozilla.org/try + default: "" # We're bumping both desktop and mobile version regardless of which product is getting # released, to avoid confusion from them getting out of sync. bump-files: @@ -40,11 +62,6 @@ - "browser/config/version.txt" - "browser/config/version_display.txt" - "config/milestone.txt" - push: - by-project: - mozilla-(beta|release|esr.*): true - maple: true - default: false tasks: firefox: diff -Nru firefox-esr-128.10.0esr/testing/mozharness/scripts/release/update-verify-config-creator.py firefox-esr-128.10.1esr/testing/mozharness/scripts/release/update-verify-config-creator.py --- firefox-esr-128.10.0esr/testing/mozharness/scripts/release/update-verify-config-creator.py 2025-04-21 19:07:20.000000000 +0000 +++ firefox-esr-128.10.1esr/testing/mozharness/scripts/release/update-verify-config-creator.py 2025-05-17 18:02:54.000000000 +0000 @@ -475,7 +475,13 @@ path, ), ) - ret = self._retry_download(url, "WARNING") + ret = self._retry_download( + url, "WARNING", retry_config={"sleeptime": 5, "max_sleeptime": 5} + ) + if not ret: + git_url = f"https://raw.githubusercontent.com/mozilla-firefox/firefox/refs/tags/{rev}/{path}" + ret = self._retry_download(git_url, "WARNING") + return ret.read().strip().decode("utf-8") def gather_info(self):