itImplement dependency alternatives parsing. - amprolla - devuan's apt repo merger Err parazyd.org 70 hgit clone git://parazyd.org/amprolla.git URL:git://parazyd.org/amprolla.git parazyd.org 70 1Log /git/amprolla/log.gph parazyd.org 70 1Files /git/amprolla/files.gph parazyd.org 70 1Refs /git/amprolla/refs.gph parazyd.org 70 1README /git/amprolla/file/README.md.gph parazyd.org 70 1LICENSE /git/amprolla/file/LICENSE.gph parazyd.org 70 i--- Err parazyd.org 70 1commit 4268288f669be5e023be2a53477caa81a95d4244 /git/amprolla/commit/4268288f669be5e023be2a53477caa81a95d4244.gph parazyd.org 70 1parent 6b27485f8e6a1ef3bc904db5ea47e01a4051ffa6 /git/amprolla/commit/6b27485f8e6a1ef3bc904db5ea47e01a4051ffa6.gph parazyd.org 70 hAuthor: KatolaZ URL:mailto:katolaz@freaknet.org parazyd.org 70 iDate: Sun, 24 Jun 2018 12:39:20 +0200 Err parazyd.org 70 i Err parazyd.org 70 iImplement dependency alternatives parsing. Err parazyd.org 70 i Err parazyd.org 70 iThis commit adds support for parsing dependencies which contain Err parazyd.org 70 ialternatives, e.g. "foo | bar". Err parazyd.org 70 i Err parazyd.org 70 iCurrently it is utilized for banning packages. Err parazyd.org 70 i Err parazyd.org 70 iDiffstat: Err parazyd.org 70 i M LICENSE | 2 +- Err parazyd.org 70 i M lib/package.py | 39 +++++++++++++++++++++++++------ Err parazyd.org 70 i M lib/parse.py | 41 +++++++++++++++++-------------- Err parazyd.org 70 i Err parazyd.org 70 i3 files changed, 56 insertions(+), 26 deletions(-) Err parazyd.org 70 i--- Err parazyd.org 70 1diff --git a/LICENSE b/LICENSE /git/amprolla/file/LICENSE.gph parazyd.org 70 it@@ -1,6 +1,6 @@ Err parazyd.org 70 i Copyright (c) 2017 Merlijn Wajer Err parazyd.org 70 i Copyright (c) 2017 Evilham Err parazyd.org 70 i-Copyright (c) 2017 KatolaZ Err parazyd.org 70 i+Copyright (c) 2017-2018 KatolaZ Err parazyd.org 70 i Copyright (c) 2017-2018 Ivan J. Err parazyd.org 70 i Err parazyd.org 70 i GNU AFFERO GENERAL PUBLIC LICENSE Err parazyd.org 70 1diff --git a/lib/package.py b/lib/package.py /git/amprolla/file/lib/package.py.gph parazyd.org 70 it@@ -75,6 +75,33 @@ def load_packages_file(filename): Err parazyd.org 70 i return None Err parazyd.org 70 i Err parazyd.org 70 i Err parazyd.org 70 i+def depends_on_all_banned(deps, banned_pkgs): Err parazyd.org 70 i+ """ Err parazyd.org 70 i+ Gets a list of dicts of dep alternatives and a set of banned packages and Err parazyd.org 70 i+ returns True if any of the dicts consist exclusively of banned_pkgs. Err parazyd.org 70 i+ """ Err parazyd.org 70 i+ for dep in deps: Err parazyd.org 70 i+ alt = set(dep.keys()) Err parazyd.org 70 i+ if len(alt.intersection(banned_pkgs)) == len(alt): Err parazyd.org 70 i+ # All the alternatives are banned Err parazyd.org 70 i+ return True Err parazyd.org 70 i+ return False Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+def depends_on(deps, package_set): Err parazyd.org 70 i+ """ Err parazyd.org 70 i+ Gets a list of dicts of dep alternatives and a set of packages and returns Err parazyd.org 70 i+ True if any of the dicts include at least one of the elements in Err parazyd.org 70 i+ package_set. Err parazyd.org 70 i+ """ Err parazyd.org 70 i+ for dep in deps: Err parazyd.org 70 i+ alt = set(dep.keys()) Err parazyd.org 70 i+ if alt.intersection(package_set): Err parazyd.org 70 i+ # At least one alternative is in package_set Err parazyd.org 70 i+ return True Err parazyd.org 70 i+ return False Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i def package_banned(pkg, banned_pkgs): Err parazyd.org 70 i """ Err parazyd.org 70 i Returns True is the package contains a banned dependency. Err parazyd.org 70 it@@ -89,19 +116,17 @@ def package_banned(pkg, banned_pkgs): Err parazyd.org 70 i depends = parse_dependencies(pkg.get('Depends', '')) Err parazyd.org 70 i pre_depends = parse_dependencies(pkg.get('Pre-Depends', '')) Err parazyd.org 70 i Err parazyd.org 70 i- depends = [v for v in depends] Err parazyd.org 70 i- pre_depends = [v for v in pre_depends] Err parazyd.org 70 i- Err parazyd.org 70 i- deps = set(depends).union(set(pre_depends)) Err parazyd.org 70 i+ depends.extend(pre_depends) Err parazyd.org 70 i Err parazyd.org 70 i- if 'libsystemd0' in deps: Err parazyd.org 70 i+ if depends_on(depends, set(['libsystemd0'])): Err parazyd.org 70 i logtofile('libsystemd.txt', '%s,%s\n' % (globalvars.suite, Err parazyd.org 70 i pkg.get('Package'))) Err parazyd.org 70 i Err parazyd.org 70 i- if bool(deps.intersection(banned_pkgs)): Err parazyd.org 70 i+ isbanned = depends_on_all_banned(depends, banned_pkgs) Err parazyd.org 70 i+ if isbanned: Err parazyd.org 70 i logtofile('bannedpackages.txt', '%s,%s\n' % (globalvars.suite, Err parazyd.org 70 i pkg.get('Package'))) Err parazyd.org 70 i- return bool(deps.intersection(banned_pkgs)) Err parazyd.org 70 i+ return isbanned Err parazyd.org 70 i Err parazyd.org 70 i Err parazyd.org 70 i def package_newer(pkg1, pkg2): Err parazyd.org 70 1diff --git a/lib/parse.py b/lib/parse.py /git/amprolla/file/lib/parse.py.gph parazyd.org 70 it@@ -127,28 +127,33 @@ def parse_dependencies(dependencies): Err parazyd.org 70 i Err parazyd.org 70 i Example line:: Err parazyd.org 70 i Err parazyd.org 70 i- 'lib6 (>= 2.4), libdbus-1-3 (>= 1.0.2), foo' Err parazyd.org 70 i+ 'lib6 (>= 2.4), libdbus-1-3 (>= 1.0.2), foo | bar (>= 4.5.6)' Err parazyd.org 70 i Err parazyd.org 70 i Output:: Err parazyd.org 70 i Err parazyd.org 70 i- {'lib6': '(>= 2.4)', 'libdbus-1-3': '(>= 1.0.2)', 'foo': None} Err parazyd.org 70 i- """ Err parazyd.org 70 i- ret = {} Err parazyd.org 70 i- Err parazyd.org 70 i- for pkg_plus_version in dependencies.split(', '): Err parazyd.org 70 i- ver = pkg_plus_version.split(' ', 1) Err parazyd.org 70 i- name = ver[0] Err parazyd.org 70 i- Err parazyd.org 70 i- # If we get passed an empty string, the name is '', and we just Err parazyd.org 70 i- # outright stop Err parazyd.org 70 i- if not name: Err parazyd.org 70 i- return {} Err parazyd.org 70 i+ A list of dep alternatives, whose elements are dicts, in the form: Err parazyd.org 70 i Err parazyd.org 70 i- if len(ver) == 2: Err parazyd.org 70 i- version = ver[1] Err parazyd.org 70 i- ret[name] = version Err parazyd.org 70 i- else: Err parazyd.org 70 i- ret[name] = None Err parazyd.org 70 i+ [{'lib6': '(>= 2.4)'}, {'libdbus-1-3': '(>= 1.0.2)'}, Err parazyd.org 70 i+ {'foo': None, 'bar': '(>= 4.5.6)'}] Err parazyd.org 70 i+ """ Err parazyd.org 70 i+ ret = [] Err parazyd.org 70 i+ Err parazyd.org 70 i+ for alternatives in dependencies.split(', '): Err parazyd.org 70 i+ depset = {} Err parazyd.org 70 i+ for pkg_plus_version in alternatives.split('|'): Err parazyd.org 70 i+ ver = pkg_plus_version.strip(' ').split(' ', 1) Err parazyd.org 70 i+ name = ver[0] Err parazyd.org 70 i+ Err parazyd.org 70 i+ # If we get passed an empty string, the name is '', and we just Err parazyd.org 70 i+ # outright stop. Err parazyd.org 70 i+ if not name: Err parazyd.org 70 i+ return [] Err parazyd.org 70 i+ if len(ver) == 2: Err parazyd.org 70 i+ version = ver[1] Err parazyd.org 70 i+ depset[name] = version Err parazyd.org 70 i+ else: Err parazyd.org 70 i+ depset[name] = None Err parazyd.org 70 i+ ret.append(depset) Err parazyd.org 70 i Err parazyd.org 70 i return ret Err parazyd.org 70 i Err parazyd.org 70 .