[PATCH 0/4] virsh completer cleanups

Make the core completer code common in all virt shells and annotate few arguments with the existing empty and local-file completers. Peter Krempa (4): virsh: completer: Extract common completer methods from virsh to vsh vsh: Apply empty/local completers to global commands virsh: Apply empty completer to arguments where completion doesn't make sense virsh: domain: Annotate rest of arguments taking local existing file tools/meson.build | 2 +- tools/virsh-backup.c | 6 +- tools/virsh-checkpoint.c | 8 +- tools/virsh-completer-domain.c | 70 ++++++------ tools/virsh-completer-host.c | 12 +- tools/virsh-completer-nodedev.c | 10 +- tools/virsh-completer-pool.c | 6 +- tools/virsh-completer-volume.c | 4 +- tools/virsh-completer.h | 19 +--- tools/virsh-domain.c | 112 ++++++++++--------- tools/virsh-host.c | 6 +- tools/virsh-interface.c | 2 +- tools/virsh-network.c | 9 +- tools/virsh-nodedev.c | 2 +- tools/virsh-nwfilter.c | 4 +- tools/virsh-pool.c | 18 +-- tools/virsh-secret.c | 6 +- tools/virsh-snapshot.c | 8 +- tools/virsh-volume.c | 12 +- tools/virsh.c | 2 +- tools/virsh.h | 2 +- tools/{virsh-completer.c => vsh-completer.c} | 34 +++--- tools/vsh-completer.h | 41 +++++++ tools/vsh.c | 6 + 24 files changed, 222 insertions(+), 179 deletions(-) rename tools/{virsh-completer.c => vsh-completer.c} (85%) create mode 100644 tools/vsh-completer.h -- 2.49.0

