Skip to content

Commit 224b85b

Browse files
authored
Merge pull request #164 from ndeloof/merge_command
2 parents 0ade246 + baa35e0 commit 224b85b

File tree

3 files changed

+42
-13
lines changed

3 files changed

+42
-13
lines changed

loader/loader.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,13 @@ import (
3232
"github.com/compose-spec/compose-go/schema"
3333
"github.com/compose-spec/compose-go/template"
3434
"github.com/compose-spec/compose-go/types"
35-
units "github.com/docker/go-units"
36-
"github.com/imdario/mergo"
37-
shellwords "github.com/mattn/go-shellwords"
35+
"github.com/docker/go-units"
36+
"github.com/mattn/go-shellwords"
3837
"github.com/mitchellh/mapstructure"
3938
"github.com/pkg/errors"
4039
"github.com/sirupsen/logrus"
4140
"github.com/ulyssessouza/godotenv"
42-
yaml "gopkg.in/yaml.v2"
41+
"gopkg.in/yaml.v2"
4342
)
4443

4544
// Options supported by Load
@@ -504,10 +503,10 @@ func loadServiceWithExtends(filename, name string, servicesDict map[string]inter
504503
}
505504
}
506505

507-
if err := mergo.Merge(baseService, serviceConfig, mergo.WithAppendSlice, mergo.WithOverride, mergo.WithTransformers(serviceSpecials)); err != nil {
508-
return nil, errors.Wrapf(err, "cannot merge service %s", name)
506+
serviceConfig, err = _merge(baseService, serviceConfig)
507+
if err != nil {
508+
return nil, err
509509
}
510-
serviceConfig = baseService
511510
}
512511

513512
return serviceConfig, nil

loader/loader_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,25 @@ services:
290290
assert.Check(t, service.Command[0] == "echo")
291291
}
292292

293+
func TestLoadExtendsOverrideCommand(t *testing.T) {
294+
actual, err := loadYAML(`
295+
services:
296+
foo:
297+
image: busybox
298+
extends:
299+
service: bar
300+
command: "/bin/ash -c \"rm -rf /tmp/might-not-exist\""
301+
bar:
302+
image: alpine
303+
command: "/bin/ash -c \"echo Oh no...\""`)
304+
assert.NilError(t, err)
305+
assert.Check(t, is.Len(actual.Services, 2))
306+
service, err := actual.GetService("foo")
307+
assert.NilError(t, err)
308+
assert.Check(t, service.Image == "busybox")
309+
assert.DeepEqual(t, service.Command, types.ShellCommand{"/bin/ash", "-c", "rm -rf /tmp/might-not-exist"})
310+
}
311+
293312
func TestLoadCredentialSpec(t *testing.T) {
294313
actual, err := loadYAML(`
295314
services:

loader/merge.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,11 @@ func mergeServices(base, override []types.ServiceConfig) ([]types.ServiceConfig,
8787
for name, overrideService := range overrideServices {
8888
overrideService := overrideService
8989
if baseService, ok := baseServices[name]; ok {
90-
if err := mergo.Merge(&baseService, &overrideService, mergo.WithAppendSlice, mergo.WithOverride, mergo.WithTransformers(serviceSpecials)); err != nil {
91-
return base, errors.Wrapf(err, "cannot merge service %s", name)
90+
merged, err := _merge(&baseService, &overrideService)
91+
if err != nil {
92+
return nil, errors.Wrapf(err, "cannot merge service %s", name)
9293
}
93-
if len(overrideService.Command) > 0 {
94-
baseService.Command = overrideService.Command
95-
}
96-
baseServices[name] = baseService
94+
baseServices[name] = *merged
9795
continue
9896
}
9997
baseServices[name] = overrideService
@@ -106,6 +104,19 @@ func mergeServices(base, override []types.ServiceConfig) ([]types.ServiceConfig,
106104
return services, nil
107105
}
108106

107+
func _merge(baseService *types.ServiceConfig, overrideService *types.ServiceConfig) (*types.ServiceConfig, error) {
108+
if err := mergo.Merge(baseService, overrideService, mergo.WithAppendSlice, mergo.WithOverride, mergo.WithTransformers(serviceSpecials)); err != nil {
109+
return nil, err
110+
}
111+
if len(overrideService.Command) > 0 {
112+
baseService.Command = overrideService.Command
113+
}
114+
if len(overrideService.Entrypoint) > 0 {
115+
baseService.Entrypoint = overrideService.Entrypoint
116+
}
117+
return baseService, nil
118+
}
119+
109120
func toServiceSecretConfigsMap(s interface{}) (map[interface{}]interface{}, error) {
110121
secrets, ok := s.([]types.ServiceSecretConfig)
111122
if !ok {

0 commit comments

Comments
 (0)