Skip to content

Commit 64c3507

Browse files
Fix incorrectly wrapped strings by localization routines (#414)
This commit fixes #413. Additionally, nonf variants of functions in output pkg have been added so that string returned by localization routine is printed as is and no further format specifier substitution can take place.
1 parent eb1d36a commit 64c3507

31 files changed

+1370
-786
lines changed

cmd/modern/root/config/add-context.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func (c *AddContext) run() {
6969
}
7070

7171
if c.endpointName == "" || !config.EndpointExists(c.endpointName) {
72-
output.FatalfWithHintExamples([][]string{
72+
output.FatalWithHintExamples([][]string{
7373
{localizer.Sprintf("View existing endpoints to choose from"), "sqlcmd config get-endpoints"},
7474
{localizer.Sprintf("Add a new local endpoint"), "sqlcmd create"},
7575
{localizer.Sprintf("Add an already existing endpoint"), "sqlcmd config add-endpoint --address localhost --port 1433"}},
@@ -78,7 +78,7 @@ func (c *AddContext) run() {
7878

7979
if c.userName != "" {
8080
if !config.UserNameExists(c.userName) {
81-
output.FatalfWithHintExamples([][]string{
81+
output.FatalWithHintExamples([][]string{
8282
{localizer.Sprintf("View list of users"), "sqlcmd config get-users"},
8383
{localizer.Sprintf("Add the user"), fmt.Sprintf("sqlcmd config add-user --name %v", c.userName)},
8484
{localizer.Sprintf("Add an endpoint"), "sqlcmd create"}},
@@ -88,7 +88,7 @@ func (c *AddContext) run() {
8888

8989
context.Name = config.AddContext(context)
9090
config.SetCurrentContextName(context.Name)
91-
output.InfofWithHintExamples([][]string{
91+
output.InfoWithHintExamples([][]string{
9292
{localizer.Sprintf("Open in Azure Data Studio"), "sqlcmd open ads"},
9393
{localizer.Sprintf("To start interactive query session"), "sqlcmd query"},
9494
{localizer.Sprintf("To run a query"), "sqlcmd query \"SELECT @@version\""},

cmd/modern/root/config/add-endpoint.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func (c *AddEndpoint) run() {
7474
}
7575

7676
uniqueEndpointName := config.AddEndpoint(endpoint)
77-
output.InfofWithHintExamples([][]string{
77+
output.InfoWithHintExamples([][]string{
7878
{localizer.Sprintf("Add a context for this endpoint"), fmt.Sprintf("sqlcmd config add-context --endpoint %v", uniqueEndpointName)},
7979
{localizer.Sprintf("View endpoint names"), "sqlcmd config get-endpoints"},
8080
{localizer.Sprintf("View endpoint details"), fmt.Sprintf("sqlcmd config get-endpoints %v", uniqueEndpointName)},

cmd/modern/root/config/add-user.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func (c *AddUser) run() {
106106

107107
if c.authType != "basic" &&
108108
c.authType != "other" {
109-
output.FatalfWithHints([]string{localizer.Sprintf("Authentication type must be '%s' or '%s'", localizer.ModernAuthTypeBasic, localizer.ModernAuthTypeOther)},
109+
output.FatalWithHints([]string{localizer.Sprintf("Authentication type must be '%s' or '%s'", localizer.ModernAuthTypeBasic, localizer.ModernAuthTypeOther)},
110110
localizer.Sprintf("Authentication type '' is not valid %v'", c.authType))
111111
}
112112

@@ -136,15 +136,15 @@ func (c *AddUser) run() {
136136
}
137137

138138
if c.username == "" {
139-
output.FatalfWithHintExamples([][]string{
139+
output.FatalWithHintExamples([][]string{
140140
{localizer.Sprintf("Provide a username with the %s flag"),
141141
"sqlcmd config add-user --username sa"},
142142
},
143143
localizer.Sprintf("Username not provided"))
144144
}
145145

146146
if !secret.IsValidEncryptionMethod(c.passwordEncryption) {
147-
output.FatalfWithHints([]string{
147+
output.FatalWithHints([]string{
148148
localizer.Sprintf("Provide a valid encryption method (%s) with the %s flag", secret.EncryptionMethodsForUsage(), localizer.PasswordEncryptFlag)},
149149
localizer.Sprintf("Encryption method '%v' is not valid", c.passwordEncryption))
150150
}
@@ -168,5 +168,5 @@ func (c *AddUser) run() {
168168
}
169169

170170
uniqueUserName := config.AddUser(user)
171-
output.Infof(localizer.Sprintf("User '%v' added", uniqueUserName))
171+
output.Info(localizer.Sprintf("User '%v' added", uniqueUserName))
172172
}

cmd/modern/root/config/connection-strings.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func (c *ConnectionStrings) run() {
120120
output.Infof("%-8s %s", k+":", v)
121121
}
122122
} else {
123-
output.Infof(localizer.Sprintf("Connection Strings only supported for %s Auth type", localizer.ModernAuthTypeBasic))
123+
output.Info(localizer.Sprintf("Connection Strings only supported for %s Auth type", localizer.ModernAuthTypeBasic))
124124
}
125125
}
126126

cmd/modern/root/config/delete-context.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ func (c *DeleteContext) run() {
7878

7979
config.DeleteContext(c.name)
8080

81-
output.Infof(localizer.Sprintf("Context '%v' deleted", c.name))
81+
output.Info(localizer.Sprintf("Context '%v' deleted", c.name))
8282
} else {
83-
output.FatalfWithHintExamples([][]string{
83+
output.FatalWithHintExamples([][]string{
8484
{localizer.Sprintf("View available contexts"), "sqlcmd config get-contexts"},
8585
},
8686
localizer.Sprintf("Context '%v' does not exist", c.name))

cmd/modern/root/config/delete-endpoint.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,11 @@ func (c *DeleteEndpoint) run() {
5454
if config.EndpointExists(c.name) {
5555
config.DeleteEndpoint(c.name)
5656
} else {
57-
output.FatalfWithHintExamples([][]string{
57+
output.FatalWithHintExamples([][]string{
5858
{localizer.Sprintf("View endpoints"), "sqlcmd config get-endpoints"},
5959
},
6060
localizer.Sprintf("Endpoint '%v' does not exist", c.name))
6161
}
6262

63-
output.Infof(localizer.Sprintf("Endpoint '%v' deleted", c.name))
63+
output.Info(localizer.Sprintf("Endpoint '%v' deleted", c.name))
6464
}

cmd/modern/root/config/delete-user.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ func (c *DeleteUser) run() {
5151
if config.UserNameExists(c.name) {
5252
config.DeleteUser(c.name)
5353
} else {
54-
output.FatalfWithHintExamples([][]string{
54+
output.FatalWithHintExamples([][]string{
5555
{localizer.Sprintf("View users"), "sqlcmd config get-users"},
5656
},
5757
localizer.Sprintf("User %q does not exist", c.name))
5858
}
5959

60-
output.Infof(localizer.Sprintf("User %q deleted", c.name))
60+
output.Info(localizer.Sprintf("User %q deleted", c.name))
6161
}

cmd/modern/root/config/get-contexts.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func (c *GetContexts) run() {
6161
context := config.GetContext(c.name)
6262
output.Struct(context)
6363
} else {
64-
output.FatalfWithHints(
64+
output.FatalWithHints(
6565
[]string{localizer.Sprintf("To view available contexts run `%s`", localizer.GetContextCommand)},
6666
localizer.Sprintf("error: no context exists with the name: \"%v\"", c.name))
6767
}

cmd/modern/root/config/get-endpoints.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func (c *GetEndpoints) run() {
5757
context := config.GetEndpoint(c.name)
5858
output.Struct(context)
5959
} else {
60-
output.FatalfWithHints(
60+
output.FatalWithHints(
6161
[]string{localizer.Sprintf("To view available endpoints run `%s`", localizer.GetEndpointsCommand)},
6262
localizer.Sprintf("error: no endpoint exists with the name: \"%v\"", c.name))
6363
}

cmd/modern/root/config/get-users.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func (c *GetUsers) run() {
6161
user := config.GetUser(c.name)
6262
output.Struct(user)
6363
} else {
64-
output.FatalfWithHints(
64+
output.FatalWithHints(
6565
[]string{localizer.Sprintf("To view available users run `%s`", localizer.GetUsersCommand)},
6666
localizer.Sprintf("error: no user exists with the name: \"%v\"", c.name))
6767
}

cmd/modern/root/config/use-context.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ func (c *UseContext) run() {
4242

4343
if config.ContextExists(c.name) {
4444
config.SetCurrentContextName(c.name)
45-
output.InfofWithHints([]string{
45+
output.InfoWithHints([]string{
4646
localizer.Sprintf("To run a query: %s", localizer.RunQueryExample),
4747
localizer.Sprintf("To remove: %s", localizer.UninstallCommand)},
4848
localizer.Sprintf("Switched to context \"%v\".", c.name))
4949
} else {
50-
output.FatalfWithHints([]string{localizer.Sprintf("To view available contexts run `%s`", localizer.GetContextCommand)},
50+
output.FatalWithHints([]string{localizer.Sprintf("To view available contexts run `%s`", localizer.GetContextCommand)},
5151
localizer.Sprintf("No context exists with the name: \"%v\"", c.name))
5252
}
5353
}

cmd/modern/root/install/mssql-base.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ func (c *MssqlBase) createContainer(imageName string, contextName string) {
290290
c.downloadImage(imageName, output, controller)
291291
}
292292

293-
output.Infof(localizer.Sprintf("Starting %v", imageName))
293+
output.Info(localizer.Sprintf("Starting %v", imageName))
294294
containerId := controller.ContainerRun(
295295
imageName,
296296
env,
@@ -319,15 +319,15 @@ func (c *MssqlBase) createContainer(imageName string, contextName string) {
319319
c.passwordEncryption,
320320
)
321321

322-
output.Infof(
322+
output.Info(
323323
localizer.Sprintf("Created context %q in \"%s\", configuring user account...",
324324
config.CurrentContextName(),
325325
config.GetConfigFileUsed()))
326326

327327
controller.ContainerWaitForLogEntry(
328328
containerId, c.errorLogEntryToWaitFor)
329329

330-
output.Infof(
330+
output.Info(
331331
localizer.Sprintf("Disabled %q account (and rotated %q password). Creating user %q",
332332
"sa",
333333
"sa",
@@ -390,7 +390,7 @@ func (c *MssqlBase) createContainer(imageName string, contextName string) {
390390
hints = append(hints, []string{localizer.Sprintf("See connection strings"), "sqlcmd config connection-strings"})
391391
hints = append(hints, []string{localizer.Sprintf("Remove"), "sqlcmd delete"})
392392

393-
output.InfofWithHintExamples(hints,
393+
output.InfoWithHintExamples(hints,
394394
localizer.Sprintf("Now ready for client connections on port %d",
395395
c.port),
396396
)
@@ -403,15 +403,15 @@ func (c *MssqlBase) validateUsingUrlExists() {
403403
c.CheckErr(err)
404404

405405
if u.Scheme != "http" && u.Scheme != "https" {
406-
output.FatalfWithHints(
406+
output.FatalWithHints(
407407
[]string{
408408
localizer.Sprintf("--using URL must be http or https"),
409409
},
410410
localizer.Sprintf("%q is not a valid URL for --using flag", c.usingDatabaseUrl))
411411
}
412412

413413
if u.Path == "" {
414-
output.FatalfWithHints(
414+
output.FatalWithHints(
415415
[]string{
416416
localizer.Sprintf("--using URL must have a path to .bak file"),
417417
},
@@ -421,7 +421,7 @@ func (c *MssqlBase) validateUsingUrlExists() {
421421
// At the moment we only support attaching .bak files, but we should
422422
// support .bacpacs and .mdfs in the future
423423
if _, file := filepath.Split(u.Path); filepath.Ext(file) != ".bak" {
424-
output.FatalfWithHints(
424+
output.FatalWithHints(
425425
[]string{
426426
localizer.Sprintf("--using file URL must be a .bak file"),
427427
},
@@ -452,7 +452,7 @@ func (c *MssqlBase) createNonSaUser(
452452
defaultDatabase = c.defaultDatabase
453453

454454
// Create the default database, if it isn't a downloaded database
455-
output.Infof(localizer.Sprintf("Creating default database [%s]", defaultDatabase))
455+
output.Info(localizer.Sprintf("Creating default database [%s]", defaultDatabase))
456456
c.query(fmt.Sprintf("CREATE DATABASE [%s]", defaultDatabase))
457457
}
458458

@@ -532,7 +532,7 @@ func (c *MssqlBase) downloadAndRestoreDb(
532532
_, file := filepath.Split(databaseUrl)
533533

534534
// Download file from URL into container
535-
output.Infof(localizer.Sprintf("Downloading %s", file))
535+
output.Info(localizer.Sprintf("Downloading %s", file))
536536

537537
temporaryFolder := "/var/opt/mssql/backup"
538538

@@ -543,7 +543,7 @@ func (c *MssqlBase) downloadAndRestoreDb(
543543
)
544544

545545
// Restore database from file
546-
output.Infof(localizer.Sprintf("Restoring database %s", databaseName))
546+
output.Info(localizer.Sprintf("Restoring database %s", databaseName))
547547

548548
dbNameAsIdentifier := getDbNameAsIdentifier(databaseName)
549549
dbNameAsNonIdentifier := getDbNameAsNonIdentifier(databaseName)
@@ -603,10 +603,10 @@ func (c *MssqlBase) downloadImage(
603603
output *output.Output,
604604
controller *container.Controller,
605605
) {
606-
output.Infof(localizer.Sprintf("Downloading %v", imageName))
606+
output.Info(localizer.Sprintf("Downloading %v", imageName))
607607
err := controller.EnsureImage(imageName)
608608
if err != nil || c.unitTesting {
609-
output.FatalfErrorWithHints(
609+
output.FatalErrorWithHints(
610610
err,
611611
[]string{
612612
localizer.Sprintf("Is a container runtime installed on this machine (e.g. Podman or Docker)?") + pal.LineBreak() +
@@ -615,7 +615,7 @@ func (c *MssqlBase) downloadImage(
615615
localizer.Sprintf("\t\tor") + pal.LineBreak() +
616616
"\t\thttps://docs.docker.com/get-docker/",
617617
localizer.Sprintf("Is a container runtime running? (Try `%s` or `%s` (list containers), does it return without error?)", localizer.PodmanPsCommand, localizer.DockerPsCommand),
618-
fmt.Sprintf("If `podman ps` or `docker ps` works, try downloading the image with:"+pal.LineBreak()+
618+
localizer.Sprintf("If `podman ps` or `docker ps` works, try downloading the image with:"+pal.LineBreak()+
619619
"\t`podman|docker pull %s`", imageName)},
620620
localizer.Sprintf("Unable to download image %s", imageName))
621621
}
@@ -624,7 +624,7 @@ func (c *MssqlBase) downloadImage(
624624
// Verify the file exists at the URL
625625
func urlExists(url string, output *output.Output) {
626626
if !http.UrlExists(url) {
627-
output.FatalfWithHints(
627+
output.FatalWithHints(
628628
[]string{localizer.Sprintf("File does not exist at URL")},
629629
localizer.Sprintf("Unable to download file"))
630630
}

cmd/modern/root/open/ads.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/microsoft/go-sqlcmd/internal/cmdparser"
1313
"github.com/microsoft/go-sqlcmd/internal/config"
1414
"github.com/microsoft/go-sqlcmd/internal/container"
15+
"github.com/microsoft/go-sqlcmd/internal/localizer"
1516
"github.com/microsoft/go-sqlcmd/internal/tools"
1617
)
1718

@@ -57,9 +58,9 @@ func (c *Ads) ensureContainerIsRunning(endpoint sqlconfig.Endpoint) {
5758
output := c.Output()
5859
controller := container.NewController()
5960
if !controller.ContainerRunning(endpoint.AssetDetails.ContainerDetails.Id) {
60-
output.FatalfWithHintExamples([][]string{
61-
{"To start the container", "sqlcmd start"},
62-
}, "Container is not running")
61+
output.FatalWithHintExamples([][]string{
62+
{localizer.Sprintf("To start the container"), localizer.Sprintf("sqlcmd start")},
63+
}, localizer.Sprintf("Container is not running"))
6364
}
6465
}
6566

cmd/modern/root/open/ads_darwin.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ func (c *Ads) persistCredentialForAds(hostname string, endpoint sqlconfig.Endpoi
2828
func (c *Ads) displayPreLaunchInfo() {
2929
output := c.Output()
3030

31-
output.Infof("Temporary: To view connection information run:")
32-
output.Infof("")
33-
output.Infof("\tsqlcmd config connection-strings")
34-
output.Infof("")
35-
output.Infof("(see issue for more information: https://github.com/microsoft/go-sqlcmd/issues/257)")
31+
output.Info(localizer.Sprintf("Temporary: To view connection information run:"))
32+
output.Info("")
33+
output.Info("\tsqlcmd config connection-strings")
34+
output.Info("")
35+
output.Info("(see issue for more information: https://github.com/microsoft/go-sqlcmd/issues/257)")
3636
}

cmd/modern/root/open/ads_windows.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ package open
55

66
import (
77
"fmt"
8+
89
"github.com/microsoft/go-sqlcmd/cmd/modern/sqlconfig"
910
"github.com/microsoft/go-sqlcmd/internal/cmdparser"
1011
"github.com/microsoft/go-sqlcmd/internal/credman"
12+
"github.com/microsoft/go-sqlcmd/internal/localizer"
1113
"github.com/microsoft/go-sqlcmd/internal/secret"
1214
)
1315

@@ -25,7 +27,7 @@ type Ads struct {
2527
func (c *Ads) displayPreLaunchInfo() {
2628
output := c.Output()
2729

28-
output.Infof("Press Ctrl+C to exit this process...")
30+
output.Info(localizer.Sprintf("Press Ctrl+C to exit this process..."))
2931
}
3032

3133
// persistCredentialForAds stores a SQL password in the Windows Credential Manager
@@ -92,9 +94,9 @@ func (c *Ads) writeCredential() {
9294

9395
err := credman.WriteCredential(&c.credential, credman.CredTypeGeneric)
9496
if err != nil {
95-
output.FatalfErrorWithHints(
97+
output.FatalErrorWithHints(
9698
err,
97-
[]string{"A 'Not enough memory resources are available' error can be caused by too many credentials already stored in Windows Credential Manager"},
98-
"Failed to write credential to Windows Credential Manager")
99+
[]string{localizer.Sprintf("A 'Not enough memory resources are available' error can be caused by too many credentials already stored in Windows Credential Manager")},
100+
localizer.Sprintf("Failed to write credential to Windows Credential Manager"))
99101
}
100102
}

cmd/modern/root/start.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func (c *Start) run() {
3333
output := c.Output()
3434

3535
if config.CurrentContextName() == "" {
36-
output.FatalfWithHintExamples([][]string{
36+
output.FatalWithHintExamples([][]string{
3737
{localizer.Sprintf("To view available contexts"), "sqlcmd config get-contexts"},
3838
}, localizer.Sprintf("No current context"))
3939
}
@@ -42,15 +42,11 @@ func (c *Start) run() {
4242
id := config.ContainerId()
4343
endpoint, _ := config.CurrentContext()
4444

45-
output.Infof(
46-
localizer.Sprintf("Starting %q for context %q"),
47-
endpoint.ContainerDetails.Image,
48-
config.CurrentContextName(),
49-
)
45+
output.Info(localizer.Sprintf("Starting %q for context %q", endpoint.ContainerDetails.Image, config.CurrentContextName()))
5046
err := controller.ContainerStart(id)
5147
c.CheckErr(err)
5248
} else {
53-
output.FatalfWithHintExamples([][]string{
49+
output.FatalWithHintExamples([][]string{
5450
{localizer.Sprintf("Create new context with a sql container "), "sqlcmd create mssql"},
5551
}, localizer.Sprintf("Current context does not have a container"))
5652
}

0 commit comments

Comments
 (0)