gboolean gs_plugin_refine (GsPlugin *plugin, GsAppList *list, GsPluginRefineFlags flags, GCancellable *cancellable, GError **error) { g_autoptr(GsApp) app = NULL; g_autoptr(GsAppList) os_updates = gs_app_list_new (); /* not from get_updates() */ if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS) == 0) return TRUE; /* do we have any packages left that are not apps? */ for (guint i = 0; i < gs_app_list_length (list); i++) { GsApp *app_tmp = gs_app_list_index (list, i); if (gs_app_has_quirk (app_tmp, GS_APP_QUIRK_IS_WILDCARD)) continue; if (gs_plugin_generic_updates_merge_os_update (app_tmp)) gs_app_list_add (os_updates, app_tmp); } if (gs_app_list_length (os_updates) == 0) return TRUE; /* create new meta object */ app = gs_plugin_generic_updates_get_os_update (plugin); for (guint i = 0; i < gs_app_list_length (os_updates); i++) { GsApp *app_tmp = gs_app_list_index (os_updates, i); gs_app_add_related (app, app_tmp); gs_app_list_remove (list, app_tmp); } gs_app_list_add (list, app); return TRUE; }
static gboolean gs_plugin_add_sources_related (GsPlugin *plugin, GHashTable *hash, GCancellable *cancellable, GError **error) { GsPluginData *priv = gs_plugin_get_data (plugin); guint i; GsApp *app; GsApp *app_tmp; PkBitfield filter; ProgressData data; const gchar *id; gboolean ret = TRUE; g_autoptr(GsAppList) installed = gs_app_list_new (); g_autoptr(PkResults) results = NULL; g_autoptr(AsProfileTask) ptask = NULL; data.app = NULL; data.plugin = plugin; data.ptask = NULL; ptask = as_profile_start_literal (gs_plugin_get_profile (plugin), "packagekit::add-sources-related"); g_assert (ptask != NULL); filter = pk_bitfield_from_enums (PK_FILTER_ENUM_INSTALLED, PK_FILTER_ENUM_NEWEST, PK_FILTER_ENUM_ARCH, PK_FILTER_ENUM_NOT_COLLECTIONS, -1); results = pk_client_get_packages (PK_CLIENT(priv->task), filter, cancellable, gs_plugin_packagekit_progress_cb, &data, error); if (!gs_plugin_packagekit_results_valid (results, error)) return FALSE; ret = gs_plugin_packagekit_add_results (plugin, installed, results, error); if (!ret) return FALSE; for (i = 0; i < gs_app_list_length (installed); i++) { g_auto(GStrv) split = NULL; app = gs_app_list_index (installed, i); split = pk_package_id_split (gs_app_get_source_id_default (app)); if (g_str_has_prefix (split[PK_PACKAGE_ID_DATA], "installed:")) { id = split[PK_PACKAGE_ID_DATA] + 10; app_tmp = g_hash_table_lookup (hash, id); if (app_tmp != NULL) { g_debug ("found package %s from %s", gs_app_get_source_default (app), id); gs_app_add_related (app_tmp, app); } } } return TRUE; }
gboolean gs_plugin_refine (GsPlugin *plugin, GsAppList *list, GsPluginRefineFlags flags, GCancellable *cancellable, GError **error) { g_autoptr(GsApp) app = NULL; g_autoptr(GsAppList) os_updates = gs_app_list_new (); /* not from get_updates() */ if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS) == 0) return TRUE; /* do we have any packages left that are not apps? */ for (guint i = 0; i < gs_app_list_length (list); i++) { GsApp *app_tmp = gs_app_list_index (list, i); if (gs_plugin_generic_updates_merge_os_update (app_tmp)) gs_app_list_add (os_updates, app_tmp); } if (gs_app_list_length (os_updates) == 0) return TRUE; /* create new meta object */ app = gs_plugin_generic_updates_get_os_update (plugin); for (guint i = 0; i < gs_app_list_length (os_updates); i++) { GsApp *app_tmp = gs_app_list_index (os_updates, i); const gchar *id = gs_app_get_unique_id (app_tmp); if (id == NULL) id = gs_app_get_source_default (app_tmp); g_debug ("moving %s to parent %s", id, gs_app_get_unique_id (app)); gs_app_add_related (app, app_tmp); gs_app_list_remove (list, app_tmp); } gs_app_list_add (list, app); return TRUE; }
static void gs_cmd_show_results_apps (GsAppList *list) { GPtrArray *related; GsApp *app; GsApp *app_rel; guint i; guint j; for (j = 0; j < gs_app_list_length (list); j++) { g_autofree gchar *tmp = NULL; app = gs_app_list_index (list, j); tmp = gs_app_to_string (app); g_print ("%s\n", tmp); related = gs_app_get_related (app); for (i = 0; i < related->len; i++) { g_autofree gchar *tmp_rel = NULL; app_rel = GS_APP (g_ptr_array_index (related, i)); tmp_rel = gs_app_to_string (app_rel); g_print ("\t%s\n", tmp_rel); } } }