From a15ce85d03ba9babc2cbe100204c12f08500134c Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Wed, 5 Aug 2015 17:24:03 +0100 Subject: [PATCH] yum: Add support for GetDetailsLocal Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1249998 --- backends/yum/pk-backend-yum.c | 15 +++++++++++++++ backends/yum/yumBackend.py | 29 +++++++++++++++++++++++++++-- client/pk-console.c | 10 ++++++++++ lib/python/packagekit/backend.py | 11 +++++++++++ 4 files changed, 63 insertions(+), 2 deletions(-) diff --git a/backends/yum/pk-backend-yum.c b/backends/yum/pk-backend-yum.c index 5e9da25..c4b714f 100644 --- a/backends/yum/pk-backend-yum.c +++ b/backends/yum/pk-backend-yum.c @@ -355,6 +355,7 @@ pk_backend_get_roles (PkBackend *backend) PK_ROLE_ENUM_CANCEL, PK_ROLE_ENUM_DEPENDS_ON, PK_ROLE_ENUM_GET_DETAILS, + PK_ROLE_ENUM_GET_DETAILS_LOCAL, PK_ROLE_ENUM_GET_FILES, PK_ROLE_ENUM_REQUIRED_BY, PK_ROLE_ENUM_GET_PACKAGES, @@ -450,6 +451,20 @@ pk_backend_get_details (PkBackend *backend, PkBackendJob *job, gchar **package_i } /** + * pk_backend_get_details_local: + */ +void +pk_backend_get_details_local (PkBackend *backend, PkBackendJob *job, gchar **filenames) +{ + _cleanup_free_ gchar *tmp = NULL; + tmp = pk_package_ids_to_string (filenames); + pk_backend_spawn_helper (priv->spawn, job, + "yumBackend.py", + "get-details-local", + tmp, NULL); +} + +/** * pk_backend_get_distro_upgrades: */ void diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py index f097034..a0b2132 100755 --- a/backends/yum/yumBackend.py +++ b/backends/yum/yumBackend.py @@ -2476,7 +2476,32 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage): self.message('COULD_NOT_FIND_PACKAGE', 'Package %s was not found' % _format_package_id(package_id)) continue - def _show_details_pkg(self, pkg): + def get_details_local(self, files): + ''' + Print a detailed details for a given file + ''' + try: + self._check_init(lazy_cache=True) + except PkError, e: + self.error(e.code, e.details, exit=False) + return + self.yumbase.conf.cache = 0 # Allow new files + self.allow_cancel(True) + self.percentage(None) + self.status(STATUS_INFO) + for f in files: + try: + pkg = YumLocalPackage(ts=self.yumbase.rpmdb.readOnlyTS(), filename=f) + except PkError, e: + if e.code == ERROR_PACKAGE_NOT_FOUND: + self.message('COULD_NOT_FIND_PACKAGE', e.details) + continue + self.error(e.code, e.details, exit=True) + return + if pkg: + self._show_details_pkg(pkg, False) + + def _show_details_pkg(self, pkg, verify_local=True): pkgver = _get_package_ver(pkg) package_id = self.get_package_id(pkg.name, pkgver, pkg.arch, pkg.repo) @@ -2494,7 +2519,7 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage): # if we are remote and in the cache, our size is zero size = pkg.size - if not pkg.repo.id.startswith('installed') and pkg.verifyLocalPkg(): + if verify_local and not pkg.repo.id.startswith('installed') and pkg.verifyLocalPkg(): size = 0 group = self.comps.get_group(pkg.name) diff --git a/client/pk-console.c b/client/pk-console.c index 203458e..52bbb65 100644 --- a/client/pk-console.c +++ b/client/pk-console.c @@ -1282,6 +1282,16 @@ pk_console_get_details (PkConsoleCtx *ctx, gchar **packages, GError **error) _cleanup_error_free_ GError *error_local = NULL; _cleanup_strv_free_ gchar **package_ids = NULL; + /* local file */ + if (g_file_test (packages[0], G_FILE_TEST_EXISTS)) { + pk_client_get_details_local_async (PK_CLIENT (ctx->task), + packages, + ctx->cancellable, + pk_console_progress_cb, ctx, + pk_console_finished_cb, ctx); + return TRUE; + } + package_ids = pk_console_resolve_packages (ctx, packages, &error_local); if (package_ids == NULL) { g_set_error (error, diff --git a/lib/python/packagekit/backend.py b/lib/python/packagekit/backend.py index 4b9eedc..9ff693d 100644 --- a/lib/python/packagekit/backend.py +++ b/lib/python/packagekit/backend.py @@ -467,6 +467,13 @@ class PackageKitBaseBackend: ''' self.error(ERROR_NOT_SUPPORTED, "This function is not implemented in this backend", exit=False) + def get_details_local(self, files): + ''' + Implement the {backend}-get-details-local functionality + Needed to be implemented in a sub class + ''' + self.error(ERROR_NOT_SUPPORTED, "This function is not implemented in this backend", exit=False) + def get_files(self, package_ids): ''' Implement the {backend}-get-files functionality @@ -581,6 +588,10 @@ class PackageKitBaseBackend: package_ids = args[0].split(PACKAGE_IDS_DELIM) self.get_details(package_ids) self.finished() + elif cmd == 'get-details-local': + files = args[0].split(PACKAGE_IDS_DELIM) + self.get_details_local(files) + self.finished() elif cmd == 'get-files': package_ids = args[0].split(PACKAGE_IDS_DELIM) self.get_files(package_ids) -- 2.4.3