Files
odfstudio/bin/check-sid-slots.py
T
Julien Nabet f7b81f9789 Add check-sid-slots.py
the main idea is from an Hossein's script in https://gerrit.libreoffice.org/c/core/+/207697
then I tried to improve it a bit with Chatgpt GPT-5.5

The goal is to detect duplicated slots.

Change-Id: I918b475d8987fd191f972769bcc14e58b0ce2521
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/207734
Tested-by: Julien Nabet <serval2412@yahoo.fr>
Reviewed-by: Julien Nabet <serval2412@yahoo.fr>
2026-07-08 11:00:37 +02:00

94 lines
2.3 KiB
Python
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
#
# This file is part of the LibreOffice project.
#
# 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/.
#
# the main idea is from an Hossein's script in https://gerrit.libreoffice.org/c/core/+/207697
# then I tried to improve it a bit with Chatgpt GPT-5.5
# Example to call the script
# ./bin/check-sid-slots.py SID_SVX_START
# Here's the initial Hossein's command:
r'''
git grep -h "SID_SFX_START[ ]*+" "*.hrc" | grep -Ev '^\s*//' \
| awk -F\( {'print $2'} | awk -F\) {'print $1'} \
| awk '{gsub(/^ +| +$/,"")}1' | sort | uniq -c | grep " 2"
'''
import collections
import re
import subprocess
import sys
def check_sid(sid_type):
try:
result = subprocess.run(
["git", "grep", "-h", f"{sid_type}", "*.hrc"],
check=True,
capture_output=True,
text=True,
)
except subprocess.CalledProcessError as e:
print(e.stderr, file=sys.stderr)
return 1
slots = collections.defaultdict(list)
for line in result.stdout.splitlines():
# Remove C++ comments
code = line.split("//", 1)[0].strip()
if not code:
continue
# Ignore comments of this type:
# # SID_SVX_START + 123
# but keep real #define
if re.match(r"^#\s+", code):
continue
# Boundaries are not slots which are used
if "FIRSTFREE" in code:
continue
# Only keep :
# SID_SVX_START + 123
# but not :
# SID_SVX_START + 123 + 1
match = re.search(
re.escape(sid_type) + r"\s*\+\s*(\d+)(?!\s*\+)",
code,
)
if match:
slot = int(match.group(1))
slots[slot].append(code)
found = False
for slot, lines in sorted(slots.items()):
if len(lines) > 1:
found = True
print(f"Duplicate {sid_type} + {slot}:")
for line in lines:
print(f" {line}")
print()
return 1 if found else 0
def main():
for sid_type in sys.argv[1:]:
check_sid(sid_type)
if __name__ == "__main__":
sys.exit(main())
# vim: set shiftwidth=4 softtabstop=4 expandtab: