[Libosinfo] [libosinfo PATCH 3/3] osinfo-query: Print os variants information
Fabiano Fidêncio
fidencio at redhat.com
Mon Apr 15 07:58:22 UTC 2019
Os variants information has never been added to osinfo-query and it may
be useful for some apps to match the output of osinfo-query with
osinfo-detect (that's what Cockpit has been doing).
In order to do so, we have to:
- Add a new "variants" entry to be displayed and this new entry is not
displayed by default;
- Take advantage of "real_prop" patch and present this as "variants"
while actually looking for "name" (on OsinfoVariant);
- Take advantage of osinfo_os_list_func and search in order to have the
list of os variants and display then.
There's a drawback for this approach (which has also been documented in
the man page), which is not being able to filter or sort for variants.
https://gitlab.com/libosinfo/libosinfo/issues/24
Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
---
tools/osinfo-query.c | 44 +++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 43 insertions(+), 1 deletion(-)
diff --git a/tools/osinfo-query.c b/tools/osinfo-query.c
index dff2bd7..dfb897e 100644
--- a/tools/osinfo-query.c
+++ b/tools/osinfo-query.c
@@ -75,6 +75,8 @@ static struct OsinfoLabel os_labels[] = {
N_("Code name"), FALSE, 10, NULL },
{ OSINFO_ENTITY_PROP_ID, NULL,
N_("ID"), TRUE, 40, NULL },
+ { "variants", OSINFO_OS_VARIANT_PROP_NAME,
+ N_("OS Variants"), FALSE, 90, (osinfo_os_list_func)osinfo_os_get_variant_list },
{ NULL, NULL, NULL, 0, 0, NULL}
};
@@ -239,7 +241,10 @@ static gboolean print_entity_text(OsinfoEntity *entity,
for (i = 0; labels[i].prop != NULL; i++) {
gsize pad;
gchar *padstr;
- const gchar *val = osinfo_entity_get_param_value(entity, labels[i].prop);
+ gchar *str = NULL;
+ const gchar *val = NULL;
+ const gchar *prop;
+
if (!labels[i].enabled)
continue;
@@ -249,6 +254,37 @@ static gboolean print_entity_text(OsinfoEntity *entity,
g_print(" | ");
first = FALSE;
+ prop = labels[i].real_prop != NULL ? labels[i].real_prop : labels[i].prop;
+ if (labels[i].listOsFunc == NULL) {
+ val = osinfo_entity_get_param_value(entity, prop);
+ } else {
+ if (OSINFO_IS_OS(entity)) {
+ OsinfoList *list = labels[i].listOsFunc(OSINFO_OS(entity));
+ gsize j, list_len;
+
+ list_len = osinfo_list_get_length(list);
+ for (j = 0; j < list_len; j++) {
+ OsinfoEntity *e = osinfo_list_get_nth(list, j);
+ const gchar *value = osinfo_entity_get_param_value(e, prop);
+
+ if (j == 0) {
+ str = g_strdup_printf("%s", value);
+ } else {
+ gchar *tmp;
+
+ /* Don't add duplicated entries */
+ if (strstr(str, value) != NULL)
+ continue;
+
+ tmp = g_strdup_printf("%s, %s", str, value);
+ g_free(str);
+ str = tmp;
+ }
+ }
+ val = str;
+ }
+ }
+
if (val && (strlen(val) > labels[i].width))
pad = 0;
else
@@ -263,6 +299,7 @@ static gboolean print_entity_text(OsinfoEntity *entity,
g_print("%s%s",
val ? val : "", padstr);
g_free(padstr);
+ g_free(str);
}
g_print("\n");
@@ -598,6 +635,11 @@ The OS code name
The OS identifier
+=item B<variants>
+
+The OS variants. Note, though, that no filter or sort can be applied to this
+property.
+
=back
--
2.20.1
More information about the Libosinfo
mailing list