mirror of https://gitee.com/openkylin/libvirt.git
vsh: Deduplicate filtering in vshReadlineOptionsGenerator()
Completer callbacks generate all possible outputs ignoring any partial input (e.g. prefix of a domain name) and then use vshCompleterFilter() to filter out those strings which don't fit the partial input (prefix). In contrast, vshReadlineOptionsGenerator() does some internal filtering and only generates completions that match a given prefix. Rather than treating these scenarios differently, simply generate all possible options and filter them all at the end. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Jonathon Jongsma <jjongsma@redhat.com>
This commit is contained in:
parent
3cc6572fab
commit
c3ea585e18
26
tools/vsh.c
26
tools/vsh.c
|
@ -2607,12 +2607,11 @@ vshReadlineCommandGenerator(const char *text)
|
|||
}
|
||||
|
||||
static char **
|
||||
vshReadlineOptionsGenerator(const char *text,
|
||||
vshReadlineOptionsGenerator(const char *text G_GNUC_UNUSED,
|
||||
const vshCmdDef *cmd,
|
||||
vshCmd *last)
|
||||
{
|
||||
size_t list_index = 0;
|
||||
size_t len = strlen(text);
|
||||
size_t ret_size = 0;
|
||||
g_auto(GStrv) ret = NULL;
|
||||
|
||||
|
@ -2631,16 +2630,6 @@ vshReadlineOptionsGenerator(const char *text,
|
|||
if (cmd->opts[list_index].type == VSH_OT_ALIAS)
|
||||
continue;
|
||||
|
||||
if (len > 2) {
|
||||
/* provide auto-complete only when the text starts with -- */
|
||||
if (STRNEQLEN(text, "--", 2))
|
||||
return NULL;
|
||||
if (STRNEQLEN(name, text + 2, len - 2))
|
||||
continue;
|
||||
} else if (STRNEQLEN(text, "--", len)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while (opt) {
|
||||
if (STREQ(opt->def->name, name) && opt->def->type != VSH_OT_ARGV) {
|
||||
exists = true;
|
||||
|
@ -2790,14 +2779,15 @@ vshReadlineParse(const char *text, int state)
|
|||
}
|
||||
}
|
||||
|
||||
/* For string list returned by completer we have to do
|
||||
* filtering based on @text because completer returns all
|
||||
* possible strings. */
|
||||
if (vshCompleterFilter(&completer_list, text) < 0 ||
|
||||
virStringListMerge(&list, &completer_list) < 0) {
|
||||
if (virStringListMerge(&list, &completer_list) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
/* For string list returned by completers we have to do
|
||||
* filtering based on @text because completers returns all
|
||||
* possible strings. */
|
||||
if (vshCompleterFilter(&list, text) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue