[gnome-software/wip/kalev/flatpak-noenumerate-rewrite] flatpak: Rewrite noenumarate=true filtering code
- From: Kalev Lember <klember src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/wip/kalev/flatpak-noenumerate-rewrite] flatpak: Rewrite noenumarate=true filtering code
- Date: Tue, 27 Nov 2018 13:10:54 +0000 (UTC)
commit efdca6a50dfcfd056a01fdfa164f533e0f146ba5
Author: Kalev Lember <klember redhat com>
Date: Mon Nov 19 19:04:33 2018 +0100
flatpak: Rewrite noenumarate=true filtering code
For apps installed from repos that have noenumarate=true, we were using
the origin name (e.g. "org.frozen_bubble.frozen-bubble-origin") and
tried to figure out the installed app ID on that. The code would split
on - and append .desktop and end up with something like
"org.frozen_bubble.frozen.desktop", which is pretty far from the actual
app ID "org.frozen_bubble.frozen-bubble".
This commit replaces this by just asking flatpak what ref is installed
from that repo.
This is slightly made more complicated by the fact that the flatpak API
only appears in flatpak 1.1.1, but we need to support 1.0 as well, so
this commit also adds fallback to parsing the key file manually.
Fixes: https://gitlab.gnome.org/GNOME/gnome-software/issues/195
plugins/flatpak/gs-flatpak.c | 54 ++++++++++++++++++++++++++++++++++++--------
1 file changed, 45 insertions(+), 9 deletions(-)
---
diff --git a/plugins/flatpak/gs-flatpak.c b/plugins/flatpak/gs-flatpak.c
index e85a8566..ae43d13f 100644
--- a/plugins/flatpak/gs-flatpak.c
+++ b/plugins/flatpak/gs-flatpak.c
@@ -244,6 +244,36 @@ gs_flatpak_remove_prefixed_names (AsApp *app)
}
}
+#if !FLATPAK_CHECK_VERSION(1,1,1)
+static gchar *
+gs_flatpak_get_xremote_main_ref (GsFlatpak *self, FlatpakRemote *xremote, GError **error)
+{
+ g_autoptr(GFile) dir = NULL;
+ g_autofree gchar *dir_path = NULL;
+ g_autofree gchar *config_fn = NULL;
+ g_autofree gchar *group = NULL;
+ g_autofree gchar *main_ref = NULL;
+ g_autoptr(GKeyFile) kf = NULL;
+
+ /* figure out the path to the config keyfile */
+ dir = flatpak_installation_get_path (self->installation);
+ if (dir == NULL)
+ return NULL;
+ dir_path = g_file_get_path (dir);
+ if (dir_path == NULL)
+ return NULL;
+ config_fn = g_build_filename (dir_path, "repo", "config", NULL);
+
+ kf = g_key_file_new ();
+ if (!g_key_file_load_from_file (kf, config_fn, G_KEY_FILE_NONE, error))
+ return NULL;
+
+ group = g_strdup_printf ("remote \"%s\"", flatpak_remote_get_name (xremote));
+ main_ref = g_key_file_get_string (kf, group, "xa.main-ref", error);
+ return g_steal_pointer (&main_ref);
+}
+#endif
+
static gboolean
gs_flatpak_add_apps_from_xremote (GsFlatpak *self,
FlatpakRemote *xremote,
@@ -254,7 +284,7 @@ gs_flatpak_add_apps_from_xremote (GsFlatpak *self,
g_autofree gchar *appstream_dir_fn = NULL;
g_autofree gchar *appstream_fn = NULL;
g_autofree gchar *default_branch = NULL;
- g_autofree gchar *only_app_id = NULL;
+ g_autofree gchar *main_ref = NULL;
g_autoptr(AsStore) store = NULL;
g_autoptr(GFile) appstream_dir = NULL;
g_autoptr(GFile) file = NULL;
@@ -306,10 +336,14 @@ gs_flatpak_add_apps_from_xremote (GsFlatpak *self,
/* only add the specific app for noenumerate=true */
if (flatpak_remote_get_noenumerate (xremote)) {
- g_autofree gchar *tmp = NULL;
- tmp = g_strdup (flatpak_remote_get_name (xremote));
- g_strdelimit (tmp, "-", '\0');
- only_app_id = g_strdup_printf ("%s.desktop", tmp);
+#if FLATPAK_CHECK_VERSION(1,1,1)
+ main_ref = flatpak_remote_get_main_ref (xremote);
+#else
+ g_autoptr(GError) error_local = NULL;
+ main_ref = gs_flatpak_get_xremote_main_ref (self, xremote, &error_local);
+ if (main_ref == NULL)
+ g_warning ("failed to main ref: %s", error_local->message);
+#endif
}
/* do we want to filter to the default branch */
@@ -323,10 +357,12 @@ gs_flatpak_add_apps_from_xremote (GsFlatpak *self,
AsApp *app = g_ptr_array_index (apps, i);
/* filter to app */
- if (only_app_id != NULL &&
- g_strcmp0 (as_app_get_id (app), only_app_id) != 0) {
- as_app_set_kind (app, AS_APP_KIND_UNKNOWN);
- continue;
+ if (flatpak_remote_get_noenumerate (xremote)) {
+ AsBundle *bundle = as_app_get_bundle_default (app);
+ if (bundle == NULL || main_ref == NULL)
+ continue;
+ if (g_strcmp0 (as_bundle_get_id (bundle), main_ref) != 0)
+ continue;
}
/* filter by branch */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]