From 498870c3dd6fede5bbbc71d4d45f70c239df080a Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 12 Sep 2018 12:57:23 -0400 Subject: [PATCH] Add helpers for dealing with --columns Since we will have multiple commands with this style of option, lets establish some common utilities. Closes: #2090 Approved by: alexlarsson --- app/flatpak-builtins-utils.c | 160 +++++++++++++++++++++++++++++++++++ app/flatpak-builtins-utils.h | 15 ++++ 2 files changed, 175 insertions(+) diff --git a/app/flatpak-builtins-utils.c b/app/flatpak-builtins-utils.c index 0b840087..67c7b752 100644 --- a/app/flatpak-builtins-utils.c +++ b/app/flatpak-builtins-utils.c @@ -581,3 +581,163 @@ get_permission_tables (XdpDbusPermissionStore *store) return (char **) g_ptr_array_free (tables, FALSE); } + +/*** column handling ***/ + +static int +find_column (Column *columns, + const char *name, + GError **error) +{ + int i; + int candidate; + + candidate = -1; + for (i = 0; columns[i].name; i++) + { + if (g_str_equal (columns[i].name, name)) + { + return i; + } + else if (g_str_has_prefix (columns[i].name, name)) + { + if (candidate == -1) + { + candidate = i; + } + else + { + flatpak_fail (error, _("Ambiguous column: %s"), name); + return -1; + } + } + } + + if (candidate >= 0) + return candidate; + + flatpak_fail (error, _("Unknown column: %s"), name); + return -1; +} + +static Column * +column_filter (Column *columns, + const char *col_arg, + GError **error) +{ + g_auto(GStrv) cols = g_strsplit (col_arg, ",", 0); + int n_cols = g_strv_length (cols); + Column *result = g_new0 (Column, n_cols + 1); + int i; + + for (i = 0; i < n_cols; i++) + { + int idx = find_column (columns, cols[i], error); + if (idx == -1) + return FALSE; + result[i] = columns[idx]; + } + + return result; +} + +static gboolean +list_has (const char *list, + const char *term) +{ + const char *p; + int len; + + p = list; + while (p) + { + p = strstr (p, term); + len = strlen (term); + if (p && + (p == list || p[-1] == ',') && + (p[len] == '\0' || p[len] == ',')) + return TRUE; + } + + return FALSE; +} + +/* Returns column help suitable for passing to + * g_option_context_set_description() + */ +char * +column_help (Column *columns) +{ + GString *s = g_string_new (""); + int len; + int i; + + g_string_append (s, _("Available columns:\n")); + + len = 0; + for (i = 0; columns[i].name; i++) + len = MAX (len, strlen (columns[i].name)); + + len += 4; + for (i = 0; columns[i].name; i++) + g_string_append_printf (s, " %-*s %s\n", len, columns[i].name, _(columns[i].desc)); + + g_string_append_printf (s, " %-*s %s\n", len, "all", _("Show all columns")); + g_string_append_printf (s, " %-*s %s\n", len, "help", _("Show available columns")); + + return g_string_free (s, FALSE); +} + +/* Returns a filtered list of columns, free with g_free. + * opt_show_help should correspond to --show-columns + * opt_show_all should correspond to --show-details or be FALSE + * opt_cols should correspond to --columns + */ +Column * +handle_column_args (Column *all_columns, + gboolean opt_show_all, + const char **opt_cols, + GError **error) +{ + g_autofree char *cols = NULL; + gboolean show_help = FALSE; + gboolean show_all = opt_show_all; + + if (opt_cols) + { + int i; + + for (i = 0; opt_cols[i]; i++) + { + if (list_has (opt_cols[i], "help")) + show_help = TRUE; + else if (list_has (opt_cols[i], "all")) + show_all = TRUE; + } + } + + if (show_help) + { + g_autofree char *col_help = column_help (all_columns); + g_print ("%s", col_help); + return g_new0 (Column, 1); + } + + if (opt_cols && !show_all) + cols = g_strjoinv (",", (char**)opt_cols); + else + { + GString *s; + int i; + + s = g_string_new (""); + for (i = 0; all_columns[i].name; i++) + { + if ((show_all && all_columns[i].all) || all_columns[i].def) + g_string_append_printf (s, "%s%s", s->len > 0 ? "," : "", all_columns[i].name); + } + cols = g_string_free (s, FALSE); + } + + return column_filter (all_columns, cols, error); +} diff --git a/app/flatpak-builtins-utils.h b/app/flatpak-builtins-utils.h index 000fa12c..17a2dcbc 100644 --- a/app/flatpak-builtins-utils.h +++ b/app/flatpak-builtins-utils.h @@ -66,5 +66,20 @@ gboolean update_appstream (GPtrArray *dirs, char ** get_permission_tables (XdpDbusPermissionStore *store); +/* --columns handling */ + +typedef struct { + const char *name; + const char *title; /* use N_() */ + const char *desc; /* use N_() */ + gboolean all; + gboolean def; +} Column; + +char *column_help (Column *columns); +Column *handle_column_args (Column *all_columns, + gboolean opt_show_all, + const char **opt_cols, + GError **error); #endif /* __FLATPAK_BUILTINS_UTILS_H__ */