diff --git a/setup/plugins_mirror.py b/setup/plugins_mirror.py index 20ffcc265f..1aa62c028d 100644 --- a/setup/plugins_mirror.py +++ b/setup/plugins_mirror.py @@ -229,7 +229,18 @@ def parse_metadata(raw, namelist, zf): raise ValueError('Could not find plugin class') -def get_plugin_info(raw): +def check_qt5_compatibility(zf, names): + uses_qt = False + for name in names: + if name.endswith('.py'): + raw = zf.read(name) + has_qt4 = b'PyQt4' in raw + uses_qt = uses_qt or has_qt4 + if uses_qt and has_qt4 and b'PyQt5' not in raw: + return False + return True + +def get_plugin_info(raw, check_for_qt5=False): metadata = None with zipfile.ZipFile(io.BytesIO(raw)) as zf: names = {x.decode('utf-8') if isinstance(x, bytes) else x : x for x in zf.namelist()} @@ -248,6 +259,8 @@ def get_plugin_info(raw): raw = zf.open(metadata).read() ans = parse_metadata(raw, names, zf) if isinstance(ans, dict): + if check_for_qt5: + ans['qt5'] = check_qt5_compatibility(zf, names) return ans # The plugin is importing its base class from somewhere else, le sigh for mod, _ in ans: @@ -259,6 +272,8 @@ def get_plugin_info(raw): raw = zf.open(names[mod]).read() ans = parse_metadata(raw, names, zf) if isinstance(ans, dict): + if check_for_qt5: + ans['qt5'] = check_qt5_compatibility(zf, names) return ans raise ValueError('Failed to find plugin class') @@ -498,6 +513,43 @@ def update_stats(): json.dump(stats, f, indent=2) return stats +def check_for_qt5_incompatibility(): + ok_plugins, bad_plugins = [], [] + for name in os.listdir('.'): + if name.endswith('.zip') and not name.endswith('-deprecated.zip'): + with open(name, 'rb') as f: + info = get_plugin_info(f.read(), check_for_qt5=True) + if info['qt5']: + ok_plugins.append(info) + else: + bad_plugins.append(info) + plugs = ['
Number of Qt 5 compatible plugins: %s
Number of Qt 5 incompatible plugins: %s
Percentage of plugins ported: %.0f%%