Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions bundle/configsync/format.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,19 @@ func FormatTextOutput(changes Changes) string {
return output.String()
}

output.WriteString(fmt.Sprintf("Detected changes in %d resource(s):\n\n", len(changes)))
fmt.Fprintf(&output, "Detected changes in %d resource(s):\n\n", len(changes))

resourceKeys := slices.Sorted(maps.Keys(changes))

for _, resourceKey := range resourceKeys {
resourceChanges := changes[resourceKey]
output.WriteString(fmt.Sprintf("Resource: %s\n", resourceKey))
fmt.Fprintf(&output, "Resource: %s\n", resourceKey)

paths := slices.Sorted(maps.Keys(resourceChanges))

for _, path := range paths {
configChange := resourceChanges[path]
output.WriteString(fmt.Sprintf(" %s: %s\n", path, configChange.Operation))
fmt.Fprintf(&output, " %s: %s\n", path, configChange.Operation)
}

output.WriteString("\n")
Expand Down
2 changes: 1 addition & 1 deletion bundle/permissions/workspace_path_permissions.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ func convertWorkspaceObjectPermissionLevel(level workspace.WorkspaceObjectPermis
func toString(p []resources.Permission) string {
var sb strings.Builder
for _, perm := range p {
sb.WriteString(fmt.Sprintf("- %s\n", perm.String()))
fmt.Fprintf(&sb, "- %s\n", perm.String())
}
return sb.String()
}
2 changes: 1 addition & 1 deletion bundle/run/output/job.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func (out *JobOutput) String() (string, error) {
return "", nil //nolint:nilerr // skip tasks with unparseable output
}
result.WriteString("=======\n")
result.WriteString(fmt.Sprintf("Task %s:\n", v.TaskKey))
fmt.Fprintf(&result, "Task %s:\n", v.TaskKey)
result.WriteString(taskString + "\n")
}
return result.String(), nil
Expand Down
16 changes: 9 additions & 7 deletions bundle/run/pipeline.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"slices"
"strings"
"time"

"github.com/databricks/cli/bundle"
Expand All @@ -28,18 +29,19 @@ func filterEventsByUpdateId(events []pipelines.PipelineEvent, updateId string) [
}

func (r *pipelineRunner) logEvent(ctx context.Context, event pipelines.PipelineEvent) {
logString := ""
var sb strings.Builder
if event.Message != "" {
logString += fmt.Sprintf(" %s\n", event.Message)
fmt.Fprintf(&sb, " %s\n", event.Message)
}
if event.Error != nil && len(event.Error.Exceptions) > 0 {
logString += "trace for most recent exception: \n"
for i := range len(event.Error.Exceptions) {
logString += event.Error.Exceptions[i].Message + "\n"
sb.WriteString("trace for most recent exception: \n")
for _, exc := range event.Error.Exceptions {
sb.WriteString(exc.Message)
sb.WriteByte('\n')
}
}
if logString != "" {
log.Errorf(ctx, "[%s] %s", event.EventType, logString)
if sb.Len() > 0 {
log.Errorf(ctx, "[%s] %s", event.EventType, sb.String())
}
}

Expand Down
2 changes: 1 addition & 1 deletion bundle/run/progress/job_events.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func NewTaskErrorEvent(taskKey, errorMessage, errorTrace string) *TaskErrorEvent

func (event *TaskErrorEvent) String() string {
result := strings.Builder{}
result.WriteString(fmt.Sprintf("Task %s FAILED:\n", event.TaskKey))
fmt.Fprintf(&result, "Task %s FAILED:\n", event.TaskKey)
result.WriteString(event.Error + "\n")
result.WriteString(event.ErrorTrace + "\n")
return result.String()
Expand Down
2 changes: 1 addition & 1 deletion bundle/run/progress/pipeline.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ func (event *ProgressEvent) String() string {
result.WriteString(fmt.Sprintf("%-15s", event.EventType) + " ")

result.WriteString(event.Level.String() + " ")
result.WriteString(fmt.Sprintf(`"%s"`, event.Message))
fmt.Fprintf(&result, `"%s"`, event.Message)

// construct error string if level=`Error`
if event.Level == pipelines.EventLevelError && event.Error != nil {
Expand Down
24 changes: 14 additions & 10 deletions experimental/aitools/cmd/discover_schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,17 @@ For each table, returns:
output = results[0]
} else {
divider := strings.Repeat("-", 70)
var sb strings.Builder
for i, result := range results {
if i > 0 {
output += "\n" + divider + "\n"
sb.WriteByte('\n')
sb.WriteString(divider)
sb.WriteByte('\n')
}
output += fmt.Sprintf("TABLE: %s\n%s\n", args[i], divider)
output += result
fmt.Fprintf(&sb, "TABLE: %s\n%s\n", args[i], divider)
sb.WriteString(result)
}
output = sb.String()
}

cmdio.LogString(ctx, output)
Expand Down Expand Up @@ -104,14 +108,14 @@ func discoverTable(ctx context.Context, w *databricks.WorkspaceClient, warehouse

sb.WriteString("COLUMNS:\n")
for i, col := range columns {
sb.WriteString(fmt.Sprintf(" %s: %s\n", col, types[i]))
fmt.Fprintf(&sb, " %s: %s\n", col, types[i])
}

// 2. sample data (5 rows)
sampleSQL := fmt.Sprintf("SELECT * FROM %s LIMIT 5", table)
sampleResp, err := executeSQL(ctx, w, warehouseID, sampleSQL)
if err != nil {
sb.WriteString(fmt.Sprintf("\nSAMPLE DATA: Error - %v\n", err))
fmt.Fprintf(&sb, "\nSAMPLE DATA: Error - %v\n", err)
} else {
sb.WriteString("\nSAMPLE DATA:\n")
sb.WriteString(formatTableData(sampleResp))
Expand All @@ -127,7 +131,7 @@ func discoverTable(ctx context.Context, w *databricks.WorkspaceClient, warehouse

nullResp, err := executeSQL(ctx, w, warehouseID, nullSQL)
if err != nil {
sb.WriteString(fmt.Sprintf("\nNULL COUNTS: Error - %v\n", err))
fmt.Fprintf(&sb, "\nNULL COUNTS: Error - %v\n", err)
} else {
sb.WriteString("\nNULL COUNTS:\n")
sb.WriteString(formatNullCounts(nullResp, columns))
Expand Down Expand Up @@ -192,13 +196,13 @@ func formatTableData(resp *dbsql.StatementResponse) string {
}

for i, row := range resp.Result.DataArray {
sb.WriteString(fmt.Sprintf(" Row %d:\n", i+1))
fmt.Fprintf(&sb, " Row %d:\n", i+1)
for j, val := range row {
colName := fmt.Sprintf("col%d", j)
if j < len(columns) {
colName = columns[j]
}
sb.WriteString(fmt.Sprintf(" %s: %v\n", colName, val))
fmt.Fprintf(&sb, " %s: %v\n", colName, val)
}
}
return sb.String()
Expand All @@ -214,14 +218,14 @@ func formatNullCounts(resp *dbsql.StatementResponse, columns []string) string {

// first value is total_rows
if len(row) > 0 {
sb.WriteString(fmt.Sprintf(" total_rows: %v\n", row[0]))
fmt.Fprintf(&sb, " total_rows: %v\n", row[0])
}

// remaining values are null counts per column
for i, col := range columns {
idx := i + 1
if idx < len(row) {
sb.WriteString(fmt.Sprintf(" %s_nulls: %v\n", col, row[idx]))
fmt.Fprintf(&sb, " %s_nulls: %v\n", col, row[idx])
}
}

Expand Down
23 changes: 11 additions & 12 deletions experimental/ssh/internal/proxy/client_server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,26 +105,25 @@ func TestMultipleClients(t *testing.T) {
defer client2.Cleanup()

messageCount := 10
expectedClientOutput1 := ""
expectedClientOutput2 := ""
var expectedClientOutput1, expectedClientOutput2 []byte
for i := range messageCount {
message := fmt.Appendf(nil, "client 1 message %d\n", i)
_, err := client1.InputWriter.Write(message)
require.NoError(t, err)
err = client1.Output.AssertWrite(message)
require.NoError(t, err)
expectedClientOutput1 += string(message)
expectedClientOutput1 = append(expectedClientOutput1, message...)

message = fmt.Appendf(nil, "client 2 message %d\n", i)
_, err = client2.InputWriter.Write(message)
require.NoError(t, err)
err = client2.Output.AssertWrite(message)
require.NoError(t, err)
expectedClientOutput2 += string(message)
expectedClientOutput2 = append(expectedClientOutput2, message...)
}

assert.Equal(t, expectedClientOutput1, client1.Output.String())
assert.Equal(t, expectedClientOutput2, client2.Output.String())
assert.Equal(t, string(expectedClientOutput1), client1.Output.String())
assert.Equal(t, string(expectedClientOutput2), client2.Output.String())
}

func TestMaxClients(t *testing.T) {
Expand Down Expand Up @@ -168,7 +167,7 @@ func TestHandover(t *testing.T) {
client := createTestClient(t, server.URL, requestHandoverTick, nil)
defer client.Cleanup()

expectedOutput := ""
var expectedOutput []byte

wg := sync.WaitGroup{}
wg.Go(func() {
Expand All @@ -181,7 +180,7 @@ func TestHandover(t *testing.T) {
if err != nil {
t.Errorf("failed to write message %d: %v", i, err)
}
expectedOutput += string(message)
expectedOutput = append(expectedOutput, message...)
}
})

Expand All @@ -191,7 +190,7 @@ func TestHandover(t *testing.T) {
wg.Wait()

// client.Output is created by appending incoming messages as they arrive, so we are also test correct order here
assert.Equal(t, expectedOutput, client.Output.String())
assert.Equal(t, string(expectedOutput), client.Output.String())
}

// Tests handovers in quick succession with few messages in between.
Expand All @@ -207,7 +206,7 @@ func TestQuickHandover(t *testing.T) {
client := createTestClient(t, server.URL, requestHandoverTick, nil)
defer client.Cleanup()

expectedOutput := ""
var expectedOutput []byte

wg := sync.WaitGroup{}
wg.Go(func() {
Expand All @@ -220,7 +219,7 @@ func TestQuickHandover(t *testing.T) {
if err != nil {
t.Errorf("failed to write message %d: %v", i, err)
}
expectedOutput += string(message)
expectedOutput = append(expectedOutput, message...)
}
})

Expand All @@ -229,5 +228,5 @@ func TestQuickHandover(t *testing.T) {

wg.Wait()

assert.Equal(t, expectedOutput, client.Output.String())
assert.Equal(t, string(expectedOutput), client.Output.String())
}
22 changes: 12 additions & 10 deletions experimental/ssh/internal/server/sshd.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,23 +56,25 @@ func prepareSSHDConfig(ctx context.Context, client *databricks.WorkspaceClient,
}

// Set all available env vars, wrapping values in quotes, escaping quotes, and stripping newlines
setEnv := "SetEnv"
var setEnvBuf strings.Builder
setEnvBuf.WriteString("SetEnv")
for _, env := range os.Environ() {
parts := strings.SplitN(env, "=", 2)
if len(parts) == 2 {
setEnv += " " + parts[0] + "=\"" + escapeEnvValue(parts[1]) + "\""
fmt.Fprintf(&setEnvBuf, ` %s="%s"`, parts[0], escapeEnvValue(parts[1]))
}
}
setEnv += " DATABRICKS_CLI_UPSTREAM=databricks_ssh_tunnel"
setEnv += " DATABRICKS_CLI_UPSTREAM_VERSION=" + opts.Version
setEnv += " DATABRICKS_SDK_UPSTREAM=databricks_ssh_tunnel"
setEnv += " DATABRICKS_SDK_UPSTREAM_VERSION=" + opts.Version
setEnv += " GIT_CONFIG_GLOBAL=/Workspace/.proc/self/git/config"
setEnv += " ENABLE_DATABRICKS_CLI=true"
setEnv += " PYTHONPYCACHEPREFIX=/tmp/pycache"
setEnvBuf.WriteString(" DATABRICKS_CLI_UPSTREAM=databricks_ssh_tunnel")
setEnvBuf.WriteString(" DATABRICKS_CLI_UPSTREAM_VERSION=" + opts.Version)
setEnvBuf.WriteString(" DATABRICKS_SDK_UPSTREAM=databricks_ssh_tunnel")
setEnvBuf.WriteString(" DATABRICKS_SDK_UPSTREAM_VERSION=" + opts.Version)
setEnvBuf.WriteString(" GIT_CONFIG_GLOBAL=/Workspace/.proc/self/git/config")
setEnvBuf.WriteString(" ENABLE_DATABRICKS_CLI=true")
setEnvBuf.WriteString(" PYTHONPYCACHEPREFIX=/tmp/pycache")
if opts.Serverless {
setEnv += " DATABRICKS_JUPYTER_SERVERLESS=true"
setEnvBuf.WriteString(" DATABRICKS_JUPYTER_SERVERLESS=true")
}
setEnv := setEnvBuf.String()

sshdConfigContent := "PubkeyAuthentication yes\n" +
"PasswordAuthentication no\n" +
Expand Down
8 changes: 4 additions & 4 deletions internal/testutil/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ func GetEnvOrSkipTest(t TestingT, name string) string {

// RandomName gives random name with optional prefix. e.g. qa.RandomName("tf-")
func RandomName(prefix ...string) string {
out := ""
var sb strings.Builder
for _, p := range prefix {
out += p
sb.WriteString(p)
}
out += strings.ReplaceAll(uuid.New().String(), "-", "")
return out
sb.WriteString(strings.ReplaceAll(uuid.New().String(), "-", ""))
return sb.String()
}

func ReplaceWindowsLineEndings(s string) string {
Expand Down
2 changes: 1 addition & 1 deletion internal/testutil/testutil_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (
func TestNoTestingImport(t *testing.T) {
// Parse the package
fset := token.NewFileSet()
pkgs, err := parser.ParseDir(fset, ".", nil, parser.AllErrors)
pkgs, err := parser.ParseDir(fset, ".", nil, parser.AllErrors) //nolint:staticcheck // SA1019: adequate for this import-only scan
require.NoError(t, err)

// Iterate through the files in the package
Expand Down
20 changes: 12 additions & 8 deletions libs/apps/validation/validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"fmt"
"os"
"path/filepath"
"strings"
)

// ValidationDetail contains detailed output from a failed validation.
Expand All @@ -28,27 +29,30 @@ type ValidateResult struct {
}

func (vr *ValidateResult) String() string {
var result string
var sb strings.Builder

if len(vr.ProgressLog) > 0 {
result = "Validation Progress:\n"
sb.WriteString("Validation Progress:\n")
for _, entry := range vr.ProgressLog {
result += entry + "\n"
sb.WriteString(entry)
sb.WriteByte('\n')
}
result += "\n"
sb.WriteByte('\n')
}

if vr.Success {
result += "✅ " + vr.Message
sb.WriteString("✅ ")
sb.WriteString(vr.Message)
} else {
result += "❌ " + vr.Message
sb.WriteString("❌ ")
sb.WriteString(vr.Message)
if vr.Details != nil {
result += fmt.Sprintf("\n\nExit code: %d\n\nStdout:\n%s\n\nStderr:\n%s",
fmt.Fprintf(&sb, "\n\nExit code: %d\n\nStdout:\n%s\n\nStderr:\n%s",
vr.Details.ExitCode, vr.Details.Stdout, vr.Details.Stderr)
}
}

return result
return sb.String()
}

// ValidateOptions configures validation behavior.
Expand Down
10 changes: 6 additions & 4 deletions libs/cmdio/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import (
// Heredoc is the equivalent of compute.TrimLeadingWhitespace
// (command-execution API helper from SDK), except it's more
// friendly to non-printable characters.
func Heredoc(tmpl string) (trimmed string) {
func Heredoc(tmpl string) string {
lines := strings.Split(tmpl, "\n")
leadingWhitespace := 1<<31 - 1
for _, line := range lines {
Expand All @@ -39,17 +39,19 @@ func Heredoc(tmpl string) (trimmed string) {
break
}
}
var sb strings.Builder
for i := range lines {
if lines[i] == "" || strings.TrimSpace(lines[i]) == "" {
continue
}
if len(lines[i]) < leadingWhitespace {
trimmed += lines[i] + "\n" // or not..
sb.WriteString(lines[i])
} else {
trimmed += lines[i][leadingWhitespace:] + "\n"
sb.WriteString(lines[i][leadingWhitespace:])
}
sb.WriteByte('\n')
}
return strings.TrimSpace(trimmed)
return strings.TrimSpace(sb.String())
}

// writeFlusher represents a buffered writer that can be flushed. This is useful when
Expand Down
Loading