Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

merge.go: drop Compression field if nil in child #1329

Closed
wants to merge 1 commit into from
Closed
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
4 changes: 4 additions & 0 deletions config/merge/merge.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,10 @@ func mergeStruct(parent reflect.Value, parentPath path.ContextPath, child reflec
resultField.Set(mergeStruct(parentField.Elem(), parentFieldPath, childField.Elem(), childFieldPath, resultFieldPath, transcript).Addr())
transcribeOne(parentFieldPath, resultFieldPath, transcript)
transcribeOne(childFieldPath, resultFieldPath, transcript)
case kind == reflect.Ptr && childField.IsNil() && fieldMeta.Name == "Compression":
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a better place to put this? Doesn't seem like it should be a case in mergeStruct() since it's such a general function but I couldn't find where else to put it

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm confused how this works...wouldn't we fall through to the case below without this?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah it would fall through to the next case which calls resultField.Set(parentField). Afaict that's what we want to avoid doing, and instead we want to do nothing (ie set Compression to nil)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The bug we're hitting is when parentField has Compression = gzip but childField.IsNil()

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right sorry, I get confused sometimes how in Go fallthrough requires an explicit fallthrough.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Haha when I read your comment I had a definite moment of crisis over that

// if a child's Compression field is nil, since it may have uncompressed
// Source that gets copied to result, Compression should not be set in
// result even if it's set in parent
case kind == reflect.Ptr && childField.IsNil():
resultField.Set(parentField)
transcribe(parentFieldPath, resultFieldPath, resultField, fieldMeta, transcript)
Expand Down
65 changes: 65 additions & 0 deletions config/merge/merge_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1338,6 +1338,71 @@ func TestMerge(t *testing.T) {
{path.New(TAG_CHILD, "kernelArguments"), path.New(TAG_RESULT, "kernelArguments")},
}},
},

// when compressed and un-compressed files are merged, out does not have Compression field
{
in1: types.Config{
Storage: types.Storage{
Files: []types.File{
{
Node: types.Node{
Path: "/a",
},
FileEmbedded1: types.FileEmbedded1{
Contents: types.Resource{
Source: util.StrToPtr("data:"),
Compression: util.StrToPtr("gzip"),
},
},
},
},
},
},
in2: types.Config{
Storage: types.Storage{
Files: []types.File{
{
Node: types.Node{
Path: "/a",
},
FileEmbedded1: types.FileEmbedded1{
Contents: types.Resource{
Source: util.StrToPtr("data:hello world"),
},
},
},
},
},
},
out: types.Config{
Storage: types.Storage{
Files: []types.File{
{
Node: types.Node{
Path: "/a",
},
FileEmbedded1: types.FileEmbedded1{
Contents: types.Resource{
Source: util.StrToPtr("data:hello world"),
},
},
},
},
},
},
transcript: Transcript{[]Mapping{
{path.New(TAG_CHILD, "storage", "files", 0, "path"), path.New(TAG_RESULT, "storage", "files", 0, "path")},
{path.New(TAG_CHILD, "storage", "files", 0, "contents", "source"), path.New(TAG_RESULT, "storage", "files", 0, "contents", "source")},
{path.New(TAG_PARENT, "storage", "files", 0, "contents"), path.New(TAG_RESULT, "storage", "files", 0, "contents")},
{path.New(TAG_CHILD, "storage", "files", 0, "contents"), path.New(TAG_RESULT, "storage", "files", 0, "contents")},
{path.New(TAG_PARENT, "storage", "files", 0), path.New(TAG_RESULT, "storage", "files", 0)},
{path.New(TAG_CHILD, "storage", "files", 0), path.New(TAG_RESULT, "storage", "files", 0)},
{path.New(TAG_PARENT, "storage", "files"), path.New(TAG_RESULT, "storage", "files")},
{path.New(TAG_CHILD, "storage", "files"), path.New(TAG_RESULT, "storage", "files")},
{path.New(TAG_PARENT, "storage"), path.New(TAG_RESULT, "storage")},
{path.New(TAG_CHILD, "storage"), path.New(TAG_RESULT, "storage")},
Comment on lines +1394 to +1403
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reverse engineered this so have no idea if it's correct

}},
},
}

for i, test := range tests {
Expand Down