@@ -5,6 +5,7 @@ package loader
55
66import (
77 "cmp"
8+ "errors"
89 "fmt"
910 "reflect"
1011 "slices"
@@ -28,26 +29,26 @@ func (s *specials) Transformer(t reflect.Type) func(dst, src reflect.Value) erro
2829func merge (configs []* types.Config ) (* types.Config , error ) {
2930 base := configs [0 ]
3031 for _ , override := range configs [1 :] {
31- var err error
32- base .Services , err = mergeServices (base .Services , override .Services )
33- if err != nil {
34- return base , fmt .Errorf ("cannot merge services from %s: %w" , override .Filename , err )
32+ var errs []error
33+ if services , err := mergeServices (base .Services , override .Services ); err != nil {
34+ errs = append (errs , fmt .Errorf ("cannot merge services: %w" , err ))
35+ } else {
36+ base .Services = services
3537 }
36- base .Volumes , err = mergeVolumes (base .Volumes , override .Volumes )
37- if err != nil {
38- return base , fmt .Errorf ("cannot merge volumes from %s: %w" , override .Filename , err )
38+ if err := mergo .Map (& base .Volumes , & override .Volumes , mergo .WithOverride ); err != nil {
39+ errs = append (errs , fmt .Errorf ("cannot merge volumes: %w" , err ))
3940 }
40- base .Networks , err = mergeNetworks (base .Networks , override .Networks )
41- if err != nil {
42- return base , fmt .Errorf ("cannot merge networks from %s: %w" , override .Filename , err )
41+ if err := mergo .Map (& base .Networks , & override .Networks , mergo .WithOverride ); err != nil {
42+ errs = append (errs , fmt .Errorf ("cannot merge networks: %w" , err ))
4343 }
44- base .Secrets , err = mergeSecrets (base .Secrets , override .Secrets )
45- if err != nil {
46- return base , fmt .Errorf ("cannot merge secrets from %s: %w" , override .Filename , err )
44+ if err := mergo .Map (& base .Secrets , & override .Secrets , mergo .WithOverride ); err != nil {
45+ errs = append (errs , fmt .Errorf ("cannot merge secrets: %w" , err ))
4746 }
48- base .Configs , err = mergeConfigs (base .Configs , override .Configs )
49- if err != nil {
50- return base , fmt .Errorf ("cannot merge configs from %s: %w" , override .Filename , err )
47+ if err := mergo .Map (& base .Configs , & override .Configs , mergo .WithOverride ); err != nil {
48+ errs = append (errs , fmt .Errorf ("cannot merge configs: %w" , err ))
49+ }
50+ if err := errors .Join (errs ... ); err != nil {
51+ return nil , errors .Join (fmt .Errorf ("failed to merge file %s" , override .Filename ), err )
5152 }
5253 }
5354 return base , nil
@@ -78,7 +79,7 @@ func mergeServices(base, override []types.ServiceConfig) ([]types.ServiceConfig,
7879 for _ , overrideService := range override {
7980 if baseService , ok := baseServices [overrideService .Name ]; ok {
8081 if err := mergo .Merge (& baseService , & overrideService , mergeOpts ... ); err != nil {
81- return base , fmt .Errorf ("cannot merge service %s: %w" , overrideService .Name , err )
82+ return nil , fmt .Errorf ("cannot merge service %s: %w" , overrideService .Name , err )
8283 }
8384 baseServices [overrideService .Name ] = baseService
8485 continue
@@ -284,23 +285,3 @@ func mergeUint64(dst, src reflect.Value) error {
284285 }
285286 return nil
286287}
287-
288- func mergeVolumes (base , override map [string ]types.VolumeConfig ) (map [string ]types.VolumeConfig , error ) {
289- err := mergo .Map (& base , & override , mergo .WithOverride )
290- return base , err
291- }
292-
293- func mergeNetworks (base , override map [string ]types.NetworkConfig ) (map [string ]types.NetworkConfig , error ) {
294- err := mergo .Map (& base , & override , mergo .WithOverride )
295- return base , err
296- }
297-
298- func mergeSecrets (base , override map [string ]types.SecretConfig ) (map [string ]types.SecretConfig , error ) {
299- err := mergo .Map (& base , & override , mergo .WithOverride )
300- return base , err
301- }
302-
303- func mergeConfigs (base , override map [string ]types.ConfigObjConfig ) (map [string ]types.ConfigObjConfig , error ) {
304- err := mergo .Map (& base , & override , mergo .WithOverride )
305- return base , err
306- }
0 commit comments