[gnome-software/wip/hughsie/flatpak-origin-state: 3/4] flatpak: Ensure we match the remote origin when refining state



commit b74fc23ccccaf5835aa3c5206ecd4a3033ba5ba1
Author: Richard Hughes <richard hughsie com>
Date:   Thu Feb 28 16:18:28 2019 +0000

    flatpak: Ensure we match the remote origin when refining state
    
    This means we can refine the same application ID from multiple flatpak
    remotes (e.g. Flathub, Fedora) without showing them both with the same state.

 plugins/flatpak/gs-flatpak.c | 35 +++++++++++++++++++++++------------
 1 file changed, 23 insertions(+), 12 deletions(-)
---
diff --git a/plugins/flatpak/gs-flatpak.c b/plugins/flatpak/gs-flatpak.c
index 6cad012e..47856988 100644
--- a/plugins/flatpak/gs-flatpak.c
+++ b/plugins/flatpak/gs-flatpak.c
@@ -1661,6 +1661,7 @@ gs_flatpak_refine_app_state (GsFlatpak *self,
 {
        g_autoptr(FlatpakInstalledRef) ref = NULL;
        g_autoptr(GError) error_local = NULL;
+       g_autoptr(GPtrArray) refs = NULL;
 
        /* ensure valid */
        if (!gs_flatpak_rescan_appstream_store (self, cancellable, error))
@@ -1674,24 +1675,34 @@ gs_flatpak_refine_app_state (GsFlatpak *self,
        if (!gs_refine_item_metadata (self, app, cancellable, error))
                return FALSE;
 
-       /* get apps and runtimes */
-       ref = flatpak_installation_get_installed_ref (self->installation,
-                                                     gs_flatpak_app_get_ref_kind (app),
-                                                     gs_flatpak_app_get_ref_name (app),
-                                                     gs_flatpak_app_get_ref_arch (app),
-                                                     gs_flatpak_app_get_ref_branch (app),
-                                                     cancellable,
-                                                     &error_local);
+       /* find the app using the origin and the ID */
+       refs = flatpak_installation_list_installed_refs (self->installation,
+                                                        cancellable, error);
+       if (refs == NULL) {
+               gs_flatpak_error_convert (error);
+               return FALSE;
+       }
+       for (guint i = 0; i < refs->len; i++) {
+               FlatpakInstalledRef *ref_tmp = g_ptr_array_index (refs, i);
+               const gchar *origin = flatpak_installed_ref_get_origin (ref_tmp);
+               const gchar *name = flatpak_ref_get_name (FLATPAK_REF (ref_tmp));
+               const gchar *arch = flatpak_ref_get_arch (FLATPAK_REF (ref_tmp));
+               const gchar *branch = flatpak_ref_get_branch (FLATPAK_REF (ref_tmp));
+               if (g_strcmp0 (origin, gs_app_get_origin (app)) == 0 &&
+                   g_strcmp0 (name, gs_flatpak_app_get_ref_name (app)) == 0 &&
+                   g_strcmp0 (arch, gs_flatpak_app_get_ref_arch (app)) == 0 &&
+                   g_strcmp0 (branch, gs_flatpak_app_get_ref_branch (app)) == 0) {
+                       ref = g_object_ref (ref_tmp);
+                       break;
+               }
+       }
        if (ref != NULL) {
                g_debug ("marking %s as installed with flatpak",
                         gs_app_get_id (app));
                gs_flatpak_set_metadata_installed (self, app, ref);
                if (gs_app_get_state (app) == AS_APP_STATE_UNKNOWN)
                        gs_app_set_state (app, AS_APP_STATE_INSTALLED);
-       } else if (!g_error_matches (error_local, FLATPAK_ERROR, FLATPAK_ERROR_NOT_INSTALLED)) {
-               g_propagate_error (error, g_steal_pointer (&error_local));
-               gs_flatpak_error_convert (error);
-               return FALSE;
+               return TRUE;
        }
 
        /* ensure origin set */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]