list-remotes: Add more details to remotes list

tingping/wmclass
Alexander Larsson 2015-09-17 12:18:22 +02:00
parent 7bf535ad25
commit 4816f95f1e
1 changed files with 114 additions and 19 deletions

View File

@ -30,18 +30,87 @@
#include "xdg-app-builtins.h"
static gboolean opt_show_urls;
static gboolean opt_show_details;
static GOptionEntry options[] = {
{ "show-urls", 0, 0, G_OPTION_ARG_NONE, &opt_show_urls, "Show remote URLs in list", NULL },
{ "details", 'd', 0, G_OPTION_ARG_NONE, &opt_show_details, "Show remote details", NULL },
{ NULL }
};
typedef struct {
GPtrArray *rows;
GPtrArray *current;
int n_columns;
} TablePrinter;
static TablePrinter *
table_printer_new (void)
{
TablePrinter *printer = g_new0 (TablePrinter, 1);
printer->rows = g_ptr_array_new_with_free_func ((GDestroyNotify)g_strfreev);
printer->current = g_ptr_array_new_with_free_func (g_free);
return printer;
}
static void
table_printer_free (TablePrinter *printer)
{
g_ptr_array_free (printer->rows, TRUE);
g_ptr_array_free (printer->current, TRUE);
g_free (printer);
}
static void
table_printer_add_column (TablePrinter *printer,
const char *text)
{
g_ptr_array_add (printer->current, text ? g_strdup (text) : g_strdup (""));
}
static void
table_printer_finish_row (TablePrinter *printer)
{
printer->n_columns = MAX (printer->n_columns, printer->current->len);
g_ptr_array_add (printer->current, NULL);
g_ptr_array_add (printer->rows,
g_ptr_array_free (printer->current, FALSE));
printer->current = g_ptr_array_new_with_free_func (g_free);
}
static void
table_printer_print (TablePrinter *printer)
{
g_autofree int *widths = NULL;
int i, j;
if (printer->current->len != 0)
table_printer_finish_row (printer);
widths = g_new0 (int, printer->n_columns);
for (i = 0; i < printer->rows->len; i++)
{
char **row = g_ptr_array_index (printer->rows,i);
for (j = 0; row[j] != NULL; j++)
widths[j] = MAX (widths[j], strlen (row[j]));
}
for (i = 0; i < printer->rows->len; i++)
{
char **row = g_ptr_array_index (printer->rows,i);
for (j = 0; row[j] != NULL; j++)
g_print ("%-*s%s", widths[j], row[j], j == printer->n_columns - 1 ? "" : " ");
g_print ("\n");
}
}
gboolean
xdg_app_builtin_list_remotes (int argc, char **argv, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
g_autoptr(GOptionContext) context = NULL;
g_autoptr(XdgAppDir) dir = NULL;
g_auto(GStrv) remotes = NULL;
guint ii, n_remotes = 0;
@ -49,26 +118,57 @@ xdg_app_builtin_list_remotes (int argc, char **argv, GCancellable *cancellable,
context = g_option_context_new (" - List remote repositories");
if (!xdg_app_option_context_parse (context, options, &argc, &argv, 0, &dir, cancellable, error))
goto out;
return FALSE;
remotes = ostree_repo_remote_list (xdg_app_dir_get_repo (dir), &n_remotes);
if (opt_show_urls)
if (opt_show_details)
{
int max_length = 0;
for (ii = 0; ii < n_remotes; ii++)
max_length = MAX (max_length, strlen (remotes[ii]));
TablePrinter *printer = table_printer_new ();
GKeyFile *config = ostree_repo_get_config (xdg_app_dir_get_repo (dir));;
g_autoptr(GString) options = g_string_new ("");
for (ii = 0; ii < n_remotes; ii++)
{
char *remote_name = remotes[ii];
g_autofree char *remote_url = NULL;
g_autofree char *group = NULL;
g_autofree char *title = NULL;
gboolean gpg_verify = TRUE;
if (!ostree_repo_remote_get_url (xdg_app_dir_get_repo (dir), remotes[ii], &remote_url, error))
goto out;
group = g_strdup_printf ("remote \"%s\"", remote_name);
g_print ("%-*s %s\n", max_length, remotes[ii], remote_url);
table_printer_add_column (printer, remote_name);
title = g_key_file_get_string (config, group, "xa.title", NULL);
if (title)
table_printer_add_column (printer, title);
else
table_printer_add_column (printer, "-");
ostree_repo_remote_get_url (xdg_app_dir_get_repo (dir), remote_name, &remote_url, NULL);
table_printer_add_column (printer, remote_url);
ostree_repo_remote_get_gpg_verify (xdg_app_dir_get_repo (dir), remote_name,
&gpg_verify, NULL);
if (!gpg_verify)
{
if (options->len != 0)
g_string_append_c (options, ',');
g_string_append (options, "no-gpg-verify");
}
if (options->len != 0)
table_printer_add_column (printer, options->str);
g_string_truncate (options, 0);
table_printer_finish_row (printer);
}
table_printer_print (printer);
table_printer_free (printer);
}
else
{
@ -76,10 +176,5 @@ xdg_app_builtin_list_remotes (int argc, char **argv, GCancellable *cancellable,
g_print ("%s\n", remotes[ii]);
}
ret = TRUE;
out:
if (context)
g_option_context_free (context);
return ret;
return TRUE;
}