This is an automated email from the ASF dual-hosted git repository.
shahar pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 4579a382336 Implement default language (English) freeze pre-commit
(#55119)
4579a382336 is described below
commit 4579a382336cead8b74dc556ebd63ba0483e7bb9
Author: Shahar Epstein <[email protected]>
AuthorDate: Mon Sep 1 12:59:47 2025 +0300
Implement default language (English) freeze pre-commit (#55119)
* Implement default language (English) freeze pre-commit
* fix: fix missing import
* Add git diff
* Create freeze exemptions
* Change to AoE
---------
Co-authored-by: Wei Lee <[email protected]>
---
.pre-commit-config.yaml | 13 +++++
.../public/i18n/locales/en/_freeze_exemptions.json | 12 ++++
dev/i18n/check_translations_completeness.py | 7 ++-
scripts/ci/prek/check_default_language_freeze.py | 68 ++++++++++++++++++++++
4 files changed, 99 insertions(+), 1 deletion(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index cea777e49ed..a8dd47fd5ba 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1456,6 +1456,19 @@ repos:
files: ^airflow-core/src/airflow/ui/public/i18n/locales/.*\.json$
entry: ./scripts/ci/prek/check_i18n_json.py
pass_filenames: false
+ - id: check-en-language-freeze
+ name: Check for Default language (English) freeze
+ description: Prevent changes to English translation files during the
language freeze period (typically around release time; time is measured in UTC)
+ language: python
+ entry: ./scripts/ci/prek/check_default_language_freeze.py
+ args:
+ - --freeze-start-date
+ - "2025-09-01"
+ - --freeze-end-date
+ - "2025-09-09"
+ files: ^airflow-core/src/airflow/ui/public/i18n/locales/en/.*
+ exclude:
^airflow-core/src/airflow/ui/public/i18n/locales/en/_freeze_exemptions\.json.*
+ pass_filenames: true
- id: check-provider-yaml-valid
name: Validate provider.yaml files
entry: ./scripts/ci/prek/check_provider_yaml_files.py
diff --git
a/airflow-core/src/airflow/ui/public/i18n/locales/en/_freeze_exemptions.json
b/airflow-core/src/airflow/ui/public/i18n/locales/en/_freeze_exemptions.json
new file mode 100644
index 00000000000..43fcce7b080
--- /dev/null
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/en/_freeze_exemptions.json
@@ -0,0 +1,12 @@
+{
+ "admin": {},
+ "assets": {},
+ "browse": {},
+ "common": {},
+ "components": {},
+ "dag": {},
+ "dags": {},
+ "dashboard": {},
+ "hitl": {},
+ "tasks": {}
+}
diff --git a/dev/i18n/check_translations_completeness.py
b/dev/i18n/check_translations_completeness.py
index 1ca6907423f..1435a829bc1 100755
--- a/dev/i18n/check_translations_completeness.py
+++ b/dev/i18n/check_translations_completeness.py
@@ -124,7 +124,12 @@ def expand_plural_keys(keys: set[str], lang: str) ->
set[str]:
def get_locale_files() -> list[LocaleFiles]:
return [
LocaleFiles(
- locale=locale_dir.name, files=[f.name for f in
locale_dir.iterdir() if f.suffix == ".json"]
+ locale=locale_dir.name,
+ files=[
+ f.name
+ for f in locale_dir.iterdir()
+ if f.suffix == ".json" and f.name != "_freeze_exemptions.json"
+ ],
)
for locale_dir in LOCALES_DIR.iterdir()
if locale_dir.is_dir()
diff --git a/scripts/ci/prek/check_default_language_freeze.py
b/scripts/ci/prek/check_default_language_freeze.py
new file mode 100755
index 00000000000..10b4b4acd36
--- /dev/null
+++ b/scripts/ci/prek/check_default_language_freeze.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import argparse
+import sys
+from datetime import datetime, timedelta, timezone
+from subprocess import run
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(
+ description="Check for language freeze period and prevent changes to
specified files."
+ )
+ parser.add_argument("--freeze-start-date", required=True, help="Start date
of the freeze (YYYY-MM-DD)")
+ parser.add_argument("--freeze-end-date", required=True, help="End date of
the freeze (YYYY-MM-DD)")
+ parser.add_argument("files", nargs="*", help="Files to check.")
+ args = parser.parse_args()
+
+ freeze_start = None
+ freeze_end = None
+ try:
+ freeze_start = datetime.strptime(args.freeze_start_date,
"%Y-%m-%d").date()
+ freeze_end = datetime.strptime(args.freeze_end_date, "%Y-%m-%d").date()
+ except ValueError as e:
+ print(f"Error: Invalid date format in pre-commit config. {e}",
file=sys.stderr)
+ sys.exit(1)
+
+ today = datetime.now(timezone(timedelta(hours=-12))).date()
+
+ if freeze_start <= today <= freeze_end:
+ changed_files = [
+ f for f in args.files if run(["git", "diff", "--cached",
"--quiet", "--", f]).returncode != 0
+ ]
+ if changed_files:
+ print(
+ f"Error: English language freeze is active from
{args.freeze_start_date} to "
+ f"{args.freeze_end_date}.",
+ file=sys.stderr,
+ )
+ print(
+ "Changes to English translation files (except for
_freeze_exemptions.json) are not allowed during this period.",
+ file=sys.stderr,
+ )
+ print(
+ "You may instead add the changes to _freeze_exemptions.json,
and by the end of the freeze period, we will merge them back to the original
files.",
+ file=sys.stderr,
+ )
+ print("The following files have staged changes:", file=sys.stderr)
+ for file_path in changed_files:
+ print(f" - {file_path}", file=sys.stderr)
+ sys.exit(1)
+
+ sys.exit(0)