summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@plataformatec.com.br>2018-12-14 21:25:24 +0100
committerJosé Valim <jose.valim@plataformatec.com.br>2018-12-14 21:31:36 +0100
commit85ca87f1edec433eb016de89b228d242b89dc337 (patch)
tree030bbaca406051ac08d24783fa66dd8b5de0f069
parentf244ee310fb39a57eae05295eeea08346b5533d4 (diff)
downloadelixir-85ca87f1edec433eb016de89b228d242b89dc337.tar.gz
Ensure changes in deps propagate to all umbrella children
This fix a long standing issue where users would have to delete _build after updating a dependency to recompile. This is done by a currently private and recursive task called will_recompile.
-rw-r--r--lib/mix/lib/mix/dep/lock.ex23
-rw-r--r--lib/mix/lib/mix/project.ex4
-rw-r--r--lib/mix/lib/mix/tasks/deps.compile.ex2
-rw-r--r--lib/mix/lib/mix/tasks/will_recompile.ex23
-rw-r--r--lib/mix/test/mix/tasks/will_recompile_test.exs27
5 files changed, 54 insertions, 25 deletions
diff --git a/lib/mix/lib/mix/dep/lock.ex b/lib/mix/lib/mix/dep/lock.ex
index d6279fa36..e92fdafe4 100644
--- a/lib/mix/lib/mix/dep/lock.ex
+++ b/lib/mix/lib/mix/dep/lock.ex
@@ -5,27 +5,6 @@
defmodule Mix.Dep.Lock do
@moduledoc false
- @manifest "compile.lock"
-
- @doc """
- Returns the manifest file for dependencies.
-
- The manifest is used to check if the lockfile
- itself is up to date.
- """
- def manifest(path \\ Mix.Project.manifest_path()) do
- Path.join(path, @manifest)
- end
-
- @doc """
- Touches the manifest file to force recompilation.
- """
- def touch_manifest do
- path = Mix.Project.manifest_path()
- File.mkdir_p!(path)
- File.touch!(manifest(path))
- end
-
@doc """
Reads the lockfile, returns a map containing
each app name and its current lock information.
@@ -57,7 +36,7 @@ defmodule Mix.Dep.Lock do
end
File.write!(lockfile(), ["%{\n", lines, "}\n"])
- touch_manifest()
+ Mix.Task.run("will_recompile")
end
:ok
diff --git a/lib/mix/lib/mix/project.ex b/lib/mix/lib/mix/project.ex
index 3f5b3e46b..a3e576091 100644
--- a/lib/mix/lib/mix/project.ex
+++ b/lib/mix/lib/mix/project.ex
@@ -207,7 +207,7 @@ defmodule Mix.Project do
"""
@spec config_files() :: [Path.t()]
def config_files do
- [Mix.Dep.Lock.manifest() | Mix.ProjectStack.config_files()]
+ [Mix.Tasks.WillRecompile.manifest() | Mix.ProjectStack.config_files()]
end
@doc """
@@ -220,7 +220,7 @@ defmodule Mix.Project do
@doc since: "1.7.0"
@spec config_mtime() :: posix_mtime when posix_mtime: integer()
def config_mtime do
- Mix.Dep.Lock.manifest()
+ Mix.Tasks.WillRecompile.manifest()
|> Mix.Utils.last_modified()
|> max(Mix.ProjectStack.config_mtime())
end
diff --git a/lib/mix/lib/mix/tasks/deps.compile.ex b/lib/mix/lib/mix/tasks/deps.compile.ex
index 3567e35ba..e59973c02 100644
--- a/lib/mix/lib/mix/tasks/deps.compile.ex
+++ b/lib/mix/lib/mix/tasks/deps.compile.ex
@@ -101,7 +101,7 @@ defmodule Mix.Tasks.Deps.Compile do
compiled? and fetchable?
end)
- if true in compiled, do: Mix.Dep.Lock.touch_manifest(), else: :ok
+ if true in compiled, do: Mix.Task.run("will_recompile"), else: :ok
end
defp maybe_clean(dep, opts) do
diff --git a/lib/mix/lib/mix/tasks/will_recompile.ex b/lib/mix/lib/mix/tasks/will_recompile.ex
new file mode 100644
index 000000000..303a5fe95
--- /dev/null
+++ b/lib/mix/lib/mix/tasks/will_recompile.ex
@@ -0,0 +1,23 @@
+defmodule Mix.Tasks.WillRecompile do
+ use Mix.Task
+
+ @moduledoc false
+ @recursive true
+ @manifest "compile.lock"
+
+ @doc """
+ Returns the will_recompile manifest for the project.
+ """
+ def manifest(path \\ Mix.Project.manifest_path()) do
+ Path.join(path, @manifest)
+ end
+
+ @doc """
+ Annotates the current project will recompile.
+ """
+ def run(_) do
+ path = Mix.Project.manifest_path()
+ File.mkdir_p!(path)
+ File.touch!(manifest(path))
+ end
+end
diff --git a/lib/mix/test/mix/tasks/will_recompile_test.exs b/lib/mix/test/mix/tasks/will_recompile_test.exs
new file mode 100644
index 000000000..206195049
--- /dev/null
+++ b/lib/mix/test/mix/tasks/will_recompile_test.exs
@@ -0,0 +1,27 @@
+Code.require_file("../../test_helper.exs", __DIR__)
+
+defmodule Mix.Tasks.WillRecompileTest do
+ use MixTest.Case
+
+ test "marks current project to recompile" do
+ in_fixture("deps_status/deps/ok", fn ->
+ Mix.Project.in_project(:ok, ".", fn _ ->
+ refute File.exists?("_build/dev/lib/ok/.mix/compile.lock")
+ Mix.Task.run("will_recompile")
+ assert File.exists?("_build/dev/lib/ok/.mix/compile.lock")
+ end)
+ end)
+ end
+
+ test "marks all projects in umbrella to recompile" do
+ in_fixture("umbrella_dep/deps/umbrella", fn ->
+ Mix.Project.in_project(:umbrella, ".", fn _ ->
+ refute File.exists?("_build/dev/lib/foo/.mix/compile.lock")
+ refute File.exists?("_build/dev/lib/bar/.mix/compile.lock")
+ Mix.Task.run("will_recompile")
+ assert File.exists?("_build/dev/lib/foo/.mix/compile.lock")
+ assert File.exists?("_build/dev/lib/bar/.mix/compile.lock")
+ end)
+ end)
+ end
+end