Skip to content

Commit f571fb7

Browse files
author
José Valim
committed
Ensure mix deps.compile --include-children recurs on root dep
1 parent 7c07476 commit f571fb7

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

lib/mix/lib/mix/dep.ex

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

lib/mix/test/mix/tasks/deps.git_test.exs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,23 @@ defmodule Mix.Tasks.DepsGitTest do
133133
purge [GitRepo, GitRepo.Mixfile]
134134
end
135135

136+
test "compiles many levels deep dependencies" do
137+
Mix.Project.push DepsOnGitApp
138+
139+
in_fixture "no_mixfile", fn ->
140+
Mix.Tasks.Deps.Get.run []
141+
refute File.exists?("_build/dev/lib/deps_on_git_repo")
142+
refute File.exists?("_build/dev/lib/git_repo")
143+
144+
# Compile the parent with children
145+
Mix.Tasks.Deps.Compile.run ["deps_on_git_repo", "--include-children"]
146+
assert File.exists?("_build/dev/lib/deps_on_git_repo")
147+
assert File.exists?("_build/dev/lib/git_repo")
148+
end
149+
after
150+
purge [GitRepo, GitRepo.Mixfile]
151+
end
152+
136153
test "recompiles the project when a dep is fetched" do
137154
Mix.Project.push GitApp
138155

0 commit comments

Comments
 (0)