summaryrefslogtreecommitdiff
path: root/scripts/qrc_lint.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/qrc_lint.py')
-rwxr-xr-xscripts/qrc_lint.py97
1 files changed, 97 insertions, 0 deletions
diff --git a/scripts/qrc_lint.py b/scripts/qrc_lint.py
new file mode 100755
index 00000000..9520f22a
--- /dev/null
+++ b/scripts/qrc_lint.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python3
+# ============================================================
+# The rekonq project
+# ============================================================
+# SPDX-License-Identifier: GPL-3.0-only
+# Copyright (C) 2022 aqua <aqua@iserlohn-fortress.net>
+# ============================================================
+""" Lint qrc files """
+
+import argparse
+import sys
+from os.path import (dirname, exists, join)
+from lxml import etree
+
+
+def lint(dir_name: str, tree: etree._ElementTree) -> bool:
+ """ Lint an etree and return if errors were found """
+ has_check_errors = False
+ root = tree.getroot()
+
+ # check doctype
+ if tree.docinfo.doctype != '<!DOCTYPE RCC>':
+ print(f'unknown doctype { tree.docinfo.doctype }')
+ has_check_errors = True
+
+ qresources = root.findall('qresource')
+ # check if qresource's have prefix
+ for qres in qresources:
+ if qres.get('prefix') is None:
+ print('qresource without prefix')
+ has_check_errors = True
+
+ # check if qresource's are sorted by prefix
+ sortedqres = sorted(qresources, key=lambda x: x.get('prefix'))
+ if qresources != sortedqres:
+ print('qresources are not sorted')
+ has_check_errors = True
+
+ for qres in sortedqres:
+ files = qres.findall('file')
+
+ # check if files are sorted
+ if files != sorted(files, key=lambda x: x.get('alias')):
+ print(f'qresources prefix={ qres.get("prefix") }:\tfiles are not sorted')
+ has_check_errors = True
+
+ # check for missing files and missing alias
+ for file in files:
+ if file.get('alias') is None:
+ print(f'file path={ file.text }:\tmissing file alias')
+ has_check_errors = True
+ path = join(dir_name, file.text)
+ if not exists(path):
+ print(f'file path={ path }:\tfile does not exist')
+ has_check_errors = True
+
+ return has_check_errors
+
+
+def regen(root: etree.Element, outfile: str):
+ """ Regenerate an etree """
+ out_root = etree.Element('RCC', {'version': '1.0'})
+ for qresource in sorted(root.findall('qresource'), key=lambda x: x.get('prefix')):
+ out_qres = etree.SubElement(out_root, 'qresource', {'prefix': qresource.get('prefix')})
+
+ for file in sorted(qresource.findall('file'), key=lambda x: x.get('alias')):
+ out_file = etree.SubElement(out_qres, 'file', {'alias': file.get('alias')})
+ out_file.text = file.text
+
+ with etree.xmlfile(outfile, encoding='utf-8', close=True) as xml_file:
+ xml_file.write_declaration(standalone=True)
+ xml_file.write_doctype('<!DOCTYPE RCC>')
+ xml_file.write(out_root, pretty_print=True)
+
+
+def main():
+ """ Main function """
+ parser = argparse.ArgumentParser(description='Lint qrc file')
+ parser.add_argument('file', type=str, help='qrc file')
+ parser.add_argument('--regen', action='store_true', help='Regenerate qrc file')
+ args = parser.parse_args()
+
+ if not exists(args.file):
+ sys.exit('input file "{args.file}" doesn\'t exist')
+ else:
+ print(args.file)
+
+ tree = etree.parse(args.file)
+
+ if args.regen:
+ regen(tree.getroot(), args.file)
+ elif lint(dirname(args.file), tree):
+ sys.exit('Errors during lint')
+
+
+if __name__ == '__main__':
+ main()