extensions-tool: Prompt for template when appropriate
When creating an extension interactively, we currently always use the default template unless the --template option is used. Instead, display the list of available templates to the user and prompt them to pick one if it wasn't specified. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/812
This commit is contained in:
parent
6f6251c0bc
commit
d229abf07d
@ -18,6 +18,9 @@
|
|||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define _GNU_SOURCE /* for strcasestr */
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
#include <gio/gdesktopappinfo.h>
|
#include <gio/gdesktopappinfo.h>
|
||||||
@ -250,14 +253,15 @@ create_extension (const char *uuid, const char *name, const char *description, c
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
prompt_metadata (char **uuid, char **name, char **description)
|
prompt_metadata (char **uuid, char **name, char **description, char **template)
|
||||||
{
|
{
|
||||||
g_autoptr (GInputStream) stdin = NULL;
|
g_autoptr (GInputStream) stdin = NULL;
|
||||||
g_autoptr (GDataInputStream) istream = NULL;
|
g_autoptr (GDataInputStream) istream = NULL;
|
||||||
|
|
||||||
if ((uuid == NULL || *uuid != NULL) &&
|
if ((uuid == NULL || *uuid != NULL) &&
|
||||||
(name == NULL || *name != NULL) &&
|
(name == NULL || *name != NULL) &&
|
||||||
(description == NULL || *description != NULL))
|
(description == NULL || *description != NULL) &&
|
||||||
|
(template == NULL || *template != NULL))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
stdin = g_unix_input_stream_new (0, FALSE);
|
stdin = g_unix_input_stream_new (0, FALSE);
|
||||||
@ -321,6 +325,72 @@ prompt_metadata (char **uuid, char **name, char **description)
|
|||||||
|
|
||||||
g_print ("\n");
|
g_print ("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (template != NULL && *template == NULL)
|
||||||
|
{
|
||||||
|
g_autoptr (GPtrArray) templates = get_templates ();
|
||||||
|
|
||||||
|
if (templates->len == 1)
|
||||||
|
{
|
||||||
|
GDesktopAppInfo *info = g_ptr_array_index (templates, 0);
|
||||||
|
*template = g_desktop_app_info_get_string (info, TEMPLATE_KEY);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
g_print (_("Choose one of the available templates:\n"));
|
||||||
|
for (i = 0; i < templates->len; i++)
|
||||||
|
{
|
||||||
|
GAppInfo *info = g_ptr_array_index (templates, i);
|
||||||
|
g_print ("%d) %-10s – %s\n",
|
||||||
|
i + 1,
|
||||||
|
g_app_info_get_name (info),
|
||||||
|
g_app_info_get_description (info));
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*template == NULL)
|
||||||
|
{
|
||||||
|
g_autofree char *line = NULL;
|
||||||
|
|
||||||
|
g_print ("%s [1-%d]: ", _("Template"), templates->len);
|
||||||
|
|
||||||
|
line = g_data_input_stream_read_line_utf8 (istream, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
if (line == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (g_ascii_isdigit (*line))
|
||||||
|
{
|
||||||
|
long i = strtol (line, NULL, 10);
|
||||||
|
|
||||||
|
if (i > 0 && i <= templates->len)
|
||||||
|
{
|
||||||
|
GDesktopAppInfo *info;
|
||||||
|
|
||||||
|
info = g_ptr_array_index (templates, i - 1);
|
||||||
|
*template =
|
||||||
|
g_desktop_app_info_get_string (info, TEMPLATE_KEY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (i = 0; i < templates->len; i++)
|
||||||
|
{
|
||||||
|
GDesktopAppInfo *info = g_ptr_array_index (templates, i);
|
||||||
|
g_autofree char *cur_template = NULL;
|
||||||
|
|
||||||
|
cur_template =
|
||||||
|
g_desktop_app_info_get_string (info, TEMPLATE_KEY);
|
||||||
|
|
||||||
|
if (strcasestr (cur_template, line) != NULL)
|
||||||
|
*template = g_steal_pointer (&cur_template);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_print ("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -403,7 +473,7 @@ handle_create (int argc, char *argv[], gboolean do_help)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (interactive)
|
if (interactive)
|
||||||
prompt_metadata (&uuid, &name, &description);
|
prompt_metadata (&uuid, &name, &description, &template);
|
||||||
|
|
||||||
if (uuid == NULL || name == NULL || description == NULL)
|
if (uuid == NULL || name == NULL || description == NULL)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user