@@ -26,12 +26,29 @@ defmodule Mix.Dep.Fetcher do
26
26
See `Mix.Dep.unloaded_by_name/4` for options.
27
27
"""
28
28
def by_name ( names , old_lock , new_lock , opts ) do
29
- result = Mix.Dep . unloaded_by_name ( names , [ ] , new_lock , opts , & do_fetch / 3 )
29
+ fetcher = fetch_by_name ( names , new_lock )
30
+ result = Mix.Dep . unloaded ( [ ] , new_lock , opts , fetcher )
30
31
{ apps , deps } = do_finalize ( result , old_lock , opts )
31
- Mix.Dep . loaded_by_name ( names , deps , opts ) # Check all given dependencies are loaded or fail
32
+
33
+ # Check if all given dependencies are loaded or fail
34
+ Mix.Dep . loaded_by_name ( names , deps , opts )
32
35
apps
33
36
end
34
37
38
+ defp fetch_by_name ( given , lock ) do
39
+ names = to_app_names ( given )
40
+
41
+ fn ( % Mix.Dep { app: app } = dep , acc , new_lock ) ->
42
+ # Only fetch if dependency is in given names or if lock has
43
+ # been changed for dependency by remote converger
44
+ if app in names or lock [ app ] != new_lock [ app ] do
45
+ do_fetch ( dep , acc , new_lock )
46
+ else
47
+ { dep , acc , new_lock }
48
+ end
49
+ end
50
+ end
51
+
35
52
defp do_fetch ( dep , acc , lock ) do
36
53
% Mix.Dep { app: app , scm: scm , opts: opts } = dep = check_lock ( dep , lock )
37
54
@@ -123,4 +140,10 @@ defmodule Mix.Dep.Fetcher do
123
140
124
141
do_with_depending ( parents , all_deps ) ++ parents
125
142
end
143
+
144
+ defp to_app_names ( given ) do
145
+ Enum . map ( given , fn ( app ) ->
146
+ if is_binary ( app ) , do: binary_to_atom ( app ) , else: app
147
+ end )
148
+ end
126
149
end
0 commit comments