diff --git a/app/flatpak-builtins-remote-ls.c b/app/flatpak-builtins-remote-ls.c index e4578381..163c636f 100644 --- a/app/flatpak-builtins-remote-ls.c +++ b/app/flatpak-builtins-remote-ls.c @@ -40,6 +40,7 @@ static gboolean opt_app; static gboolean opt_all; static gboolean opt_only_updates; static char *opt_arch; +static char *opt_app_runtime; static const char **opt_cols; static GOptionEntry options[] = { @@ -49,6 +50,7 @@ static GOptionEntry options[] = { { "updates", 0, 0, G_OPTION_ARG_NONE, &opt_only_updates, N_("Show only those where updates are available"), NULL }, { "arch", 0, 0, G_OPTION_ARG_STRING, &opt_arch, N_("Limit to this arch (* for all)"), N_("ARCH") }, { "all", 'a', 0, G_OPTION_ARG_NONE, &opt_all, N_("List all refs (including locale/debug)"), NULL }, + { "app-runtime", 'a', 0, G_OPTION_ARG_STRING, &opt_app_runtime, N_("List all applications using RUNTIME"), N_("RUNTIME") }, { "columns", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_cols, N_("What information to show"), N_("FIELD,…") }, { NULL } }; @@ -58,6 +60,7 @@ static Column all_columns[] = { { "application", N_("Application"), N_("Show the application ID"), 0, 0 }, { "origin", N_("Origin"), N_("Show the origin remote"), 1, 0 }, { "commit", N_("Commit"), N_("Show the active commit"), 1, 0 }, + { "runtime", N_("Runtime"), N_("Show the runtime"), 1, 0 }, { "installed-size", N_("Installed size"), N_("Show the installed size"), 1, 0 }, { "download-size", N_("Download size"), N_("Show the download size"), 1, 0 }, { "options", N_("Options"), N_("Show options"), 1, 0 }, @@ -93,7 +96,7 @@ remote_dir_pair_new (const char *remote_name, FlatpakDir *dir, FlatpakRemoteStat } static gboolean -ls_remote (GHashTable *refs_hash, const char **arches, Column *columns, GCancellable *cancellable, GError **error) +ls_remote (GHashTable *refs_hash, const char **arches, const char *app_runtime, Column *columns, GCancellable *cancellable, GError **error) { GHashTableIter refs_iter; GHashTableIter iter; @@ -105,10 +108,31 @@ ls_remote (GHashTable *refs_hash, const char **arches, Column *columns, GCancell g_autofree const char **keys = NULL; int i, j; g_autoptr(GHashTable) pref_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + FlatpakKinds match_kinds; + g_autofree char *match_id = NULL; + g_autofree char *match_arch = NULL; + g_autofree char *match_branch = NULL; + gboolean need_cache_data = FALSE; FlatpakTablePrinter *printer = flatpak_table_printer_new (); flatpak_table_printer_set_column_titles (printer, columns); + if (app_runtime) + { + need_cache_data = TRUE; + if (!flatpak_split_partial_ref_arg (app_runtime, FLATPAK_KINDS_RUNTIME, NULL, NULL, + &match_kinds, &match_id, &match_arch, &match_branch, error)) + return FALSE; + } + + for (j = 0; columns[j].name && !need_cache_data; j++) + { + if (strcmp (columns[j].name, "download-size") == 0 || + strcmp (columns[j].name, "installed-size") == 0 || + strcmp (columns[j].name, "runtime") == 0) + need_cache_data = TRUE; + } + g_hash_table_iter_init (&refs_iter, refs_hash); while (g_hash_table_iter_next (&refs_iter, &refs_key, &refs_value)) { @@ -210,6 +234,33 @@ ls_remote (GHashTable *refs_hash, const char **arches, Column *columns, GCancell for (i = 0; i < n_keys; i++) { const char *ref = keys[i]; + guint64 installed_size; + guint64 download_size; + g_autofree char *runtime = NULL; + + if (need_cache_data) + { + const char *metadata = NULL; + g_autoptr(GKeyFile) metakey = NULL; + + if (!flatpak_remote_state_lookup_cache (state, ref, + &download_size, &installed_size, &metadata, + error)) + return FALSE; + + metakey = g_key_file_new (); + if (g_key_file_load_from_data (metakey, metadata, -1, 0, NULL)) + runtime = g_key_file_get_string (metakey, "Application", "runtime", NULL); + } + + if (app_runtime && runtime) + { + g_auto(GStrv) pref = g_strsplit (runtime, "/", 3); + if ((match_id && pref[0] && strcmp (pref[0], match_id) != 0) || + (match_arch && pref[1] && strcmp (pref[1], match_arch) != 0) || + (match_branch && pref[2] && strcmp (pref[2], match_branch) != 0)) + continue; + } for (j = 0; columns[j].name; j++) { @@ -233,13 +284,6 @@ ls_remote (GHashTable *refs_hash, const char **arches, Column *columns, GCancell else { g_autoptr(GVariant) sparse = NULL; - guint64 installed_size; - guint64 download_size; - - if (!flatpak_remote_state_lookup_cache (state, ref, - &download_size, &installed_size, NULL, - error)) - return FALSE; /* The sparse cache is optional */ sparse = flatpak_remote_state_lookup_sparse_cache (state, ref, NULL); @@ -254,6 +298,10 @@ ls_remote (GHashTable *refs_hash, const char **arches, Column *columns, GCancell g_autofree char *download = g_format_size (download_size); flatpak_table_printer_add_decimal_column (printer, download); } + else if (strcmp (columns[j].name, "runtime") == 0) + { + flatpak_table_printer_add_column (printer, runtime); + } else if (strcmp (columns[j].name, "options") == 0) { flatpak_table_printer_add_column (printer, ""); /* Extra */ @@ -395,7 +443,7 @@ flatpak_builtin_remote_ls (int argc, char **argv, GCancellable *cancellable, GEr if (columns == NULL) return FALSE; - return ls_remote (refs_hash, arches, columns, cancellable, error); + return ls_remote (refs_hash, arches, opt_app_runtime, columns, cancellable, error); } gboolean diff --git a/doc/flatpak-remote-ls.xml b/doc/flatpak-remote-ls.xml index 19438c8e..2cd3845a 100644 --- a/doc/flatpak-remote-ls.xml +++ b/doc/flatpak-remote-ls.xml @@ -178,6 +178,14 @@ + + + + + List applications that use the given runtime + + +