]> xenbits.xensource.com Git - libvirt.git/commitdiff
vsh: Simplify condition for calling completer callback
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 2 Feb 2021 10:52:27 +0000 (11:52 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 10 Feb 2021 10:51:59 +0000 (11:51 +0100)
The way we currently call completer callbacks is that if we've
found --option that user wants to complete value for and it has
callback set then the callback is called.

And just before that, if no --option to have the value completed
is found or is found and is of boolean type then a list of
--option is generated (for given command).

But these two conditions can never be true at the same time
because boolean type of --options do not accept values. Therefore
the calling of completer callback can be promoted onto the same
level as the --option list generation.

This means that merging of two lists can be dropped to and
completer callback can store its retval directly into @list (but
as shown earlier one of the string lists to merge is always
empty).

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Jonathon Jongsma <jjongsma@redhat.com>
tools/vsh.c

index 42f6db3b3270f058f0bcbdf7edb3f664ae431075..a7ac0695cba17e332893d69693ac665349b65477 100644 (file)
@@ -2750,34 +2750,28 @@ vshReadlineParse(const char *text, int state)
 
         if (!cmd) {
             list = vshReadlineCommandGenerator(text);
-        } else {
-            if (!opt || opt->type == VSH_OT_BOOL)
-                list = vshReadlineOptionsGenerator(text, cmd, partial);
-
-            if (opt && opt->completer) {
-                g_auto(GStrv) completer_list = opt->completer(autoCompleteOpaque,
-                                                              partial,
-                                                              opt->completer_flags);
-
-                /* Escape completions, if needed (i.e. argument
-                 * we are completing wasn't started with a quote
-                 * character). This also enables filtering done
-                 * below to work properly. */
-                if (completer_list &&
-                    !rl_completion_quote_character) {
-                    size_t i;
-
-                    for (i = 0; completer_list[i]; i++) {
-                        g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
-
-                        virBufferEscape(&buf, '\\', " ", "%s", completer_list[i]);
-                        VIR_FREE(completer_list[i]);
-                        completer_list[i] = virBufferContentAndReset(&buf);
-                    }
-                }
+        } else if (!opt || opt->type == VSH_OT_BOOL) {
+            list = vshReadlineOptionsGenerator(text, cmd, partial);
+        } else if (opt && opt->completer) {
+            list = opt->completer(autoCompleteOpaque,
+                                  partial,
+                                  opt->completer_flags);
+        }
+
+        /* Escape completions, if needed (i.e. argument
+         * we are completing wasn't started with a quote
+         * character). This also enables filtering done
+         * below to work properly. */
+        if (list &&
+            !rl_completion_quote_character) {
+            size_t i;
+
+            for (i = 0; list[i]; i++) {
+                g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
 
-                if (virStringListMerge(&list, &completer_list) < 0)
-                    goto cleanup;
+                virBufferEscape(&buf, '\\', " ", "%s", list[i]);
+                VIR_FREE(list[i]);
+                list[i] = virBufferContentAndReset(&buf);
             }
         }