[PATCH 08/12] vsh: Deduplicate filtering in vshReadlineOptionsGenerator()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is what we do for completer callbacks: we let them 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).

The same algorithm is implemented in
vshReadlineOptionsGenerator() even though a bit differently.
There is no need to have the same code twice.

Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx>
---
 tools/vsh.c | 26 ++++++++------------------
 1 file changed, 8 insertions(+), 18 deletions(-)

diff --git a/tools/vsh.c b/tools/vsh.c
index f83b2a95a9..5f082f1a35 100644
--- a/tools/vsh.c
+++ b/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;
         }
     }
 
-- 
2.26.2




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux