@@ -26,12 +26,29 @@ defmodule Mix.Dep.Fetcher do
2626 See `Mix.Dep.unloaded_by_name/4` for options.
2727 """
2828 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 )
3031 { 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 )
3235 apps
3336 end
3437
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+
3552 defp do_fetch ( dep , acc , lock ) do
3653 % Mix.Dep { app: app , scm: scm , opts: opts } = dep = check_lock ( dep , lock )
3754
@@ -123,4 +140,10 @@ defmodule Mix.Dep.Fetcher do
123140
124141 do_with_depending ( parents , all_deps ) ++ parents
125142 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
126149end
0 commit comments