introduce sanitize-annotations.py
authorAndrea Righi <andrea.righi@canonical.com>
Wed, 24 May 2023 15:02:16 +0000 (17:02 +0200)
committerAndrea Righi <andrea.righi@canonical.com>
Wed, 24 May 2023 15:02:16 +0000 (17:02 +0200)
Add a script to (try to) automatically sanitize old annotations files by
dropping all the deprecated flags, arbitrary enforcements rules, etc.

Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
sanitize-annotations.py [new file with mode: 0755]

diff --git a/sanitize-annotations.py b/sanitize-annotations.py
new file mode 100755 (executable)
index 0000000..1697126
--- /dev/null
@@ -0,0 +1,42 @@
+#!/usr/bin/env python3
+#
+# Try to automatically sanitize an old "annotations" file, dropping all the
+# deprecated flags, arbitrary enforcements rules, etc.
+#
+# Usage:
+#  $ ./sanitize-annotations debian.master/config/annotations
+
+import sys
+import re
+
+def remove_flags_and_drop_lines(file_path):
+    # Read the contents of the file
+    with open(file_path, 'r') as file:
+        content = file.read()
+
+    # Check if the file has the required headers
+    lines = content.splitlines()
+    if len(lines) < 2 or lines[0].strip() != '# Menu: HEADER' or lines[1].strip() != '# FORMAT: 4':
+        print(f"ERROR: {file_path} doesn't have a valid header")
+        print("Fix the headers as explained here: https://docs.google.com/document/d/1NnGC2aknyy2TJWMsoYzhrZMr9rYMA09JQBEvC-LW_Lw/edit#heading=h.ug9cinnvjg89")
+        sys.exit(1)
+
+    # Remove unsupported annotations
+    updated_content = re.sub(r'(flag|mark)<.*?>', '', content)
+
+    # Drop lines with a single word and trailing spaces
+    updated_content = re.sub(r'^\w+\s*$', '', updated_content, flags=re.MULTILINE)
+
+    # Add a space after all caps followed by 'policy'
+    updated_content = re.sub(r'([A-Z]+)(policy)', r'\1 \2', updated_content)
+
+    # Add 'note' if missing
+    updated_content = re.sub(r'(\s+)(<.*?>)', r'\1note\2', updated_content)
+
+    # Write the updated contents back to the file
+    with open(file_path, 'w') as file:
+        file.write(updated_content)
+
+if __name__ == '__main__':
+    file_path = sys.argv[1]
+    remove_flags_and_drop_lines(file_path)