diff options
Diffstat (limited to 'dependencies.py')
-rwxr-xr-x | dependencies.py | 92 |
1 files changed, 70 insertions, 22 deletions
diff --git a/dependencies.py b/dependencies.py index eff6729bf..9955a5df6 100755 --- a/dependencies.py +++ b/dependencies.py @@ -19,6 +19,8 @@ except ImportError: PARSER = ArgumentParser() PARSER.add_argument('src_dir', type=Path) PARSER.add_argument('plugins', nargs='*') +PARSER.add_argument('--features', action="store_true", help="Get list of features to activate") +PARSER.add_argument('--gst-version', help="Get list of features to activate") # Map plugin name to directory name, for those that does not match. @@ -38,27 +40,73 @@ RENAMES = { 'textwrap': 'wrap', } +class CargoAnalyzer: + def __init__(self): + self.src_dir = None + self.plugins = None + self.features = False + self.gst_version = "1.18" -if __name__ == "__main__": - opts = PARSER.parse_args() - - with (opts.src_dir / 'Cargo.toml').open('rb') as f: - crates = tomllib.load(f)['workspace']['members'] - deps = set() - for p in opts.plugins: - assert p.startswith('gst') - name = p[3:] - name = RENAMES.get(name, name) - crate_path = None - for crate in crates: - if Path(crate).name == name: - crate_path = opts.src_dir / crate / 'Cargo.toml' - assert crate_path - with crate_path.open('rb') as f: - data = tomllib.load(f) - try: - requires = data['package']['metadata']['capi']['pkg_config']['requires_private'] - except KeyError: + def extract_version(self, feature_name): + if feature_name.startswith('v'): + verindex = 1 + elif feature_name.startswith('gst'): + verindex = 3 + else: + return None + + (majver, minver) = feature_name[verindex:].split("_") + return (int(majver), int(minver)) + + def extract_features(self, cargo_data): + features = cargo_data['features'] + wanted_features = set() + gst_version_major = int(self.gst_version.split('.')[0]) + gst_version_minor = int(self.gst_version.split('.')[1]) + for (name, value) in features.items(): + version = self.extract_version(name) + + if version is None: + continue + (majver, minver) = version + + if gst_version_major < majver or gst_version_minor < minver: continue - deps.update([i.strip().replace('>', "|>").replace('<', "|<").replace("==", "|==") for i in requires.split(',')]) - print(','.join(deps)) + wanted_features |= set(value) + if name.startswith("gst"): + # Required for some reason for rswebrtc which has a specific feature + wanted_features |= {f"{cargo_data['package']['name']}/{name}"} + + return wanted_features + + def run(self): + with (opts.src_dir / 'Cargo.toml').open('rb') as f: + crates = tomllib.load(f)['workspace']['members'] + res = set() + for name in opts.plugins: + if name.startswith('gst'): + name = name[3:] + + name = RENAMES.get(name, name) + crate_path = None + for crate in crates: + if Path(crate).name == name: + crate_path = opts.src_dir / crate / 'Cargo.toml' + assert crate_path + with crate_path.open('rb') as f: + data = tomllib.load(f) + if opts.features: + res |= self.extract_features(data) + else: + try: + requires = data['package']['metadata']['capi']['pkg_config']['requires_private'] + except KeyError: + continue + res.update([i.strip().replace('>', "|>").replace('<', "|<").replace("==", "|==") for i in requires.split(',')]) + return res + +if __name__ == "__main__": + analyzer = CargoAnalyzer() + opts = PARSER.parse_args(namespace=analyzer) + + print(','.join(analyzer.run())) |