diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/license_changer.py | 85 | ||||
-rw-r--r-- | tools/license_check.py | 70 | ||||
-rw-r--r-- | tools/uic_test.py | 123 |
3 files changed, 278 insertions, 0 deletions
diff --git a/tools/license_changer.py b/tools/license_changer.py new file mode 100644 index 000000000..0c3443b83 --- /dev/null +++ b/tools/license_changer.py @@ -0,0 +1,85 @@ +############################################################################# +## +## Copyright (C) 2021 The Qt Company Ltd. +## Contact: https://www.qt.io/licensing/ +## +## This file is part of the Qt for Python project. +## +## $QT_BEGIN_LICENSE:COMM$ +## +## Commercial License Usage +## Licensees holding valid commercial Qt licenses may use this file in +## accordance with the commercial license agreement provided with the +## Software or, alternatively, in accordance with the terms contained in +## a written agreement between you and The Qt Company. For licensing terms +## and conditions see https://www.qt.io/terms-conditions. For further +## information use the contact form at https://www.qt.io/contact-us. +## +## $QT_END_LICENSE$ +## +############################################################################# + +from argparse import ArgumentParser, RawTextHelpFormatter +import os +from pathlib import Path +import subprocess +import sys + + +DESC = """ +Tool to adapt licenses to a commercial LTS branch +Requires the qtsdk/tqtc-qtsdk and qtqa repos to be checked out as siblings. +""" + + +REPO_DIR = Path(__file__).resolve().parents[1] + + +EXCLUSIONS = ['/build_scripts/', '/coin/', '/doc/', '/examples/', + '/testing/', '/tests/', + '/coin_build_instructions.py', '/coin_test_instructions.py', + '/ez_setup.py', '/setup.py', '/testrunner.py'] + + +if __name__ == '__main__': + argument_parser = ArgumentParser(description=DESC, + formatter_class=RawTextHelpFormatter) + argument_parser.add_argument('--dry-run', '-d', action='store_true', + help='Dry run, print commands') + options = argument_parser.parse_args() + dry_run = options.dry_run + + license_changer = (REPO_DIR.parent / 'tqtc-qtsdk' / 'packaging-tools' + / 'release_tools' / 'license_changer.pl') + print('Checking ', license_changer) + if not license_changer.is_file: + print('Not found, please clone the qtsdk/tqtc-qtsdk repo') + sys.exit(1) + template = (REPO_DIR.parent / 'qtqa' / 'tests' / 'prebuild' + / 'license' / 'templates' / 'header.COMM') + print('Checking ', template) + if not template.is_file(): + print('Not found, please clone the qtqa repo') + sys.exit(1) + + os.chdir(REPO_DIR) + fixed_cmd = [str(license_changer), '--path', str(REPO_DIR), + '--headerfile', str(template)] + for e in EXCLUSIONS: + fixed_cmd.append('--exclude') + fixed_cmd.append(e) + + for license in ['GPL-EXCEPT', 'GPL', 'LGPL']: + log = f'license_{license.lower()}_log.txt' + cmd = fixed_cmd + cmd.extend(['--replacehdr', license, '--errorlog', log]) + cmds = ' '.join(cmd) + print('Running: ', cmds) + if not dry_run: + ex = subprocess.call(cmd) + if ex != 0: + print('FAIL! ', cmds) + sys.exit(1) + + if not dry_run: + subprocess.call(['git', 'diff']) diff --git a/tools/license_check.py b/tools/license_check.py new file mode 100644 index 000000000..052c41ca5 --- /dev/null +++ b/tools/license_check.py @@ -0,0 +1,70 @@ +############################################################################# +## +## Copyright (C) 2021 The Qt Company Ltd. +## Contact: https://www.qt.io/licensing/ +## +## This file is part of the Qt for Python project. +## +## $QT_BEGIN_LICENSE:LGPL$ +## Commercial License Usage +## Licensees holding valid commercial Qt licenses may use this file in +## accordance with the commercial license agreement provided with the +## Software or, alternatively, in accordance with the terms contained in +## a written agreement between you and The Qt Company. For licensing terms +## and conditions see https://www.qt.io/terms-conditions. For further +## information use the contact form at https://www.qt.io/contact-us. +## +## GNU Lesser General Public License Usage +## Alternatively, this file may be used under the terms of the GNU Lesser +## General Public License version 3 as published by the Free Software +## Foundation and appearing in the file LICENSE.LGPL3 included in the +## packaging of this file. Please review the following information to +## ensure the GNU Lesser General Public License version 3 requirements +## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +## +## GNU General Public License Usage +## Alternatively, this file may be used under the terms of the GNU +## General Public License version 2.0 or (at your option) the GNU General +## Public license version 3 or any later version approved by the KDE Free +## Qt Foundation. The licenses are as published by the Free Software +## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +## included in the packaging of this file. Please review the following +## information to ensure the GNU General Public License requirements will +## be met: https://www.gnu.org/licenses/gpl-2.0.html and +## https://www.gnu.org/licenses/gpl-3.0.html. +## +## $QT_END_LICENSE$ +## +############################################################################# + +import os +from pathlib import Path +import subprocess +import sys + + +"""Tool to run a license check + +Requires the qtqa repo to be checked out as sibling. +""" + + +REPO_DIR = Path(__file__).resolve().parents[1] + + +if __name__ == '__main__': + license_check = (REPO_DIR.parent / 'qtqa' / 'tests' / 'prebuild' + / 'license' / 'tst_licenses.pl') + print('Checking ', license_check) + if not license_check.is_file(): + print('Not found, please clone the qtqa repo') + sys.exit(1) + + os.environ['QT_MODULE_TO_TEST'] = str(REPO_DIR) + cmd = [str(license_check), '-m', 'pyside-setup'] + cmds = ' '.join(cmd) + print('Running: ', cmds) + ex = subprocess.call(cmd) + if ex != 0: + print('FAIL! ', cmds) + sys.exit(1) diff --git a/tools/uic_test.py b/tools/uic_test.py new file mode 100644 index 000000000..6c1f2b888 --- /dev/null +++ b/tools/uic_test.py @@ -0,0 +1,123 @@ +############################################################################# +## +## Copyright (C) 2021 The Qt Company Ltd. +## Contact: https://www.qt.io/licensing/ +## +## This file is part of the Qt for Python project. +## +## $QT_BEGIN_LICENSE:LGPL$ +## Commercial License Usage +## Licensees holding valid commercial Qt licenses may use this file in +## accordance with the commercial license agreement provided with the +## Software or, alternatively, in accordance with the terms contained in +## a written agreement between you and The Qt Company. For licensing terms +## and conditions see https://www.qt.io/terms-conditions. For further +## information use the contact form at https://www.qt.io/contact-us. +## +## GNU Lesser General Public License Usage +## Alternatively, this file may be used under the terms of the GNU Lesser +## General Public License version 3 as published by the Free Software +## Foundation and appearing in the file LICENSE.LGPL3 included in the +## packaging of this file. Please review the following information to +## ensure the GNU Lesser General Public License version 3 requirements +## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +## +## GNU General Public License Usage +## Alternatively, this file may be used under the terms of the GNU +## General Public License version 2.0 or (at your option) the GNU General +## Public license version 3 or any later version approved by the KDE Free +## Qt Foundation. The licenses are as published by the Free Software +## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +## included in the packaging of this file. Please review the following +## information to ensure the GNU General Public License requirements will +## be met: https://www.gnu.org/licenses/gpl-2.0.html and +## https://www.gnu.org/licenses/gpl-3.0.html. +## +## $QT_END_LICENSE$ +## +############################################################################# + +import os +import re +import subprocess +import sys +import tempfile +from argparse import ArgumentParser, RawTextHelpFormatter +from pathlib import Path +from textwrap import dedent +from typing import Optional, Tuple + + +VERSION = 2 + + +DESC = """Runs uic on a set of UI files and displays the resulting widgets.""" + + +TEMP_DIR = Path(tempfile.gettempdir()) + + +def get_class_name(file: Path) -> Tuple[Optional[str], Optional[str]]: + """Return class name and widget name of UI file.""" + pattern = re.compile('^\s*<widget class="(\w+)" name="(\w+)"\s*>.*$') + for l in Path(file).read_text().splitlines(): + match = pattern.match(l) + if match: + return (match.group(1), match.group(2)) + return (None, None) + + +def test_file(file: str, uic: bool=False) -> bool: + """Run uic on a UI file and show the resulting UI.""" + path = Path(file) + (klass, name) = get_class_name(path) + if not klass: + print(f'{file} does not appear to be a UI file', file=sys.stderr) + return False + py_klass = f'Ui_{name}' + py_file_basename = py_klass.lower() + py_file = TEMP_DIR / (py_file_basename + '.py') + py_main = TEMP_DIR / 'main.py' + cmd = ['uic', '-g', 'python'] if uic else [f'pyside{VERSION}-uic'] + cmd.extend(['-o', os.fspath(py_file), file]) + try: + subprocess.call(cmd) + except FileNotFoundError as e: + print(str(e) + " (try -u for uic)", file=sys.stderr) + return False + main_source = dedent(f'''\ + import sys + from PySide{VERSION}.QtWidgets import QApplication, {klass} + from {py_file_basename} import {py_klass} + + if __name__ == "__main__": + app = QApplication(sys.argv) + ui = {py_klass}() + widget = {klass}() + ui.setupUi(widget) + widget.show() + sys.exit(app.exec_())''') + py_main.write_text(main_source) + exit_code = subprocess.call([sys.executable, os.fspath(py_main)]) + py_main.unlink() + py_file.unlink() + return exit_code == 0 + + +if __name__ == '__main__': + argument_parser = ArgumentParser(description=DESC, + formatter_class=RawTextHelpFormatter) + argument_parser.add_argument('--uic', '-u', action='store_true', + help='Use uic instead of pyside-uic') + argument_parser.add_argument("files", help="UI Files", + nargs='+', type=str) + options = argument_parser.parse_args() + failed = 0 + count = len(options.files) + for i, file in enumerate(options.files): + print(f'{i+1}/{count} {file}') + if not test_file(file, options.uic): + failed += 1 + if failed != 0: + print(f'{failed}/{count} failed.') + sys.exit(failed) |