@@ -40,6 +40,8 @@ defmodule Mix.Config do
40
40
@ doc """
41
41
Configures the given application.
42
42
43
+ Keyword lists are always deep merged.
44
+
43
45
## Examples
44
46
45
47
The given `opts` are merged into the existing configuration
@@ -69,6 +71,8 @@ defmodule Mix.Config do
69
71
@ doc """
70
72
Configures the given key for the given application.
71
73
74
+ Keyword lists are always deep merged.
75
+
72
76
## Examples
73
77
74
78
The given `opts` are merged into the existing values for `key`
@@ -91,8 +95,7 @@ defmodule Mix.Config do
91
95
quote do
92
96
var! ( config , Mix.Config ) =
93
97
Mix.Config . merge ( var! ( config , Mix.Config ) ,
94
- [ { unquote ( app ) , [ { unquote ( key ) , unquote ( opts ) } ] } ] ,
95
- fn _app , _key , v1 , v2 -> Keyword . merge ( v1 , v2 ) end )
98
+ [ { unquote ( app ) , [ { unquote ( key ) , unquote ( opts ) } ] } ] )
96
99
end
97
100
end
98
101
@@ -116,7 +119,7 @@ defmodule Mix.Config do
116
119
defmacro import_config ( file ) do
117
120
quote do
118
121
var! ( config , Mix.Config ) =
119
- Mix.Config . read_wildcard! ( Path . expand ( unquote ( file ) , __DIR__ ) , var! ( config , Mix.Config ) )
122
+ Mix.Config . read_wildcard! ( var! ( config , Mix.Config ) , Path . expand ( unquote ( file ) , __DIR__ ) )
120
123
end
121
124
end
122
125
@@ -142,7 +145,7 @@ defmodule Mix.Config do
142
145
@ doc """
143
146
Reads many configuration files given by wildcard into a single config.
144
147
"""
145
- def read_wildcard! ( path , config ) do
148
+ def read_wildcard! ( config , path ) do
146
149
paths = case Path . wildcard ( path ) do
147
150
[ ] -> [ path ]
148
151
o -> o
@@ -201,34 +204,15 @@ defmodule Mix.Config do
201
204
"""
202
205
def merge ( config1 , config2 ) do
203
206
Keyword . merge ( config1 , config2 , fn _ , app1 , app2 ->
204
- Keyword . merge ( app1 , app2 )
207
+ Keyword . merge ( app1 , app2 , & deep_merge / 3 )
205
208
end )
206
209
end
207
210
208
- @ doc """
209
- Merges two configurations.
210
-
211
- The configuration of each application is merged together
212
- and a callback is invoked in case of conflicts receiving
213
- the app, the conflicting key and both values. It must return
214
- a value that will be used as part of the conflict resolution.
215
-
216
- ## Examples
217
-
218
- iex> Mix.Config.merge([app: [k: :v1]], [app: [k: :v2]],
219
- ...> fn app, k, v1, v2 -> {app, k, v1, v2} end)
220
- [app: [k: {:app, :k, :v1, :v2}]]
221
-
222
- """
223
- def merge ( config1 , config2 , callback ) do
224
- Keyword . merge ( config1 , config2 , fn app , app1 , app2 ->
225
- Keyword . merge ( app1 , app2 , fn k , v1 , v2 ->
226
- if v1 == v2 do
227
- v1
228
- else
229
- callback . ( app , k , v1 , v2 )
230
- end
231
- end )
232
- end )
211
+ defp deep_merge ( _key , value1 , value2 ) do
212
+ if Keyword . keyword? ( value1 ) and Keyword . keyword? ( value2 ) do
213
+ Keyword . merge ( value1 , value2 , & deep_merge / 3 )
214
+ else
215
+ value2
216
+ end
233
217
end
234
218
end
0 commit comments