1
0
mirror of https://github.com/google/comprehensive-rust.git synced 2024-12-16 14:53:28 +02:00
comprehensive-rust/.github/workflows/check-msgid-changes.py
Martin Geisler a2bb4dab11
Rename action to check msgid changes (#1365)
The focus of the action is to check and validate changes to the `msgid`
fields, not to totally prevent such changes.

This also makes the `paths` a little more precise: we only care about
changes to `po/*.po`.
2023-10-22 16:37:34 +02:00

90 lines
3.2 KiB
Python

# Copyright 2023 Google LLC
#
# Licensed 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.
"""Find changed msgid fields without a change in POT-Creation-Date.
When following the instructions in
https://github.com/google/comprehensive-rust/blob/main/TRANSLATIONS.md,
one of two things should happen:
- The `msgid` fields change because `msgmerge --update` was used. This
will also update the POT-Creation-Date field since a new timestamp
is merged in from the messages.pot file.
- Translations are added or updated. This should not change the
`msgid` fields: only the `msgstr` fields should change. If the PO
editor being used inadvertently changes the wrapping of both `msgid`
and `msgstr` fields, then `dprint fmt` can be used to normalize them
all.
The code here detects if both of these happen at the same time: if one
or more `msgid` fields changed without a corresponding change to the
POT-Creation-Date field. If this happens, the translator should fix it
by running:
dprint fmt
Commit and push to the branch again.
"""
import os
# TODO: move the `git reset` from the action code to here. Infact, we
# should be able to determine this with read-only operations.
# TODO: use Git plumbing commands instead of porcelain, see
# https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git.html.
for filename in os.popen("git diff --name-only").read().split():
if not filename.endswith(".po"):
continue
# If POT-Creation-Date has changed, then we assume that the commit
# is the result of `msgmerge --update`. It is expected that the
# `msgid` fields change when `msgmerge` is run, so there is
# nothing to check.
if "POT-Creation-Date" in os.popen(
f"git diff --unified=0 {filename}").read():
print(
f"Assuming {filename} was changed automatically, skipping msgid check"
)
continue
changed_lines = {
i + 1
for i, line in enumerate(
os.popen(f"git blame {filename}").readlines())
if line.startswith("00000000")
}
# Look for a changed line between `msgid` and `msgstr`.
saw_msgid = False
with open(filename, "r") as f:
line = f.readline()
line_number = 1
while line:
if line.startswith("msgid"):
saw_msgid = True
elif line.startswith("msgstr"):
saw_msgid = False
if saw_msgid and line_number in changed_lines:
print(f"Changed msgid in file {filename}:{line_number}!")
print(
"Please read https://github.com/google/comprehensive-rust/blob/main/TRANSLATIONS.md#creating-and-updating-translations."
)
exit(1)
line_number += 1
line = f.readline()