From: Peter Krempa <pkrempa@redhat.com> The helper methods as well as the empty completers can be useful also in other virt shells; extract the code and rename the functions appropriately. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tools/meson.build | 2 +- tools/virsh-backup.c | 6 +- tools/virsh-checkpoint.c | 8 +- tools/virsh-completer-domain.c | 70 ++++++------- tools/virsh-completer-host.c | 12 +-- tools/virsh-completer-nodedev.c | 10 +- tools/virsh-completer-pool.c | 6 +- tools/virsh-completer-volume.c | 4 +- tools/virsh-completer.h | 19 +--- tools/virsh-domain.c | 100 +++++++++---------- tools/virsh-host.c | 6 +- tools/virsh-interface.c | 2 +- tools/virsh-network.c | 8 +- tools/virsh-nodedev.c | 2 +- tools/virsh-nwfilter.c | 4 +- tools/virsh-pool.c | 18 ++-- tools/virsh-secret.c | 6 +- tools/virsh-snapshot.c | 8 +- tools/virsh-volume.c | 12 +-- tools/virsh.c | 2 +- tools/virsh.h | 2 +- tools/{virsh-completer.c => vsh-completer.c} | 34 +++---- tools/vsh-completer.h | 41 ++++++++ 23 files changed, 203 insertions(+), 179 deletions(-) rename tools/{virsh-completer.c => vsh-completer.c} (85%) create mode 100644 tools/vsh-completer.h diff --git a/tools/meson.build b/tools/meson.build index 4d5c9e4bba..a099148d3c 100644 --- a/tools/meson.build +++ b/tools/meson.build @@ -25,6 +25,7 @@ libvirt_shell_lib = static_library( [ 'vsh.c', 'vsh-table.c', + 'vsh-completer.c', ], dependencies: [ tools_dep, @@ -169,7 +170,6 @@ virsh_prog = executable( 'virsh.c', 'virsh-backup.c', 'virsh-checkpoint.c', - 'virsh-completer.c', 'virsh-completer-domain.c', 'virsh-completer-checkpoint.c', 'virsh-completer-host.c', diff --git a/tools/virsh-backup.c b/tools/virsh-backup.c index 27777eea74..39e62f9ba9 100644 --- a/tools/virsh-backup.c +++ b/tools/virsh-backup.c @@ -35,13 +35,13 @@ static const vshCmdOptDef opts_backup_begin[] = { {.name = "backupxml", .type = VSH_OT_STRING, .positional = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("domain backup XML"), }, {.name = "checkpointxml", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("domain checkpoint XML"), }, {.name = "reuse-external", @@ -109,7 +109,7 @@ static const vshCmdOptDef opts_backup_dumpxml[] = { VIRSH_COMMON_OPT_DOMAIN_FULL(VIR_CONNECT_LIST_DOMAINS_ACTIVE), {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", diff --git a/tools/virsh-checkpoint.c b/tools/virsh-checkpoint.c index a0ac0d7f71..1a168a1c38 100644 --- a/tools/virsh-checkpoint.c +++ b/tools/virsh-checkpoint.c @@ -82,7 +82,7 @@ static const vshCmdOptDef opts_checkpoint_create[] = { {.name = "xmlfile", .type = VSH_OT_STRING, .positional = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("domain checkpoint XML") }, {.name = "redefine", @@ -190,13 +190,13 @@ static const vshCmdOptDef opts_checkpoint_create_as[] = { {.name = "name", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("name of checkpoint") }, {.name = "description", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("description of checkpoint") }, {.name = "print-xml", @@ -837,7 +837,7 @@ static const vshCmdOptDef opts_checkpoint_dumpxml[] = { }, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", diff --git a/tools/virsh-completer-domain.c b/tools/virsh-completer-domain.c index 3a165bc4a5..912826c434 100644 --- a/tools/virsh-completer-domain.c +++ b/tools/virsh-completer-domain.c @@ -235,7 +235,7 @@ virshDomainDiskTargetListCompleter(vshControl *ctl, if (!targets) return NULL; - return virshCommaStringListComplete(curval, (const char **) targets); + return vshCommaStringListComplete(curval, (const char **) targets); } @@ -307,7 +307,7 @@ virshDomainThrottleGroupsCompleter(vshControl *ctl, if (!groups) return NULL; - return virshCommaStringListComplete(curval, (const char **) groups); + return vshCommaStringListComplete(curval, (const char **) groups); } @@ -529,7 +529,7 @@ virshDomainShutdownModeCompleter(vshControl *ctl, if (vshCommandOptStringQuiet(ctl, cmd, "mode", &mode) < 0) return NULL; - return virshCommaStringListComplete(mode, modes); + return vshCommaStringListComplete(mode, modes); } @@ -540,8 +540,8 @@ virshDomainInterfaceAddrSourceCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LAST, - virshDomainInterfaceAddressesSourceTypeToString); + return vshEnumComplete(VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LAST, + virshDomainInterfaceAddressesSourceTypeToString); } @@ -552,8 +552,8 @@ virshDomainInterfaceSourceModeCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIRSH_DOMAIN_INTERFACE_SOURCE_MODE_LAST, - virshDomainInterfaceSourceModeTypeToString); + return vshEnumComplete(VIRSH_DOMAIN_INTERFACE_SOURCE_MODE_LAST, + virshDomainInterfaceSourceModeTypeToString); } @@ -564,8 +564,8 @@ virshDomainHostnameSourceCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIRSH_DOMAIN_HOSTNAME_SOURCE_LAST, - virshDomainHostnameSourceTypeToString); + return vshEnumComplete(VIRSH_DOMAIN_HOSTNAME_SOURCE_LAST, + virshDomainHostnameSourceTypeToString); } @@ -582,10 +582,10 @@ virshDomainPerfEnableCompleter(vshControl *ctl, if (vshCommandOptStringQuiet(ctl, cmd, "enable", &event) < 0) return NULL; - events = virshEnumComplete(VIR_PERF_EVENT_LAST, - virPerfEventTypeToString); + events = vshEnumComplete(VIR_PERF_EVENT_LAST, + virPerfEventTypeToString); - return virshCommaStringListComplete(event, (const char **)events); + return vshCommaStringListComplete(event, (const char **)events); } @@ -602,10 +602,10 @@ virshDomainPerfDisableCompleter(vshControl *ctl, if (vshCommandOptStringQuiet(ctl, cmd, "disable", &event) < 0) return NULL; - events = virshEnumComplete(VIR_PERF_EVENT_LAST, - virPerfEventTypeToString); + events = vshEnumComplete(VIR_PERF_EVENT_LAST, + virPerfEventTypeToString); - return virshCommaStringListComplete(event, (const char **)events); + return vshCommaStringListComplete(event, (const char **)events); } @@ -708,7 +708,7 @@ virshDomainVcpulistCompleter(vshControl *ctl, for (id = 0; id < nvcpus; id++) vcpulist[id] = g_strdup_printf("%u", id); - return virshCommaStringListComplete(vcpuid, (const char **)vcpulist); + return vshCommaStringListComplete(vcpuid, (const char **)vcpulist); } @@ -738,7 +738,7 @@ virshDomainCpulistCompleter(vshControl *ctl, for (i = 0; i < cpunum; i++) cpulist[i] = g_strdup_printf("%zu", i); - return virshCommaStringListComplete(cpuid, (const char **)cpulist); + return vshCommaStringListComplete(cpuid, (const char **)cpulist); } @@ -837,7 +837,7 @@ virshDomainVcpulistViaAgentCompleter(vshControl *ctl, } } - ret = virshCommaStringListComplete(vcpuid, (const char **)cpulist); + ret = vshCommaStringListComplete(vcpuid, (const char **)cpulist); cleanup: virTypedParamsFree(params, nparams); @@ -906,8 +906,8 @@ virshDomainSignalCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIR_DOMAIN_PROCESS_SIGNAL_LAST, - virshDomainProcessSignalTypeToString); + return vshEnumComplete(VIR_DOMAIN_PROCESS_SIGNAL_LAST, + virshDomainProcessSignalTypeToString); } @@ -918,8 +918,8 @@ virshDomainLifecycleCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIR_DOMAIN_LIFECYCLE_LAST, - virshDomainLifecycleTypeToString); + return vshEnumComplete(VIR_DOMAIN_LIFECYCLE_LAST, + virshDomainLifecycleTypeToString); } @@ -930,8 +930,8 @@ virshDomainLifecycleActionCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIR_DOMAIN_LIFECYCLE_ACTION_LAST, - virshDomainLifecycleActionTypeToString); + return vshEnumComplete(VIR_DOMAIN_LIFECYCLE_ACTION_LAST, + virshDomainLifecycleActionTypeToString); } @@ -942,8 +942,8 @@ virshCodesetNameCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIR_KEYCODE_SET_LAST, - virKeycodeSetTypeToString); + return vshEnumComplete(VIR_KEYCODE_SET_LAST, + virKeycodeSetTypeToString); } @@ -1063,8 +1063,8 @@ virshDomainCoreDumpFormatCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIR_DOMAIN_CORE_DUMP_FORMAT_LAST, - virshDomainCoreDumpFormatTypeToString); + return vshEnumComplete(VIR_DOMAIN_CORE_DUMP_FORMAT_LAST, + virshDomainCoreDumpFormatTypeToString); } @@ -1081,7 +1081,7 @@ virshDomainMigrateCompMethodsCompleter(vshControl *ctl, if (vshCommandOptStringQuiet(ctl, cmd, "comp-methods", &method) < 0) return NULL; - return virshCommaStringListComplete(method, methods); + return vshCommaStringListComplete(method, methods); } @@ -1092,8 +1092,8 @@ virshDomainStorageFileFormatCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIR_STORAGE_FILE_LAST, - virStorageFileFormatTypeToString); + return vshEnumComplete(VIR_STORAGE_FILE_LAST, + virStorageFileFormatTypeToString); } @@ -1104,8 +1104,8 @@ virshDomainNumatuneModeCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIR_DOMAIN_NUMATUNE_MEM_LAST, - virDomainNumatuneMemModeTypeToString); + return vshEnumComplete(VIR_DOMAIN_NUMATUNE_MEM_LAST, + virDomainNumatuneMemModeTypeToString); } @@ -1116,6 +1116,6 @@ virshDomainDirtyRateCalcModeCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIRSH_DOMAIN_DIRTYRATE_CALC_MODE_LAST, - virshDomainDirtyRateCalcModeTypeToString); + return vshEnumComplete(VIRSH_DOMAIN_DIRTYRATE_CALC_MODE_LAST, + virshDomainDirtyRateCalcModeTypeToString); } diff --git a/tools/virsh-completer-host.c b/tools/virsh-completer-host.c index 78d2236f97..c3919a6d91 100644 --- a/tools/virsh-completer-host.c +++ b/tools/virsh-completer-host.c @@ -178,8 +178,8 @@ virshNodeSuspendTargetCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIR_NODE_SUSPEND_TARGET_LAST, - virshNodeSuspendTargetTypeToString); + return vshEnumComplete(VIR_NODE_SUSPEND_TARGET_LAST, + virshNodeSuspendTargetTypeToString); } @@ -190,8 +190,8 @@ virshDomainVirtTypeCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIR_DOMAIN_VIRT_LAST, - virDomainVirtTypeToString); + return vshEnumComplete(VIR_DOMAIN_VIRT_LAST, + virDomainVirtTypeToString); } @@ -202,8 +202,8 @@ virshArchCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIR_ARCH_LAST, - (const char *(*)(int))virArchToString); + return vshEnumComplete(VIR_ARCH_LAST, + (const char *(*)(int))virArchToString); } diff --git a/tools/virsh-completer-nodedev.c b/tools/virsh-completer-nodedev.c index 72951a54f6..289f803904 100644 --- a/tools/virsh-completer-nodedev.c +++ b/tools/virsh-completer-nodedev.c @@ -96,10 +96,10 @@ virshNodeDeviceCapabilityNameCompleter(vshControl *ctl, if (vshCommandOptStringQuiet(ctl, cmd, "cap", &cap_str) < 0) return NULL; - tmp = virshEnumComplete(VIR_NODE_DEV_CAP_LAST, - virNodeDevCapTypeToString); + tmp = vshEnumComplete(VIR_NODE_DEV_CAP_LAST, + virNodeDevCapTypeToString); - return virshCommaStringListComplete(cap_str, (const char **)tmp); + return vshCommaStringListComplete(cap_str, (const char **)tmp); } @@ -110,6 +110,6 @@ virshNodeDevicePCIBackendCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_LAST, - virDeviceHostdevPCIDriverNameTypeToString); + return vshEnumComplete(VIR_DEVICE_HOSTDEV_PCI_DRIVER_NAME_LAST, + virDeviceHostdevPCIDriverNameTypeToString); } diff --git a/tools/virsh-completer-pool.c b/tools/virsh-completer-pool.c index 3568bb985b..6701436c0f 100644 --- a/tools/virsh-completer-pool.c +++ b/tools/virsh-completer-pool.c @@ -95,8 +95,8 @@ virshPoolTypeCompleter(vshControl *ctl, virCheckFlags(VIRSH_POOL_TYPE_COMPLETER_COMMA, NULL); - tmp = virshEnumComplete(VIR_STORAGE_POOL_LAST, - virStoragePoolTypeToString); + tmp = vshEnumComplete(VIR_STORAGE_POOL_LAST, + virStoragePoolTypeToString); if (!(flags & VIRSH_POOL_TYPE_COMPLETER_COMMA)) return g_steal_pointer(&tmp); @@ -104,5 +104,5 @@ virshPoolTypeCompleter(vshControl *ctl, if (vshCommandOptStringQuiet(ctl, cmd, "type", &type_str) < 0) return NULL; - return virshCommaStringListComplete(type_str, (const char **)tmp); + return vshCommaStringListComplete(type_str, (const char **)tmp); } diff --git a/tools/virsh-completer-volume.c b/tools/virsh-completer-volume.c index 9a80112e59..5ad2e28318 100644 --- a/tools/virsh-completer-volume.c +++ b/tools/virsh-completer-volume.c @@ -123,6 +123,6 @@ virshStorageVolWipeAlgorithmCompleter(vshControl *ctl G_GNUC_UNUSED, { virCheckFlags(0, NULL); - return virshEnumComplete(VIR_STORAGE_VOL_WIPE_ALG_LAST, - virshStorageVolWipeAlgorithmTypeToString); + return vshEnumComplete(VIR_STORAGE_VOL_WIPE_ALG_LAST, + virshStorageVolWipeAlgorithmTypeToString); } diff --git a/tools/virsh-completer.h b/tools/virsh-completer.h index 131678dfbc..2ddd5446cd 100644 --- a/tools/virsh-completer.h +++ b/tools/virsh-completer.h @@ -20,6 +20,7 @@ #pragma once +#include "vsh-completer.h" #include "virsh-completer-checkpoint.h" #include "virsh-completer-domain.h" #include "virsh-completer-host.h" @@ -31,21 +32,3 @@ #include "virsh-completer-secret.h" #include "virsh-completer-snapshot.h" #include "virsh-completer-volume.h" - -char ** -virshEnumComplete(unsigned int last, - const char *(*intToStr)(int)); - -char ** -virshCommaStringListComplete(const char *input, - const char **options); - -char ** -virshCompletePathLocalExisting(vshControl *ctl, - const vshCmd *cmd, - unsigned int completerflags); - -char ** -virshCompleteEmpty(vshControl *ctl, - const vshCmd *cmd, - unsigned int completerflags); diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index a5f87243a2..7e5e83126e 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -429,7 +429,7 @@ static const vshCmdOptDef opts_attach_disk[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("target of disk device") }, {.name = "targetbus", @@ -475,17 +475,17 @@ static const vshCmdOptDef opts_attach_disk[] = { }, {.name = "serial", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("serial of disk device") }, {.name = "wwn", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("wwn of disk device") }, {.name = "alias", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("custom alias name of disk device") }, {.name = "rawio", @@ -494,7 +494,7 @@ static const vshCmdOptDef opts_attach_disk[] = { }, {.name = "address", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("address of disk device") }, {.name = "multifunction", @@ -511,7 +511,7 @@ static const vshCmdOptDef opts_attach_disk[] = { }, {.name = "source-host-name", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("host name for source of disk device") }, {.name = "source-host-transport", @@ -847,13 +847,13 @@ static const vshCmdOptDef opts_attach_interface[] = { {.name = "target", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("target network name") }, {.name = "mac", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("MAC address") }, {.name = "script", @@ -869,19 +869,19 @@ static const vshCmdOptDef opts_attach_interface[] = { {.name = "alias", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("custom alias name of interface device") }, {.name = "inbound", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("control domain's incoming traffics") }, {.name = "outbound", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("control domain's outgoing traffics") }, VIRSH_COMMON_OPT_DOMAIN_PERSISTENT, @@ -1405,7 +1405,7 @@ static const vshCmdOptDef opts_blkdeviotune[] = { }, {.name = "group-name", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("group name to share I/O quota between multiple drives") }, VSH_OPTS_IOTUNE, @@ -1912,31 +1912,31 @@ static const vshCmdOptDef opts_blkiotune[] = { {.name = "device-weights", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("per-device IO Weights, in the form of /path/to/device,weight,...") }, {.name = "device-read-iops-sec", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("per-device read I/O limit per second, in the form of /path/to/device,read_iops_sec,...") }, {.name = "device-write-iops-sec", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("per-device write I/O limit per second, in the form of /path/to/device,write_iops_sec,...") }, {.name = "device-read-bytes-sec", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("per-device bytes read per second, in the form of /path/to/device,read_bytes_sec,...") }, {.name = "device-write-bytes-sec", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("per-device bytes wrote per second, in the form of /path/to/device,write_bytes_sec,...") }, VIRSH_COMMON_OPT_DOMAIN_CONFIG, @@ -2669,7 +2669,7 @@ static const vshCmdOptDef opts_blockcopy[] = { {.name = "xml", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("filename containing XML description of the copy destination") }, {.name = "format", @@ -3617,13 +3617,13 @@ static const vshCmdOptDef opts_domiftune[] = { {.name = "inbound", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("control domain's incoming traffics") }, {.name = "outbound", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("control domain's outgoing traffics") }, VIRSH_COMMON_OPT_DOMAIN_CONFIG, @@ -4386,7 +4386,7 @@ static const vshCmdOptDef opts_start[] = { {.name = "pass-fds", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("pass file descriptors N,M,... to the guest") }, {.name = "reset-nvram", @@ -4541,7 +4541,7 @@ static const vshCmdOptDef opts_save[] = { {.name = "xml", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("filename containing updated XML for the target") }, {.name = "running", @@ -4939,7 +4939,7 @@ static const vshCmdOptDef opts_save_image_dumpxml[] = { }, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", @@ -4994,7 +4994,7 @@ static const vshCmdOptDef opts_save_image_define[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("filename containing updated XML for the target") }, {.name = "running", @@ -5344,7 +5344,7 @@ static const vshCmdOptDef opts_managed_save_dumpxml[] = { }, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", @@ -5392,7 +5392,7 @@ static const vshCmdOptDef opts_managed_save_define[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("filename containing updated XML for the target") }, {.name = "running", @@ -5680,7 +5680,7 @@ static const vshCmdOptDef opts_restore[] = { {.name = "xml", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("filename containing updated XML for the target") }, {.name = "running", @@ -5949,7 +5949,7 @@ static const vshCmdOptDef opts_screenshot[] = { {.name = "file", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("where to store the screenshot") }, {.name = "screen", @@ -6181,7 +6181,7 @@ static const vshCmdOptDef opts_set_user_password[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("the new password") }, {.name = "encrypted", @@ -8476,7 +8476,7 @@ static const vshCmdOptDef opts_create[] = { {.name = "pass-fds", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("pass file descriptors N,M,... to the guest") }, {.name = "validate", @@ -8833,7 +8833,7 @@ static const vshCmdOptDef opts_metadata[] = { {.name = "set", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("new metadata to set"), }, {.name = "remove", @@ -9086,7 +9086,7 @@ static const vshCmdOptDef opts_send_process_signal[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("the process ID") }, {.name = "signame", @@ -10036,14 +10036,14 @@ static const vshCmdOptDef opts_dom_fd_associate[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("name of the FD group") }, {.name = "pass-fds", .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("file descriptors N,M,... to associate") }, {.name = "seclabel-writable", @@ -10112,7 +10112,7 @@ static const vshCmdOptDef opts_qemu_monitor_command[] = { }, {.name = "pass-fds", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("pass file descriptors N,M,... along with the command") }, {.name = "cmd", @@ -10446,7 +10446,7 @@ static const vshCmdOptDef opts_qemu_attach[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("pid") }, {.name = NULL} @@ -10705,7 +10705,7 @@ static const vshCmdOptDef opts_dumpxml[] = { }, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", @@ -10768,7 +10768,7 @@ static const vshCmdOptDef opts_domxmlfromnative[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("config data file to import from") }, {.name = NULL} @@ -10822,7 +10822,7 @@ static const vshCmdOptDef opts_domxmltonative[] = { {.name = "xml", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("xml data file to export from") }, {.name = NULL} @@ -10919,7 +10919,7 @@ static const vshCmdOptDef opts_domrename[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("new domain name") }, {.name = NULL} @@ -11022,7 +11022,7 @@ static const vshCmdOptDef opts_migrate[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("connection URI of the destination host as seen from the client(normal migration) or source(p2p migration)") }, VIRSH_COMMON_OPT_LIVE(N_("live migration")), @@ -11117,25 +11117,25 @@ static const vshCmdOptDef opts_migrate[] = { {.name = "migrateuri", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("migration URI, usually can be omitted") }, {.name = "graphicsuri", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("graphics URI to be used for seamless graphics migration") }, {.name = "listen-address", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("listen address that destination should bind to for incoming migration") }, {.name = "dname", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("rename to new name during migration (if supported)") }, {.name = "timeout", @@ -11155,7 +11155,7 @@ static const vshCmdOptDef opts_migrate[] = { {.name = "xml", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("filename containing updated XML for the target") }, {.name = "migrate-disks", @@ -11176,7 +11176,7 @@ static const vshCmdOptDef opts_migrate[] = { }, {.name = "disks-uri", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("URI to use for disks migration (overrides --disks-port)") }, {.name = "comp-methods", @@ -11210,7 +11210,7 @@ static const vshCmdOptDef opts_migrate[] = { }, {.name = "persistent-xml", .type = VSH_OT_STRING, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("filename containing updated persistent XML for the target") }, {.name = "tls", @@ -11235,7 +11235,7 @@ static const vshCmdOptDef opts_migrate[] = { }, {.name = "tls-destination", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("override the destination host name used for TLS verification") }, {.name = "comp-zlib-level", @@ -13673,7 +13673,7 @@ static const vshCmdOptDef opts_set_user_sshkeys[] = { {.name = "file", .type = VSH_OT_STRING, .positional = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("optional file to read keys from"), }, {.name = "reset", diff --git a/tools/virsh-host.c b/tools/virsh-host.c index 7a4c2b20d5..16f9411730 100644 --- a/tools/virsh-host.c +++ b/tools/virsh-host.c @@ -45,7 +45,7 @@ static const vshCmdInfo info_capabilities = { static const vshCmdOptDef opts_capabilities[] = { {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", @@ -107,7 +107,7 @@ static const vshCmdOptDef opts_domcapabilities[] = { }, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", @@ -1667,7 +1667,7 @@ static const vshCmdOptDef opts_hypervisor_cpu_baseline[] = { {.name = "file", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("file containing XML CPU descriptions"), }, {.name = "virttype", diff --git a/tools/virsh-interface.c b/tools/virsh-interface.c index 7e3103adf1..624d3283a2 100644 --- a/tools/virsh-interface.c +++ b/tools/virsh-interface.c @@ -453,7 +453,7 @@ static const vshCmdOptDef opts_interface_dumpxml[] = { }, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", diff --git a/tools/virsh-network.c b/tools/virsh-network.c index 5382070031..3fd22db2b0 100644 --- a/tools/virsh-network.c +++ b/tools/virsh-network.c @@ -506,7 +506,7 @@ static const vshCmdOptDef opts_network_metadata[] = { {.name = "set", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("new metadata to set"), }, {.name = "remove", @@ -638,7 +638,7 @@ static const vshCmdOptDef opts_network_dumpxml[] = { }, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", @@ -1234,7 +1234,7 @@ static const vshCmdOptDef opts_network_update[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("name of file containing xml (or, if it starts with '<', the complete " "xml element itself) to add/modify, or to be matched for search") }, @@ -1871,7 +1871,7 @@ static const vshCmdOptDef opts_network_port_dumpxml[] = { VIRSH_COMMON_OPT_NETWORK_PORT(0), {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c index 7ae6127513..2ce0c1411f 100644 --- a/tools/virsh-nodedev.c +++ b/tools/virsh-nodedev.c @@ -590,7 +590,7 @@ static const vshCmdOptDef opts_node_device_dumpxml[] = { }, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", diff --git a/tools/virsh-nwfilter.c b/tools/virsh-nwfilter.c index 3745abb67e..0348584f23 100644 --- a/tools/virsh-nwfilter.c +++ b/tools/virsh-nwfilter.c @@ -175,7 +175,7 @@ static const vshCmdOptDef opts_nwfilter_dumpxml[] = { }, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", @@ -576,7 +576,7 @@ static const vshCmdOptDef opts_nwfilter_binding_dumpxml[] = { }, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c index 089fde55e2..2010ef1356 100644 --- a/tools/virsh-pool.c +++ b/tools/virsh-pool.c @@ -57,7 +57,7 @@ .type = VSH_OT_STRING, \ .positional = true, \ .required = true, \ - .completer = virshCompleteEmpty, \ + .completer = vshCompleteEmpty, \ .help = N_("name of the pool") \ }, \ {.name = "type", \ @@ -74,7 +74,7 @@ {.name = "source-host", \ .type = VSH_OT_STRING, \ .unwanted_positional = true, \ - .completer = virshCompleteEmpty, \ + .completer = vshCompleteEmpty, \ .help = N_("source-host for underlying storage") \ }, \ {.name = "source-path", \ @@ -110,7 +110,7 @@ {.name = "auth-username", \ .type = VSH_OT_STRING, \ .unwanted_positional = true, \ - .completer = virshCompleteEmpty, \ + .completer = vshCompleteEmpty, \ .help = N_("auth username to be used for underlying storage") \ }, \ {.name = "secret-usage", \ @@ -166,7 +166,7 @@ {.name = "source-initiator", \ .type = VSH_OT_STRING, \ .unwanted_positional = true, \ - .completer = virshCompleteEmpty, \ + .completer = vshCompleteEmpty, \ .help = N_("initiator iqn for underlying storage") \ } @@ -745,7 +745,7 @@ static const vshCmdOptDef opts_pool_dumpxml[] = { }, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", @@ -1375,19 +1375,19 @@ static const vshCmdOptDef opts_find_storage_pool_sources_as[] = { {.name = "host", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("optional host to query") }, {.name = "port", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("optional port to query") }, {.name = "initiator", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("optional initiator IQN to use for query") }, {.name = NULL} @@ -1462,7 +1462,7 @@ static const vshCmdOptDef opts_find_storage_pool_sources[] = { {.name = "srcSpec", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("optional file of source xml to query for pools") }, {.name = NULL} diff --git a/tools/virsh-secret.c b/tools/virsh-secret.c index 68b14a5276..26ecb41073 100644 --- a/tools/virsh-secret.c +++ b/tools/virsh-secret.c @@ -131,7 +131,7 @@ static const vshCmdOptDef opts_secret_dumpxml[] = { }, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", @@ -186,7 +186,7 @@ static const vshCmdOptDef opts_secret_set_value[] = { }, {.name = "file", .type = VSH_OT_STRING, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("read secret from file"), }, {.name = "plain", @@ -200,7 +200,7 @@ static const vshCmdOptDef opts_secret_set_value[] = { {.name = "base64", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("base64-encoded secret value") }, {.name = NULL} diff --git a/tools/virsh-snapshot.c b/tools/virsh-snapshot.c index dbd849bb3b..8e5b9d635c 100644 --- a/tools/virsh-snapshot.c +++ b/tools/virsh-snapshot.c @@ -110,7 +110,7 @@ static const vshCmdOptDef opts_snapshot_create[] = { {.name = "xmlfile", .type = VSH_OT_STRING, .positional = true, - .completer = virshCompletePathLocalExisting, + .completer = vshCompletePathLocalExisting, .help = N_("domain snapshot XML") }, {.name = "redefine", @@ -315,13 +315,13 @@ static const vshCmdOptDef opts_snapshot_create_as[] = { {.name = "name", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("name of snapshot") }, {.name = "description", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("description of snapshot") }, {.name = "print-xml", @@ -1593,7 +1593,7 @@ static const vshCmdOptDef opts_snapshot_dumpxml[] = { }, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", diff --git a/tools/virsh-volume.c b/tools/virsh-volume.c index 7b1847d7ae..7346d628d5 100644 --- a/tools/virsh-volume.c +++ b/tools/virsh-volume.c @@ -178,20 +178,20 @@ static const vshCmdOptDef opts_vol_create_as[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("name of the volume") }, {.name = "capacity", .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("size of the vol, as scaled integer (default bytes)") }, {.name = "allocation", .type = VSH_OT_STRING, .unwanted_positional = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("initial allocation size, as scaled integer (default bytes)") }, {.name = "format", @@ -531,7 +531,7 @@ static const vshCmdOptDef opts_vol_clone[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("clone name") }, VIRSH_COMMON_OPT_POOL_OPTIONAL, @@ -1041,7 +1041,7 @@ static const vshCmdOptDef opts_vol_resize[] = { .type = VSH_OT_STRING, .positional = true, .required = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("new capacity for the vol, as scaled integer (default bytes)") }, VIRSH_COMMON_OPT_POOL_OPTIONAL, @@ -1129,7 +1129,7 @@ static const vshCmdOptDef opts_vol_dumpxml[] = { VIRSH_COMMON_OPT_POOL_OPTIONAL, {.name = "xpath", .type = VSH_OT_STRING, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("xpath expression to filter the XML document") }, {.name = "wrap", diff --git a/tools/virsh.c b/tools/virsh.c index c893216637..244ca655ee 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -248,7 +248,7 @@ static const vshCmdOptDef opts_connect[] = { .type = VSH_OT_STRING, .positional = true, .allowEmpty = true, - .completer = virshCompleteEmpty, + .completer = vshCompleteEmpty, .help = N_("hypervisor connection URI") }, {.name = "readonly", diff --git a/tools/virsh.h b/tools/virsh.h index 90ffc4bf18..0e4c368c9b 100644 --- a/tools/virsh.h +++ b/tools/virsh.h @@ -102,7 +102,7 @@ .type = VSH_OT_STRING, \ .required = true, \ .positional = true, \ - .completer = virshCompletePathLocalExisting, \ + .completer = vshCompletePathLocalExisting, \ .help = _helpstr \ } diff --git a/tools/virsh-completer.c b/tools/vsh-completer.c similarity index 85% rename from tools/virsh-completer.c rename to tools/vsh-completer.c index d4defba86e..8f0376879c 100644 --- a/tools/virsh-completer.c +++ b/tools/vsh-completer.c @@ -1,5 +1,5 @@ /* - * virsh-completer.c: virsh completer callbacks + * vsh-completer.c: virsh completer callbacks * * Copyright (C) 2017 Red Hat, Inc. * @@ -20,7 +20,7 @@ #include <config.h> -#include "virsh-completer.h" +#include "vsh-completer.h" /** * A completer callback is a function that accepts three arguments: @@ -56,7 +56,7 @@ /** - * virshEnumComplete: + * vshEnumComplete: * @last: The number of element in enum (pass VIR_XXX_LAST) * @intToStr: integer to string conversion (pass virXXXTypeToString) * @@ -67,8 +67,8 @@ * Returns: string list of completions. */ char ** -virshEnumComplete(unsigned int last, - const char *(*intToStr)(int)) +vshEnumComplete(unsigned int last, + const char *(*intToStr)(int)) { char **ret = NULL; size_t i; @@ -83,7 +83,7 @@ virshEnumComplete(unsigned int last, /** - * virshCommaStringListComplete: + * vshCommaStringListComplete: * @input: user input so far * @options: ALL options available for argument * @@ -102,15 +102,15 @@ virshEnumComplete(unsigned int last, * This helper function takes care of that. In this specific case * it would be called as follows: * - * virshCommaStringListComplete("str1,str2,str3", + * vshCommaStringListComplete("str1,str2,str3", * {"strA", "strB", "strC", NULL}); * * Returns: string list of completions on success, * NULL otherwise. */ char ** -virshCommaStringListComplete(const char *input, - const char **options) +vshCommaStringListComplete(const char *input, + const char **options) { const size_t optionsLen = g_strv_length((char **) options); g_autofree char *inputCopy = NULL; @@ -156,7 +156,7 @@ virshCommaStringListComplete(const char *input, /** - * virshCompletePathLocalExisting: + * vshCompletePathLocalExisting: * * Complete a path to a existing file used as input. The file is used as input * for virsh so only local files are considered. @@ -164,16 +164,16 @@ virshCommaStringListComplete(const char *input, * Note: For now this is a no-op. Readline does the correct thing. */ char ** -virshCompletePathLocalExisting(vshControl *ctl G_GNUC_UNUSED, - const vshCmd *cmd G_GNUC_UNUSED, - unsigned int completerflags G_GNUC_UNUSED) +vshCompletePathLocalExisting(vshControl *ctl G_GNUC_UNUSED, + const vshCmd *cmd G_GNUC_UNUSED, + unsigned int completerflags G_GNUC_UNUSED) { return NULL; } /** - * virshCompleteEmpty: + * vshCompleteEmpty: * * Complete nothing. For cases where an user input is required and we can't * suggest anything. @@ -182,9 +182,9 @@ virshCompletePathLocalExisting(vshControl *ctl G_GNUC_UNUSED, * file list. */ char ** -virshCompleteEmpty(vshControl *ctl G_GNUC_UNUSED, - const vshCmd *cmd G_GNUC_UNUSED, - unsigned int completerflags G_GNUC_UNUSED) +vshCompleteEmpty(vshControl *ctl G_GNUC_UNUSED, + const vshCmd *cmd G_GNUC_UNUSED, + unsigned int completerflags G_GNUC_UNUSED) { return NULL; } diff --git a/tools/vsh-completer.h b/tools/vsh-completer.h new file mode 100644 index 0000000000..b479156062 --- /dev/null +++ b/tools/vsh-completer.h @@ -0,0 +1,41 @@ +/* + * vsh-completer.h: common virt shell completer callbacks + * + * Copyright (C) 2017 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include "vsh.h" + +char ** +vshEnumComplete(unsigned int last, + const char *(*intToStr)(int)); + +char ** +vshCommaStringListComplete(const char *input, + const char **options); + +char ** +vshCompletePathLocalExisting(vshControl *ctl, + const vshCmd *cmd, + unsigned int completerflags); + +char ** +vshCompleteEmpty(vshControl *ctl, + const vshCmd *cmd, + unsigned int completerflags); -- 2.49.0

From: Peter Krempa <pkrempa@redhat.com> Few outstanding arguments were not marked with completers completer despite the fact that we can't provide any reasonable suggestion (e.g 'echo' or 'complete' commands) or where we want to complete local path ( 'cd' ). Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tools/vsh.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/vsh.c b/tools/vsh.c index d1e699505b..05845e2c1e 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -46,6 +46,8 @@ #include "virstring.h" #include "virutil.h" +#include "vsh-completer.h" + #ifdef WITH_READLINE /* For autocompletion */ vshControl *autoCompleteOpaque; @@ -3283,6 +3285,7 @@ const vshCmdOptDef opts_cd[] = { {.name = "dir", .type = VSH_OT_STRING, .positional = true, + .completer = vshCompletePathLocalExisting, .help = N_("directory to switch to (default: home or else root)") }, {.name = NULL} @@ -3340,11 +3343,13 @@ const vshCmdOptDef opts_echo[] = { }, {.name = "prefix", .type = VSH_OT_STRING, + .completer = vshCompleteEmpty, .help = N_("prefix the message") }, {.name = "string", .type = VSH_OT_ARGV, .positional = true, + .completer = vshCompleteEmpty, .help = N_("arguments to echo") }, {.name = NULL} @@ -3491,6 +3496,7 @@ const vshCmdOptDef opts_complete[] = { .type = VSH_OT_ARGV, .positional = true, .allowEmpty = true, + .completer = vshCompleteEmpty, .help = N_("partial string to autocomplete") }, {.name = NULL} -- 2.49.0

From: Peter Krempa <pkrempa@redhat.com> Few outstanding arguments were not marked with 'virshCompleteEmpty' completer despite the fact that we can't provide any reasonable suggestion, e.g. for the new description of a domain or for the launch secret. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tools/virsh-domain.c | 6 ++++++ tools/virsh-network.c | 1 + 2 files changed, 7 insertions(+) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 7e5e83126e..f9acedf3db 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -8696,6 +8696,7 @@ static const vshCmdOptDef opts_desc[] = { {.name = "new-desc", .type = VSH_OT_ARGV, .positional = true, + .completer = vshCompleteEmpty, .help = N_("message") }, {.name = NULL} @@ -9936,10 +9937,12 @@ static const vshCmdOptDef opts_domsetlaunchsecstate[] = { VIRSH_COMMON_OPT_DOMAIN_FULL(0), {.name = "secrethdr", .type = VSH_OT_STRING, + .completer = vshCompleteEmpty, .help = N_("path to file containing the secret header"), }, {.name = "secret", .type = VSH_OT_STRING, + .completer = vshCompleteEmpty, .help = N_("path to file containing the secret"), }, {.name = "set-address", @@ -10119,6 +10122,7 @@ static const vshCmdOptDef opts_qemu_monitor_command[] = { .type = VSH_OT_ARGV, .positional = true, .required = true, + .completer = vshCompleteEmpty, .help = N_("command") }, {.name = NULL} @@ -10503,6 +10507,7 @@ static const vshCmdOptDef opts_qemu_agent_command[] = { .type = VSH_OT_ARGV, .positional = true, .required = true, + .completer = vshCompleteEmpty, .help = N_("command") }, {.name = NULL} @@ -10590,6 +10595,7 @@ static const vshCmdOptDef opts_lxc_enter_namespace[] = { .type = VSH_OT_ARGV, .positional = true, .required = true, + .completer = vshCompleteEmpty, .help = N_("command to run") }, {.name = NULL} diff --git a/tools/virsh-network.c b/tools/virsh-network.c index 3fd22db2b0..2e9613e01b 100644 --- a/tools/virsh-network.c +++ b/tools/virsh-network.c @@ -325,6 +325,7 @@ static const vshCmdOptDef opts_network_desc[] = { {.name = "new-desc", .type = VSH_OT_ARGV, .positional = true, + .completer = vshCompleteEmpty, .help = N_("message") }, {.name = NULL} -- 2.49.0

From: Peter Krempa <pkrempa@redhat.com> Few arguments were missing the 'vshCompletePathLocalExisting' completer. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tools/virsh-domain.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index f9acedf3db..8d615b6e7a 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -423,6 +423,7 @@ static const vshCmdOptDef opts_attach_disk[] = { .positional = true, .required = true, .allowEmpty = true, + .completer = vshCompletePathLocalExisting, .help = N_("source of disk device or name of network disk") }, {.name = "target", @@ -4931,6 +4932,7 @@ static const vshCmdOptDef opts_save_image_dumpxml[] = { .type = VSH_OT_STRING, .positional = true, .required = true, + .completer = vshCompletePathLocalExisting, .help = N_("saved state file to read") }, {.name = "security-info", @@ -4988,6 +4990,7 @@ static const vshCmdOptDef opts_save_image_define[] = { .type = VSH_OT_STRING, .positional = true, .required = true, + .completer = vshCompletePathLocalExisting, .help = N_("saved state file to modify") }, {.name = "xml", @@ -5053,6 +5056,7 @@ static const vshCmdOptDef opts_save_image_edit[] = { .type = VSH_OT_STRING, .positional = true, .required = true, + .completer = vshCompletePathLocalExisting, .help = N_("saved state file to edit") }, {.name = "running", @@ -5667,6 +5671,7 @@ static const vshCmdOptDef opts_restore[] = { .type = VSH_OT_STRING, .positional = true, .required = true, + .completer = vshCompletePathLocalExisting, .help = N_("the state to restore") }, {.name = "bypass-cache", @@ -13153,6 +13158,7 @@ static const vshCmdOptDef opts_change_media[] = { {.name = "source", .type = VSH_OT_STRING, .positional = true, + .completer = vshCompletePathLocalExisting, .help = N_("source of the media") }, {.name = "eject", -- 2.49.0

On 5/20/25 16:08, Peter Krempa via Devel wrote:
Make the core completer code common in all virt shells and annotate few arguments with the existing empty and local-file completers.
Peter Krempa (4): virsh: completer: Extract common completer methods from virsh to vsh vsh: Apply empty/local completers to global commands virsh: Apply empty completer to arguments where completion doesn't make sense virsh: domain: Annotate rest of arguments taking local existing file
tools/meson.build | 2 +- tools/virsh-backup.c | 6 +- tools/virsh-checkpoint.c | 8 +- tools/virsh-completer-domain.c | 70 ++++++------ tools/virsh-completer-host.c | 12 +- tools/virsh-completer-nodedev.c | 10 +- tools/virsh-completer-pool.c | 6 +- tools/virsh-completer-volume.c | 4 +- tools/virsh-completer.h | 19 +--- tools/virsh-domain.c | 112 ++++++++++--------- tools/virsh-host.c | 6 +- tools/virsh-interface.c | 2 +- tools/virsh-network.c | 9 +- tools/virsh-nodedev.c | 2 +- tools/virsh-nwfilter.c | 4 +- tools/virsh-pool.c | 18 +-- tools/virsh-secret.c | 6 +- tools/virsh-snapshot.c | 8 +- tools/virsh-volume.c | 12 +- tools/virsh.c | 2 +- tools/virsh.h | 2 +- tools/{virsh-completer.c => vsh-completer.c} | 34 +++--- tools/vsh-completer.h | 41 +++++++ tools/vsh.c | 6 + 24 files changed, 222 insertions(+), 179 deletions(-) rename tools/{virsh-completer.c => vsh-completer.c} (85%) create mode 100644 tools/vsh-completer.h
Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Michal
participants (2)
-
Michal Prívozník
-
Peter Krempa