@@ -100,10 +100,12 @@ defmodule Mix.Dep do
100100
101101 # Ensure all apps are atoms
102102 apps = to_app_names ( given )
103-
104- # We need to keep the order of deps, loaded/1 properly orders them
105- deps = Enum . filter ( all_deps , & ( & 1 . app in apps ) )
106- deps = if opts [ :include_children ] , do: include_children ( deps , all_deps ) , else: deps
103+ deps =
104+ if opts [ :include_children ] do
105+ get_deps_with_children ( all_deps , apps )
106+ else
107+ get_deps ( all_deps , apps )
108+ end
107109
108110 Enum . each apps , fn ( app ) ->
109111 unless Enum . any? ( all_deps , & ( & 1 . app == app ) ) do
@@ -114,17 +116,29 @@ defmodule Mix.Dep do
114116 deps
115117 end
116118
117- # If we need to include children, we need to traverse all
118- # them, fetch the uniq app names, and once again filter all
119- # deps to keep the proper dependency ordering.
120- defp include_children ( deps , all_deps ) do
121- deps = include_children ( deps )
122- apps = deps |> Enum . map ( & & 1 . app ) |> Enum . uniq
119+ defp get_deps ( all_deps , apps ) do
123120 Enum . filter ( all_deps , & ( & 1 . app in apps ) )
124121 end
125122
126- defp include_children ( [ ] ) , do: [ ]
127- defp include_children ( deps ) , do: deps ++ include_children ( Enum . flat_map ( deps , & & 1 . deps ) )
123+ defp get_deps_with_children ( all_deps , apps ) do
124+ deps = get_children ( all_deps , apps )
125+ apps = deps |> Enum . map ( & & 1 . app ) |> Enum . uniq
126+ get_deps ( all_deps , apps )
127+ end
128+
129+ defp get_children ( _all_deps , [ ] ) , do: [ ]
130+ defp get_children ( all_deps , apps ) do
131+ # Current deps
132+ deps = get_deps ( all_deps , apps )
133+
134+ # Children apps
135+ apps = for % { deps: children } <- deps ,
136+ % { app: app } <- children ,
137+ do: app
138+
139+ # Current deps + children deps
140+ deps ++ get_children ( all_deps , apps )
141+ end
128142
129143 @ doc """
130144 Runs the given `fun` inside the given dependency project by
0 commit comments