From 01c36742dd6c12893478d072090a122358405f2d Mon Sep 17 00:00:00 2001 From: Stanislav Shamilov Date: Tue, 3 Dec 2024 22:21:30 +0200 Subject: [PATCH] adds output for installing and removing packages --- plugins/module_utils/sdkmanager.py | 27 ++++++++++++++++++---- plugins/modules/android_sdk.py | 36 +++++++++++++----------------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/plugins/module_utils/sdkmanager.py b/plugins/module_utils/sdkmanager.py index 4cc7492437..50bf22e234 100644 --- a/plugins/module_utils/sdkmanager.py +++ b/plugins/module_utils/sdkmanager.py @@ -32,6 +32,14 @@ class Package: def __str__(self): return "%s;%s (%s)" % (self.name, self.version, self.description) + def __hash__(self): + return hash((self.name, self.version)) + + def __ne__(self, other): + if not isinstance(other, Package): + return True + return self.name != other.name or self.version != other + def __eq__(self, other): if not isinstance(other, Package): return False @@ -51,6 +59,13 @@ class AndroidSdkManager(object): re.compile(r'^\s+(?P\S+)\s+\|\s+(?P\S+)\s+\|\s(?P.+)\s\|\s+(\S+)$') ) + @staticmethod + def package_split(package): + parts = package.split(';', maxsplit=1) + if len(parts) > 1: + return parts + return parts[0], None + def __init__(self, runner): self.runner = runner @@ -58,7 +73,7 @@ class AndroidSdkManager(object): with self.runner('installed') as ctx: rc, stdout, stderr = ctx.run() - packages = [] + packages = set() data = stdout.split('\n') lines_count = len(data) @@ -72,8 +87,9 @@ class AndroidSdkManager(object): else: p = self._RE_INSTALLED_PACKAGES.search(line) if p: - package = Package(p.group('name'), p.group('version'), p.group('description')) - packages.append(package) + name = AndroidSdkManager.package_split(p.group('name'))[0] + package = Package(name, p.group('version'), p.group('description')) + packages.add(package) i += 1 return packages @@ -86,6 +102,9 @@ class AndroidSdkManager(object): def apply_packages_changes(self, packages, state): if len(packages) == 0: return - command_arg = ''.join(x.get_formatted() for x in packages) + command_arg = [x.get_formatted() for x in packages] + # ValueError: ['build-tools;34.0.0', 'build-tools;35.0.0'] + # raise ValueError(command_arg) with self.runner('state name') as ctx: ctx.run(name=command_arg, state=state) + diff --git a/plugins/modules/android_sdk.py b/plugins/modules/android_sdk.py index 08e75f6a88..9c136e929f 100644 --- a/plugins/modules/android_sdk.py +++ b/plugins/modules/android_sdk.py @@ -12,10 +12,10 @@ class AndroidSdk(StateModuleHelper): ) ) use_old_vardict = False - output_params = ('installed') + output_params = ('installed', 'removed') @staticmethod - def package_split(package): + def arg_package_split(package): parts = package.split('=', maxsplit=1) if len(parts) > 1: return parts @@ -26,43 +26,39 @@ class AndroidSdk(StateModuleHelper): def _parse_packages(self): arg_pkgs = self.vars.package - packages = [] + packages = set() for arg_pkg in arg_pkgs: - pkg, version = AndroidSdk.package_split(arg_pkg) + pkg, version = AndroidSdk.arg_package_split(arg_pkg) package = Package(pkg, version) - packages.append(package) + packages.add(package) + + if len(packages) < len(arg_pkgs): + self.do_raise("Packages may not repeat") return packages def state_present(self): packages = self._parse_packages() installed = self.sdkmanager.get_installed_packages() - pending_installation = [] - for package in packages: - for existing in installed: - if existing.name == package.name: - if existing.version == package.version: - pass # do nothing, package exists - # else: - # package exists, but needs to be updated/downgraded - else: - pending_installation.append(package) + pending_installation = packages.difference(installed) self.sdkmanager.install_packages(pending_installation) + self.vars.installed = AndroidSdk._packages_to_str(pending_installation) def state_absent(self): packages = self._parse_packages() installed = self.sdkmanager.get_installed_packages() - to_be_deleted = [] - for package in packages: - for existing in installed: - if existing == package: - to_be_deleted.append(package) + to_be_deleted = packages.intersection(installed) self.sdkmanager.uninstall_packages(to_be_deleted) + self.vars.removed = AndroidSdk._packages_to_str(to_be_deleted) def update_packages(self): pass # with self.sdkmanager('update') as ctx: # ctx.run() + @staticmethod + def _packages_to_str(packages): + return [{'name': x.name, 'version': x.version} for x in packages] + def __run__(self): super().__run__()