diff --git a/libs/structs/structdiff/diff.go b/libs/structs/structdiff/diff.go index 5e7a00cac4f..00f1bdcaa34 100644 --- a/libs/structs/structdiff/diff.go +++ b/libs/structs/structdiff/diff.go @@ -219,13 +219,15 @@ func diffStruct(ctx *diffContext, path *structpath.PathNode, s1, s2 reflect.Valu continue } + // Only the exact tag json:"-" skips a field; json:"-," names it "-". + if structaccess.IsSkippedField(sf) { + continue + } + jsonTag := structtag.JSONTag(sf.Tag.Get("json")) // Resolve field name from JSON tag or fall back to Go field name fieldName := jsonTag.Name() - if fieldName == "-" { - continue - } isEmbed := sf.Name == structaccess.EmbeddedSliceFieldName diff --git a/libs/structs/structdiff/diff_test.go b/libs/structs/structdiff/diff_test.go index 15f90f076f6..d6383f16cbb 100644 --- a/libs/structs/structdiff/diff_test.go +++ b/libs/structs/structdiff/diff_test.go @@ -6,6 +6,8 @@ import ( "testing" "time" + "github.com/databricks/cli/libs/structs/structaccess" + "github.com/databricks/databricks-sdk-go/common/types/duration" sdktime "github.com/databricks/databricks-sdk-go/common/types/time" "github.com/databricks/databricks-sdk-go/service/jobs" @@ -1034,3 +1036,26 @@ func TestGetStructDiffWholeBlock(t *testing.T) { }) } } + +type dashNamed struct { + Skipped string `json:"-"` + Named string `json:"-,omitempty"` //nolint:staticcheck // odd tag is the point +} + +// TestGetStructDiffDashNamedField checks that only the exact tag json:"-" skips a +// field: encoding/json serializes json:"-,omitempty" under the key "-", and +// structaccess resolves the path "-" to it. +func TestGetStructDiffDashNamedField(t *testing.T) { + before := &dashNamed{Skipped: "a", Named: "a"} + after := &dashNamed{Skipped: "b", Named: "b"} + + changes, err := GetStructDiff(before, after, nil) + require.NoError(t, err) + assert.Equal(t, []ResolvedChange{{Field: "-", Old: "a", New: "b"}}, resolveChanges(changes)) + + value, err := structaccess.Get(after, changes[0].Path) + require.NoError(t, err) + assert.Equal(t, "b", value) + + assert.Equal(t, len(changes) == 0, IsEqual(before, after)) +}