hghooks/mozhghooks/prevent_string_changes.py (39 lines of code) (raw):
#!/usr/bin/env python
# Copyright (C) 2014 Mozilla Foundation
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
"""
This hook is to prevent changes to strings in string frozen branches without
explicit approval from l10n-drivers. Can be bypassed adding l10n= followed by
an approver to the commit message (case sensitive), see bug 859358 for further
details.
"""
import re
def hook(ui, repo, hooktype, node, source=None, **kwargs):
if source in (b"pull", b"strip"):
return 0
error = b""
changed_strings = False
if b"a=release" in repo[b"tip"].description().lower():
# Accept the entire push for code uplifts
return 0
# Loop through each changeset being added to the repository
for change_id in range(repo[node].rev(), len(repo)):
# Loop through each file for the current changeset
for file in repo[change_id].files():
# Interested only in files potentially used for l10n
if re.search(b"locales/en-US/", file) and file.endswith(
(b".dtd", b".ftl", b".ini", b".properties")
):
changed_strings = True
if not (
re.search(b"l10n=", repo[change_id].description().lower())
or re.search(b"l10n=", repo[b"tip"].description().lower())
):
error += (
b"* File used for localization (%s) altered in this changeset *\n"
% file
)
# Check if an error occurred
if error != b"":
ui.write(b"\n************************** ERROR ****************************\n\n")
ui.write(error)
ui.write(
b"\nThis repository is string frozen. Please request explicit permission from\n"
)
ui.write(b"release managers to break string freeze in your bug.\n")
ui.write(b"If you have that explicit permission, denote that by including in\n")
ui.write(b"your commit message l10n=...\n")
ui.write(b"*************************************************************\n\n")
# Reject the changesets
return 1
else:
if changed_strings:
ui.write(
b"You've signaled approval for changes to strings in your push, thanks.\n"
)
# Accept the changesets
return 0