From 9c354072e8661c445a73a0e10bbb3ae6f09e65b2 Mon Sep 17 00:00:00 2001 From: Phaedrus Leeds Date: Wed, 27 Oct 2021 18:56:25 -0700 Subject: [PATCH] history: Fix printing refs The history command seems to have been broken since it was changed to use FlatpakDecomposed, since that type only works for app or runtime refs, resulting in errors such as: $ flatpak history error: appstream2/x86_64 is not application or runtime Fix this by making the logic a bit smarter, and don't let any one invalid ref entry prevent the whole command from working. Fixes #4332 (cherry picked from commit 7b6dba88037e6f22f91b195193ea8c627cef1cb2) --- app/flatpak-builtins-history.c | 40 ++++++++++++++++++------------ common/flatpak-ref-utils-private.h | 1 + common/flatpak-utils.c | 2 +- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/app/flatpak-builtins-history.c b/app/flatpak-builtins-history.c index 5b5df2bf2..963855e01 100644 --- a/app/flatpak-builtins-history.c +++ b/app/flatpak-builtins-history.c @@ -217,35 +217,43 @@ print_history (GPtrArray *dirs, strcmp (columns[k].name, "arch") == 0 || strcmp (columns[k].name, "branch") == 0) { - g_autoptr(FlatpakDecomposed) ref = NULL; - g_autofree char *ref_str = get_field (j, "REF", error); + g_autofree char *ref_str = NULL; + g_autofree char *value = NULL; + + ref_str = get_field (j, "REF", error); if (*error) return FALSE; - if (ref_str && ref_str[0]) - { - ref = flatpak_decomposed_new_from_ref (ref_str, error); - if (ref == NULL) - return FALSE; - } + if (ref_str && ref_str[0] && + !is_flatpak_ref (ref_str) && + g_strcmp0 (ref_str, OSTREE_REPO_METADATA_REF) != 0) + g_warning ("Unknown ref in history: %s", ref_str); if (strcmp (columns[k].name, "ref") == 0) - flatpak_table_printer_add_column (printer, ref_str); - else + value = g_strdup (ref_str); + else if (strcmp (columns[k].name, "arch") == 0) { - g_autofree char *value = NULL; - if (ref) + if (ref_str != NULL) + value = flatpak_get_arch_for_ref (ref_str); + } + else if (ref_str && ref_str[0] && + (g_str_has_prefix (ref_str, "app/") || + g_str_has_prefix (ref_str, "runtime/"))) + { + g_autoptr(FlatpakDecomposed) ref = NULL; + ref = flatpak_decomposed_new_from_ref (ref_str, NULL); + if (ref == NULL) + g_warning ("Invalid ref in history: %s", ref_str); + else { if (strcmp (columns[k].name, "application") == 0) value = flatpak_decomposed_dup_id (ref); - else if (strcmp (columns[k].name, "arch") == 0) - value = flatpak_decomposed_dup_arch (ref); else value = flatpak_decomposed_dup_branch (ref); } - - flatpak_table_printer_add_column (printer, value); } + + flatpak_table_printer_add_column (printer, value); } else if (strcmp (columns[k].name, "installation") == 0) { diff --git a/common/flatpak-ref-utils-private.h b/common/flatpak-ref-utils-private.h index 64d93b546..4f52bf886 100644 --- a/common/flatpak-ref-utils-private.h +++ b/common/flatpak-ref-utils-private.h @@ -43,6 +43,7 @@ char * flatpak_make_valid_id_prefix (const char *orig_id); gboolean flatpak_id_has_subref_suffix (const char *id, gssize id_len); +gboolean is_flatpak_ref (const char *ref); char * flatpak_get_arch_for_ref (const char *ref); const char *flatpak_get_compat_arch_reverse (const char *compat_arch); diff --git a/common/flatpak-utils.c b/common/flatpak-utils.c index be52453fc..3a5adb82e 100644 --- a/common/flatpak-utils.c +++ b/common/flatpak-utils.c @@ -3162,7 +3162,7 @@ flatpak_repo_save_digested_summary_delta (OstreeRepo *repo, } -static gboolean +gboolean is_flatpak_ref (const char *ref) { return