From 1ada2f0c2c533a24a79ba6343f8882fe24063a2b Mon Sep 17 00:00:00 2001 From: Kadin Sayani Date: Tue, 17 Dec 2024 17:01:34 -0700 Subject: [PATCH 1/6] lxc/completion: Fix snapshot shell completions for `lxc storage volume show` Fixes https://github.com/canonical/lxd/issues/14682. This commit fixes shell completions for snapshots when running `lxc storage volume show`. `GetStoragePoolVolumeNames` returns the full volume name including "/snapshots/", which is incorrect in the context of the CLI. Signed-off-by: Kadin Sayani (cherry picked from commit 1bcc8b3f09926010781ac15d08d79c50be815287) --- lxc/completion.go | 10 +++++++++- lxc/storage_volume.go | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lxc/completion.go b/lxc/completion.go index ea34fdef1247..3f7988128f72 100644 --- a/lxc/completion.go +++ b/lxc/completion.go @@ -1634,9 +1634,17 @@ func (g *cmdGlobal) cmpStoragePoolVolumes(poolName string, volumeTypes ...string customVolumeNames := make([]string, 0, customKeyCount) - // Only include custom volumes + // Only complete volumes specified by volumeTypes. for _, volume := range volumes { _, volType := parseVolume("custom", volume) + + // Parse snapshots returned by GetStoragePoolVolumeNames. + volumeName, snapshotName, found := strings.Cut(volume, "/snapshots") + if found { + customVolumeNames = append(customVolumeNames, volumeName+snapshotName) + continue + } + if shared.ValueInSlice(volType, volumeTypes) { customVolumeNames = append(customVolumeNames, volume) } diff --git a/lxc/storage_volume.go b/lxc/storage_volume.go index d4ecac298695..0d6badd2eb04 100644 --- a/lxc/storage_volume.go +++ b/lxc/storage_volume.go @@ -2268,7 +2268,7 @@ lxc storage volume show default virtual-machine/data/snap0 } if len(args) == 1 { - return c.global.cmpStoragePoolVolumes(args[0]) + return c.global.cmpStoragePoolVolumes(args[0], "custom") } return nil, cobra.ShellCompDirectiveNoFileComp From 09780db1d10da49cb0805c378075965c11f8e1ef Mon Sep 17 00:00:00 2001 From: Kadin Sayani Date: Tue, 17 Dec 2024 17:05:01 -0700 Subject: [PATCH 2/6] lxc/storage_volume: Fix `lxc storage volume snapshot` command description The command is `lxc storage volume snapshot ` not `lxc storage volume snapshot create ` Signed-off-by: Kadin Sayani (cherry picked from commit 5a669ef73b018d6fefd8b1d11aa2b8e6456ee408) --- lxc/storage_volume.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lxc/storage_volume.go b/lxc/storage_volume.go index 0d6badd2eb04..7809ac2948bf 100644 --- a/lxc/storage_volume.go +++ b/lxc/storage_volume.go @@ -2427,10 +2427,10 @@ func (c *cmdStorageVolumeSnapshot) command() *cobra.Command { cmd.Short = i18n.G("Snapshot storage volumes") cmd.Long = cli.FormatSection(i18n.G("Description"), i18n.G( `Snapshot storage volumes`)) - cmd.Example = cli.FormatSection("", i18n.G(`lxc storage volume snapshot create default v1 snap0 + cmd.Example = cli.FormatSection("", i18n.G(`lxc storage volume snapshot default v1 snap0 Create a snapshot of "v1" in pool "default" called "snap0". -lxc storage volume snapshot create default v1 snap0 < config.yaml +lxc storage volume snapshot default v1 snap0 < config.yaml Create a snapshot of "v1" in pool "default" called "snap0" with the configuration from "config.yaml".`)) cmd.RunE = c.run From fd45587cb02d2270992f0868d251133cf2c37407 Mon Sep 17 00:00:00 2001 From: Kadin Sayani Date: Wed, 18 Dec 2024 09:27:57 -0700 Subject: [PATCH 3/6] lxc/completion: Pre-allocate slices where possible Signed-off-by: Kadin Sayani (cherry picked from commit b67bf1af4fed0620cf8a21ea2aacf14368b979ec) --- lxc/completion.go | 75 ++++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/lxc/completion.go b/lxc/completion.go index 3f7988128f72..d70348c0cea6 100644 --- a/lxc/completion.go +++ b/lxc/completion.go @@ -14,7 +14,6 @@ import ( // cmpClusterGroupNames provides shell completion for cluster group names. // It takes a partial input string and returns a list of matching names along with a shell completion directive. func (g *cmdGlobal) cmpClusterGroupNames(toComplete string) ([]string, cobra.ShellCompDirective) { - var results []string cmpDirectives := cobra.ShellCompDirectiveNoFileComp resources, _ := g.ParseServers(toComplete) @@ -30,7 +29,7 @@ func (g *cmdGlobal) cmpClusterGroupNames(toComplete string) ([]string, cobra.She return nil, cobra.ShellCompDirectiveError } - results, err = resource.server.GetClusterGroupNames() + results, err := resource.server.GetClusterGroupNames() if err != nil { return nil, cobra.ShellCompDirectiveError } @@ -41,7 +40,6 @@ func (g *cmdGlobal) cmpClusterGroupNames(toComplete string) ([]string, cobra.She // cmpClusterGroups provides shell completion for cluster groups and their remotes. // It takes a partial input string and returns a list of matching cluster groups along with a shell completion directive. func (g *cmdGlobal) cmpClusterGroups(toComplete string) ([]string, cobra.ShellCompDirective) { - var results []string cmpDirectives := cobra.ShellCompDirectiveNoFileComp resources, _ := g.ParseServers(toComplete) @@ -62,6 +60,8 @@ func (g *cmdGlobal) cmpClusterGroups(toComplete string) ([]string, cobra.ShellCo return nil, cobra.ShellCompDirectiveError } + results := make([]string, 0, len(groups)) + for _, group := range groups { var name string @@ -105,7 +105,7 @@ func (g *cmdGlobal) cmpClusterMemberConfigs(memberName string) ([]string, cobra. return nil, cobra.ShellCompDirectiveError } - var results []string + results := make([]string, 0, len(member.Config)) for k := range member.Config { results = append(results, k) } @@ -160,6 +160,7 @@ func (g *cmdGlobal) cmpClusterMembers(toComplete string) ([]string, cobra.ShellC return nil, cobra.ShellCompDirectiveError } + results = make([]string, 0, len(members)) for _, member := range members { var name string @@ -185,7 +186,6 @@ func (g *cmdGlobal) cmpClusterMembers(toComplete string) ([]string, cobra.ShellC // cmpImages provides shell completion for image aliases. // It takes a partial input string and returns a list of matching image aliases along with a shell completion directive. func (g *cmdGlobal) cmpImages(toComplete string) ([]string, cobra.ShellCompDirective) { - var results []string var remote string cmpDirectives := cobra.ShellCompDirectiveNoFileComp @@ -199,6 +199,7 @@ func (g *cmdGlobal) cmpImages(toComplete string) ([]string, cobra.ShellCompDirec images, _ := remoteServer.GetImages() + results := make([]string, 0, len(images)) for _, image := range images { for _, alias := range image.Aliases { var name string @@ -510,7 +511,7 @@ func (g *cmdGlobal) cmpInstanceDeviceNames(instanceName string) ([]string, cobra return nil, cobra.ShellCompDirectiveError } - var results []string + results := make([]string, 0, len(instanceNameOnly.Devices)) for k := range instanceNameOnly.Devices { results = append(results, k) } @@ -593,6 +594,7 @@ func (g *cmdGlobal) cmpInstances(toComplete string) ([]string, cobra.ShellCompDi instances, _ := resource.server.GetInstanceNames("") + results = make([]string, 0, len(instances)) for _, instance := range instances { var name string @@ -652,6 +654,7 @@ func (g *cmdGlobal) cmpInstancesAction(toComplete string, action string, flagFor instances, _ := resource.server.GetInstances("") + results = make([]string, 0, len(instances)) for _, instance := range instances { var name string @@ -721,20 +724,19 @@ func (g *cmdGlobal) cmpInstancesAndSnapshots(toComplete string) ([]string, cobra // cmpInstanceNamesFromRemote provides shell completion for instances for a specific remote. // It takes a partial input string and returns a list of matching instances along with a shell completion directive. func (g *cmdGlobal) cmpInstanceNamesFromRemote(toComplete string) ([]string, cobra.ShellCompDirective) { - var results []string - resources, _ := g.ParseServers(toComplete) if len(resources) > 0 { resource := resources[0] containers, _ := resource.server.GetInstanceNames("container") - results = append(results, containers...) vms, _ := resource.server.GetInstanceNames("virtual-machine") - results = append(results, vms...) + results := append(containers, vms...) + + return results, cobra.ShellCompDirectiveNoFileComp } - return results, cobra.ShellCompDirectiveNoFileComp + return nil, cobra.ShellCompDirectiveNoFileComp } // cmpNetworkACLConfigs provides shell completion for network ACL configs. @@ -754,7 +756,7 @@ func (g *cmdGlobal) cmpNetworkACLConfigs(aclName string) ([]string, cobra.ShellC return nil, cobra.ShellCompDirectiveError } - var results []string + results := make([]string, 0, len(acl.Config)) for k := range acl.Config { results = append(results, k) } @@ -765,7 +767,6 @@ func (g *cmdGlobal) cmpNetworkACLConfigs(aclName string) ([]string, cobra.ShellC // cmpNetworkACLs provides shell completion for network ACL's. // It takes a partial input string and returns a list of matching network ACL's along with a shell completion directive. func (g *cmdGlobal) cmpNetworkACLs(toComplete string) ([]string, cobra.ShellCompDirective) { - var results []string cmpDirectives := cobra.ShellCompDirectiveNoFileComp resources, _ := g.ParseServers(toComplete) @@ -781,6 +782,7 @@ func (g *cmdGlobal) cmpNetworkACLs(toComplete string) ([]string, cobra.ShellComp return nil, cobra.ShellCompDirectiveError } + results := make([]string, 0, len(acls)) for _, acl := range acls { var name string @@ -805,9 +807,8 @@ func (g *cmdGlobal) cmpNetworkACLs(toComplete string) ([]string, cobra.ShellComp // cmpNetworkACLRuleProperties provides shell completion for network ACL rule properties. // It returns a list of network ACL rules provided by `networkACLRuleJSONStructFieldMap()“ along with a shell completion directive. func (g *cmdGlobal) cmpNetworkACLRuleProperties() ([]string, cobra.ShellCompDirective) { - var results []string - allowedKeys := networkACLRuleJSONStructFieldMap() + results := make([]string, 0, len(allowedKeys)) for key := range allowedKeys { results = append(results, key+"=") } @@ -832,7 +833,7 @@ func (g *cmdGlobal) cmpNetworkForwardConfigs(networkName string, listenAddress s return nil, cobra.ShellCompDirectiveError } - var results []string + results := make([]string, 0, len(forward.Config)) for k := range forward.Config { results = append(results, k) } @@ -843,7 +844,6 @@ func (g *cmdGlobal) cmpNetworkForwardConfigs(networkName string, listenAddress s // cmpNetworkForwards provides shell completion for network forwards. // It takes a network name and returns a list of network forwards along with a shell completion directive. func (g *cmdGlobal) cmpNetworkForwards(networkName string) ([]string, cobra.ShellCompDirective) { - var results []string cmpDirectives := cobra.ShellCompDirectiveNoFileComp resources, _ := g.ParseServers(networkName) @@ -865,7 +865,6 @@ func (g *cmdGlobal) cmpNetworkForwards(networkName string) ([]string, cobra.Shel // cmpNetworkLoadBalancers provides shell completion for network load balancers. // It takes a network name and returns a list of network load balancers along with a shell completion directive. func (g *cmdGlobal) cmpNetworkLoadBalancers(networkName string) ([]string, cobra.ShellCompDirective) { - var results []string cmpDirectives := cobra.ShellCompDirectiveNoFileComp resources, _ := g.ParseServers(networkName) @@ -887,7 +886,6 @@ func (g *cmdGlobal) cmpNetworkLoadBalancers(networkName string) ([]string, cobra // cmpNetworkPeerConfigs provides shell completion for network peer configs. // It takes a network name and peer name, and returns a list of network peer configs along with a shell completion directive. func (g *cmdGlobal) cmpNetworkPeerConfigs(networkName string, peerName string) ([]string, cobra.ShellCompDirective) { - var results []string cmpDirectives := cobra.ShellCompDirectiveNoFileComp resources, _ := g.ParseServers(networkName) @@ -903,6 +901,7 @@ func (g *cmdGlobal) cmpNetworkPeerConfigs(networkName string, peerName string) ( return nil, cobra.ShellCompDirectiveError } + results := make([]string, 0, len(peer.Config)) for k := range peer.Config { results = append(results, k) } @@ -913,7 +912,6 @@ func (g *cmdGlobal) cmpNetworkPeerConfigs(networkName string, peerName string) ( // cmpNetworkPeers provides shell completion for network peers. // It takes a network name and returns a list of network peers along with a shell completion directive. func (g *cmdGlobal) cmpNetworkPeers(networkName string) ([]string, cobra.ShellCompDirective) { - var results []string cmpDirectives := cobra.ShellCompDirectiveNoFileComp resources, _ := g.ParseServers(networkName) @@ -948,6 +946,7 @@ func (g *cmdGlobal) cmpNetworks(toComplete string) ([]string, cobra.ShellCompDir return nil, cobra.ShellCompDirectiveError } + results = make([]string, 0, len(networks)) for _, network := range networks { var name string @@ -987,7 +986,7 @@ func (g *cmdGlobal) cmpNetworkConfigs(networkName string) ([]string, cobra.Shell return nil, cobra.ShellCompDirectiveError } - var results []string + results := make([]string, 0, len(network.Config)) for k := range network.Config { results = append(results, k) } @@ -1012,7 +1011,7 @@ func (g *cmdGlobal) cmpNetworkInstances(networkName string) ([]string, cobra.She return nil, cobra.ShellCompDirectiveError } - var results []string + results := make([]string, 0, len(network.UsedBy)) for _, i := range network.UsedBy { r := regexp.MustCompile(`/1.0/instances/(.*)`) match := r.FindStringSubmatch(i) @@ -1042,7 +1041,7 @@ func (g *cmdGlobal) cmpNetworkProfiles(networkName string) ([]string, cobra.Shel return nil, cobra.ShellCompDirectiveError } - var results []string + results := make([]string, 0, len(network.UsedBy)) for _, i := range network.UsedBy { r := regexp.MustCompile(`/1.0/profiles/(.*)`) match := r.FindStringSubmatch(i) @@ -1072,7 +1071,7 @@ func (g *cmdGlobal) cmpNetworkZoneConfigs(zoneName string) ([]string, cobra.Shel return nil, cobra.ShellCompDirectiveError } - var results []string + results := make([]string, 0, len(zone.Config)) for k := range zone.Config { results = append(results, k) } @@ -1083,7 +1082,6 @@ func (g *cmdGlobal) cmpNetworkZoneConfigs(zoneName string) ([]string, cobra.Shel // cmpNetworkZoneRecordConfigs provides shell completion for network zone record configs. // It takes a zone name and record name, and returns a list of network zone record configs along with a shell completion directive. func (g *cmdGlobal) cmpNetworkZoneRecordConfigs(zoneName string, recordName string) ([]string, cobra.ShellCompDirective) { - var results []string cmpDirectives := cobra.ShellCompDirectiveNoFileComp resources, _ := g.ParseServers(zoneName) @@ -1099,6 +1097,7 @@ func (g *cmdGlobal) cmpNetworkZoneRecordConfigs(zoneName string, recordName stri return nil, cobra.ShellCompDirectiveError } + results := make([]string, 0, len(peer.Config)) for k := range peer.Config { results = append(results, k) } @@ -1109,7 +1108,6 @@ func (g *cmdGlobal) cmpNetworkZoneRecordConfigs(zoneName string, recordName stri // cmpNetworkZoneRecords provides shell completion for network zone records. // It takes a zone name and returns a list of network zone records along with a shell completion directive. func (g *cmdGlobal) cmpNetworkZoneRecords(zoneName string) ([]string, cobra.ShellCompDirective) { - var results []string cmpDirectives := cobra.ShellCompDirectiveNoFileComp resources, _ := g.ParseServers(zoneName) @@ -1144,6 +1142,7 @@ func (g *cmdGlobal) cmpNetworkZones(toComplete string) ([]string, cobra.ShellCom return nil, cobra.ShellCompDirectiveError } + results = make([]string, 0, len(zones)) for _, project := range zones { var name string @@ -1182,7 +1181,7 @@ func (g *cmdGlobal) cmpProfileConfigs(profileName string) ([]string, cobra.Shell return nil, cobra.ShellCompDirectiveError } - var configs []string + configs := make([]string, 0, len(profile.Config)) for c := range profile.Config { configs = append(configs, c) } @@ -1207,7 +1206,7 @@ func (g *cmdGlobal) cmpProfileDeviceNames(instanceName string) ([]string, cobra. return nil, cobra.ShellCompDirectiveError } - var results []string + results := make([]string, 0, len(profile.Devices)) for k := range profile.Devices { results = append(results, k) } @@ -1225,8 +1224,7 @@ func (g *cmdGlobal) cmpProfileNamesFromRemote(toComplete string) ([]string, cobr if len(resources) > 0 { resource := resources[0] - profiles, _ := resource.server.GetProfileNames() - results = append(results, profiles...) + results, _ = resource.server.GetProfileNames() } return results, cobra.ShellCompDirectiveNoFileComp @@ -1245,6 +1243,7 @@ func (g *cmdGlobal) cmpProfiles(toComplete string, includeRemotes bool) ([]strin profiles, _ := resource.server.GetProfileNames() + results = make([]string, 0, len(profiles)) for _, profile := range profiles { var name string @@ -1283,7 +1282,7 @@ func (g *cmdGlobal) cmpProjectConfigs(projectName string) ([]string, cobra.Shell return nil, cobra.ShellCompDirectiveError } - var configs []string + configs := make([]string, 0, len(project.Config)) for c := range project.Config { configs = append(configs, c) } @@ -1307,6 +1306,7 @@ func (g *cmdGlobal) cmpProjects(toComplete string) ([]string, cobra.ShellCompDir return nil, cobra.ShellCompDirectiveError } + results = make([]string, 0, len(projects)) for _, project := range projects { var name string @@ -1381,7 +1381,7 @@ func (g *cmdGlobal) cmpStoragePoolConfigs(poolName string) ([]string, cobra.Shel return nil, cobra.ShellCompDirectiveError } - var results []string + results := make([]string, 0, len(pool.Config)) for k := range pool.Config { results = append(results, k) } @@ -1398,7 +1398,7 @@ func (g *cmdGlobal) cmpStoragePoolWithVolume(toComplete string) ([]string, cobra return nil, compdir } - var results []string + results := make([]string, 0, len(pools)) for _, pool := range pools { if strings.HasSuffix(pool, ":") { results = append(results, pool) @@ -1416,7 +1416,7 @@ func (g *cmdGlobal) cmpStoragePoolWithVolume(toComplete string) ([]string, cobra return nil, compdir } - var results []string + results := make([]string, 0, len(volumes)) for _, volume := range volumes { volName, _ := parseVolume("custom", volume) results = append(results, pool+"/"+volName) @@ -1437,6 +1437,7 @@ func (g *cmdGlobal) cmpStoragePools(toComplete string, noSpace bool) ([]string, storagePools, _ := resource.server.GetStoragePoolNames() + results = make([]string, 0, len(storagePools)) for _, storage := range storagePools { var name string @@ -1486,7 +1487,7 @@ func (g *cmdGlobal) cmpStoragePoolVolumeConfigs(poolName string, volumeName stri return nil, cobra.ShellCompDirectiveError } - var results []string + results := make([]string, 0, len(volume.Config)) for k := range volume.Config { results = append(results, k) } @@ -1518,7 +1519,7 @@ func (g *cmdGlobal) cmpStoragePoolVolumeInstances(poolName string, volumeName st return nil, cobra.ShellCompDirectiveError } - var results []string + results := make([]string, 0, len(volume.UsedBy)) for _, i := range volume.UsedBy { r := regexp.MustCompile(`/1.0/instances/(.*)`) match := r.FindStringSubmatch(i) @@ -1555,7 +1556,7 @@ func (g *cmdGlobal) cmpStoragePoolVolumeProfiles(poolName string, volumeName str return nil, cobra.ShellCompDirectiveError } - var results []string + results := make([]string, 0, len(volume.UsedBy)) for _, i := range volume.UsedBy { r := regexp.MustCompile(`/1.0/profiles/(.*)`) match := r.FindStringSubmatch(i) From fa7320fec03896586f7522b00206a92d16f941c8 Mon Sep 17 00:00:00 2001 From: Kadin Sayani Date: Thu, 19 Dec 2024 12:23:35 -0700 Subject: [PATCH 4/6] lxc/completion: Fix `cmpInstanceSetKeys` to return set instance config keys This commit fixes `cmpInstanceSetKeys` to return any set instance configuration key rather than just keys with known prefixes. We don't need to validate type here since a VM specific config key cannot be set for a container, and vice-versa, and we only return config keys that show up in an instance's full config. Signed-off-by: Kadin Sayani (cherry picked from commit 4307f76a10d83d5e67d8be7161d35e9808b2d354) --- lxc/completion.go | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/lxc/completion.go b/lxc/completion.go index d70348c0cea6..c568dce8dac2 100644 --- a/lxc/completion.go +++ b/lxc/completion.go @@ -6,7 +6,6 @@ import ( "github.com/spf13/cobra" - "github.com/canonical/lxd/lxd/instance/instancetype" "github.com/canonical/lxd/shared" "github.com/canonical/lxd/shared/api" ) @@ -359,30 +358,13 @@ func (g *cmdGlobal) cmpInstanceSetKeys(instanceName string) ([]string, cobra.She return nil, cobra.ShellCompDirectiveError } - instanceType := instance.Type - - // Fetch all config keys that can be set by a user based on instance type. - allInstanceConfigKeys, _ := g.cmpInstanceKeys(instanceName) - - // Convert slice to map[string]struct{} for O(1) lookups. - keySet := make(map[string]struct{}, len(allInstanceConfigKeys)) - for _, key := range allInstanceConfigKeys { - keySet[key] = struct{}{} - } - // Pre-allocate configKeys slice capacity. keyCount := len(instance.Config) configKeys := make([]string, 0, keyCount) for configKey := range instance.Config { - // We only want to return the intersection between allInstanceConfigKeys and configKeys to avoid returning the full instance config. - _, exists := keySet[configKey] - if exists { - if shared.StringHasPrefix(configKey, instancetype.ConfigKeyPrefixesAny...) { - configKeys = append(configKeys, configKey) - } else if instanceType == string(api.InstanceTypeContainer) && shared.StringHasPrefix(configKey, instancetype.ConfigKeyPrefixesContainer...) { - configKeys = append(configKeys, configKey) - } + if !shared.StringHasPrefix(configKey, []string{"volatile", "image"}...) { + configKeys = append(configKeys, configKey) } } From 68e10595aa4028a567ffeae7d3344498eae84b94 Mon Sep 17 00:00:00 2001 From: Kadin Sayani Date: Thu, 19 Dec 2024 16:04:57 -0700 Subject: [PATCH 5/6] i18n: Update translation templates. Signed-off-by: Kadin Sayani --- po/lxd.pot | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/po/lxd.pot b/po/lxd.pot index 888e362843c7..7dd89c4ac4dd 100644 --- a/po/lxd.pot +++ b/po/lxd.pot @@ -7,7 +7,7 @@ msgid "" msgstr "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxd@lists.canonical.com\n" - "POT-Creation-Date: 2024-12-18 08:40-0700\n" + "POT-Creation-Date: 2024-12-19 16:04-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -7096,10 +7096,10 @@ msgid "lxc storage volume import default backup0.tar.gz\n" msgstr "" #: lxc/storage_volume.go:2430 -msgid "lxc storage volume snapshot create default v1 snap0\n" +msgid "lxc storage volume snapshot default v1 snap0\n" " Create a snapshot of \"v1\" in pool \"default\" called \"snap0\".\n" "\n" - "lxc storage volume snapshot create default v1 snap0 < config.yaml\n" + "lxc storage volume snapshot default v1 snap0 < config.yaml\n" " Create a snapshot of \"v1\" in pool \"default\" called \"snap0\" with the configuration from \"config.yaml\"." msgstr "" From dbc4c864bbedfb820a3ecdf7247e7f7e48d577d9 Mon Sep 17 00:00:00 2001 From: Kadin Sayani Date: Thu, 19 Dec 2024 16:04:59 -0700 Subject: [PATCH 6/6] i18n: Update translations. Signed-off-by: Kadin Sayani --- po/ar.po | 6 +++--- po/ber.po | 6 +++--- po/bg.po | 6 +++--- po/ca.po | 6 +++--- po/cs.po | 6 +++--- po/de.po | 6 +++--- po/el.po | 6 +++--- po/eo.po | 6 +++--- po/es.po | 6 +++--- po/fa.po | 6 +++--- po/fi.po | 6 +++--- po/fr.po | 6 +++--- po/he.po | 6 +++--- po/hi.po | 6 +++--- po/id.po | 6 +++--- po/it.po | 6 +++--- po/ja.po | 11 ++++++++--- po/ka.po | 6 +++--- po/ko.po | 6 +++--- po/mr.po | 6 +++--- po/nb_NO.po | 6 +++--- po/nl.po | 6 +++--- po/pa.po | 6 +++--- po/pl.po | 6 +++--- po/pt.po | 6 +++--- po/pt_BR.po | 6 +++--- po/ru.po | 6 +++--- po/si.po | 6 +++--- po/sl.po | 6 +++--- po/sr.po | 6 +++--- po/sv.po | 6 +++--- po/te.po | 6 +++--- po/th.po | 6 +++--- po/tr.po | 6 +++--- po/tzm.po | 6 +++--- po/ug.po | 6 +++--- po/uk.po | 6 +++--- po/zh_Hans.po | 6 +++--- po/zh_Hant.po | 6 +++--- 39 files changed, 122 insertions(+), 117 deletions(-) diff --git a/po/ar.po b/po/ar.po index b2e96e81c1c5..aebb18baa53e 100644 --- a/po/ar.po +++ b/po/ar.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxd@lists.canonical.com\n" -"POT-Creation-Date: 2024-12-18 08:40-0700\n" +"POT-Creation-Date: 2024-12-19 16:04-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -7668,10 +7668,10 @@ msgstr "" #: lxc/storage_volume.go:2430 msgid "" -"lxc storage volume snapshot create default v1 snap0\n" +"lxc storage volume snapshot default v1 snap0\n" " Create a snapshot of \"v1\" in pool \"default\" called \"snap0\".\n" "\n" -"lxc storage volume snapshot create default v1 snap0 < config.yaml\n" +"lxc storage volume snapshot default v1 snap0 < config.yaml\n" " Create a snapshot of \"v1\" in pool \"default\" called \"snap0\" with " "the configuration from \"config.yaml\"." msgstr "" diff --git a/po/ber.po b/po/ber.po index 91e588722cc0..37f5d414b867 100644 --- a/po/ber.po +++ b/po/ber.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxd@lists.canonical.com\n" -"POT-Creation-Date: 2024-12-18 08:40-0700\n" +"POT-Creation-Date: 2024-12-19 16:04-0700\n" "PO-Revision-Date: 2022-03-10 15:10+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Berber \n" "Language-Team: Bulgarian \n" "Language-Team: Catalan \n" "Language-Team: Czech \n" "Language-Team: German \n" "Language-Team: Greek \n" "Language-Team: Esperanto \n" "Language-Team: Spanish \n" "Language-Team: Persian \n" "Language-Team: Finnish \n" "Language-Team: French \n" "Language-Team: Hebrew \n" "Language-Team: Hindi \n" "Language-Team: Indonesian \n" "Language-Team: Italian \n" "Language-Team: Japanese \n" "Language-Team: Korean \n" "Language-Team: Marathi \n" "Language-Team: Norwegian Bokmål \n" "Language-Team: Dutch \n" "Language-Team: Punjabi \n" "Language-Team: Polish \n" "Language-Team: Portuguese (Brazil) \n" "Language-Team: Russian \n" "Language-Team: Sinhala \n" "Language-Team: Slovenian \n" "Language-Team: Serbian \n" "Language-Team: Swedish \n" "Language-Team: Telugu \n" "Language-Team: Turkish \n" "Language-Team: Tamazight (Central Atlas) \n" "Language-Team: Uyghur \n" "Language-Team: Ukrainian \n" "Language-Team: Chinese (Simplified) \n" "Language-Team: Chinese (Traditional)