From 5a05f80b78343177209a9dd5e332d505ab78308b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Duarte?= Date: Mon, 26 Aug 2024 15:30:55 -0300 Subject: [PATCH 1/6] fix: adjust $SELF to properly deal with relative paths --- lib/mix/lib/mix/tasks/release.init.ex | 4 ++- lib/mix/test/mix/tasks/release_test.exs | 36 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/lib/mix/lib/mix/tasks/release.init.ex b/lib/mix/lib/mix/tasks/release.init.ex index d0df7f22c54..3db6ff3b353 100644 --- a/lib/mix/lib/mix/tasks/release.init.ex +++ b/lib/mix/lib/mix/tasks/release.init.ex @@ -87,8 +87,10 @@ defmodule Mix.Tasks.Release.Init do #!/bin/sh set -e - SELF=$(readlink "$0" || true) + SELF=$(readlink -f "$0" || true) if [ -z "$SELF" ]; then SELF="$0"; fi + if [ "${SELF#/}" = "$SELF" ]; then SELF="$(cd "$(dirname "$0")" && pwd -P)/$(basename "$SELF")"; fi + SELF=$(cd "$(dirname "$SELF")" && pwd -P)/$(basename "$SELF") RELEASE_ROOT="$(CDPATH='' cd "$(dirname "$SELF")/.." && pwd -P)" export RELEASE_ROOT RELEASE_NAME="${RELEASE_NAME:-"<%= @release.name %>"}" diff --git a/lib/mix/test/mix/tasks/release_test.exs b/lib/mix/test/mix/tasks/release_test.exs index 5adaa70b561..063a8580ae5 100644 --- a/lib/mix/test/mix/tasks/release_test.exs +++ b/lib/mix/test/mix/tasks/release_test.exs @@ -786,6 +786,42 @@ defmodule Mix.Tasks.ReleaseTest do end) end + test "works properly with an absolute symlink to release" do + in_fixture("release_test", fn -> + Mix.Project.in_project(:release_test, ".", fn _ -> + Mix.Task.run("release") + + File.ln_s!( + "_build/dev/rel/release_test/bin/release_test", + "release_test" + ) + + script = Path.absname("release_test") + {hello_world, 0} = System.cmd(script, ["eval", "IO.puts :hello_world"]) + assert String.trim_trailing(hello_world) == "hello_world" + end) + end) + end + + test "works properly with a relative symlink to release" do + in_fixture("release_test", fn -> + Mix.Project.in_project(:release_test, ".", fn _ -> + Mix.Task.run("release") + + File.mkdir!("bin") + + File.ln_s!( + "../_build/dev/rel/release_test/bin/release_test", + "bin/release_test" + ) + + script = Path.absname("bin/release_test") + {hello_world, 0} = System.cmd(script, ["eval", "IO.puts :hello_world"]) + assert String.trim_trailing(hello_world) == "hello_world" + end) + end) + end + defp open_port(command, args, env \\ []) do env = for {k, v} <- env, do: {to_charlist(k), to_charlist(v)} Port.open({:spawn_executable, to_charlist(command)}, [:hide, args: args, env: env]) From a7266ada3ff3d1f464ff098b95d4333d17a02e5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Duarte?= Date: Mon, 26 Aug 2024 16:45:17 -0300 Subject: [PATCH 2/6] fix: tries to address test issues on windows, and add clause to remove create files after test --- lib/mix/test/mix/tasks/release_test.exs | 38 ++++++++++++++++++------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/lib/mix/test/mix/tasks/release_test.exs b/lib/mix/test/mix/tasks/release_test.exs index 063a8580ae5..206e2d20091 100644 --- a/lib/mix/test/mix/tasks/release_test.exs +++ b/lib/mix/test/mix/tasks/release_test.exs @@ -791,14 +791,23 @@ defmodule Mix.Tasks.ReleaseTest do Mix.Project.in_project(:release_test, ".", fn _ -> Mix.Task.run("release") + script_name = "release_test" + + script_name = + if match?({:win32, _}, :os.type()), do: "#{script_name}.bat", else: script_name + File.ln_s!( - "_build/dev/rel/release_test/bin/release_test", - "release_test" + Path.join("_build/dev/rel/release_test/bin", script_name), + script_name ) - script = Path.absname("release_test") - {hello_world, 0} = System.cmd(script, ["eval", "IO.puts :hello_world"]) - assert String.trim_trailing(hello_world) == "hello_world" + try do + script = Path.absname(script_name) + {hello_world, 0} = System.cmd(script, ["eval", "IO.puts :hello_world"]) + assert String.trim_trailing(hello_world) == "hello_world" + after + File.rm!(script_name) + end end) end) end @@ -808,16 +817,25 @@ defmodule Mix.Tasks.ReleaseTest do Mix.Project.in_project(:release_test, ".", fn _ -> Mix.Task.run("release") + script_name = "release_test" + + script_name = + if match?({:win32, _}, :os.type()), do: "#{script_name}.bat", else: script_name + File.mkdir!("bin") File.ln_s!( - "../_build/dev/rel/release_test/bin/release_test", - "bin/release_test" + Path.join("../_build/dev/rel/release_test/bin", script_name), + Path.join("bin", script_name) ) - script = Path.absname("bin/release_test") - {hello_world, 0} = System.cmd(script, ["eval", "IO.puts :hello_world"]) - assert String.trim_trailing(hello_world) == "hello_world" + try do + script = Path.absname(Path.join("bin", script_name)) + {hello_world, 0} = System.cmd(script, ["eval", "IO.puts :hello_world"]) + assert String.trim_trailing(hello_world) == "hello_world" + after + File.rm_rf!("bin") + end end) end) end From 920cdb988443bc73700afef16e2fcd7f8d6a1042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Duarte?= Date: Tue, 27 Aug 2024 09:09:44 -0300 Subject: [PATCH 3/6] fix: using recursive function to correctly resolve symlinks --- lib/mix/lib/mix/tasks/release.init.ex | 15 +++++++--- lib/mix/test/mix/tasks/release_test.exs | 38 +++++++------------------ 2 files changed, 21 insertions(+), 32 deletions(-) diff --git a/lib/mix/lib/mix/tasks/release.init.ex b/lib/mix/lib/mix/tasks/release.init.ex index 3db6ff3b353..811c9b69293 100644 --- a/lib/mix/lib/mix/tasks/release.init.ex +++ b/lib/mix/lib/mix/tasks/release.init.ex @@ -87,10 +87,17 @@ defmodule Mix.Tasks.Release.Init do #!/bin/sh set -e - SELF=$(readlink -f "$0" || true) - if [ -z "$SELF" ]; then SELF="$0"; fi - if [ "${SELF#/}" = "$SELF" ]; then SELF="$(cd "$(dirname "$0")" && pwd -P)/$(basename "$SELF")"; fi - SELF=$(cd "$(dirname "$SELF")" && pwd -P)/$(basename "$SELF") + readlink_f () { + cd "$(dirname "$1")" > /dev/null + filename="$(basename "$1")" + if [ -h "$filename" ]; then + readlink_f "$(readlink "$filename")" + else + echo "$(pwd -P)/$filename" + fi + } + + SELF=$(readlink_f "$0") RELEASE_ROOT="$(CDPATH='' cd "$(dirname "$SELF")/.." && pwd -P)" export RELEASE_ROOT RELEASE_NAME="${RELEASE_NAME:-"<%= @release.name %>"}" diff --git a/lib/mix/test/mix/tasks/release_test.exs b/lib/mix/test/mix/tasks/release_test.exs index 206e2d20091..063a8580ae5 100644 --- a/lib/mix/test/mix/tasks/release_test.exs +++ b/lib/mix/test/mix/tasks/release_test.exs @@ -791,23 +791,14 @@ defmodule Mix.Tasks.ReleaseTest do Mix.Project.in_project(:release_test, ".", fn _ -> Mix.Task.run("release") - script_name = "release_test" - - script_name = - if match?({:win32, _}, :os.type()), do: "#{script_name}.bat", else: script_name - File.ln_s!( - Path.join("_build/dev/rel/release_test/bin", script_name), - script_name + "_build/dev/rel/release_test/bin/release_test", + "release_test" ) - try do - script = Path.absname(script_name) - {hello_world, 0} = System.cmd(script, ["eval", "IO.puts :hello_world"]) - assert String.trim_trailing(hello_world) == "hello_world" - after - File.rm!(script_name) - end + script = Path.absname("release_test") + {hello_world, 0} = System.cmd(script, ["eval", "IO.puts :hello_world"]) + assert String.trim_trailing(hello_world) == "hello_world" end) end) end @@ -817,25 +808,16 @@ defmodule Mix.Tasks.ReleaseTest do Mix.Project.in_project(:release_test, ".", fn _ -> Mix.Task.run("release") - script_name = "release_test" - - script_name = - if match?({:win32, _}, :os.type()), do: "#{script_name}.bat", else: script_name - File.mkdir!("bin") File.ln_s!( - Path.join("../_build/dev/rel/release_test/bin", script_name), - Path.join("bin", script_name) + "../_build/dev/rel/release_test/bin/release_test", + "bin/release_test" ) - try do - script = Path.absname(Path.join("bin", script_name)) - {hello_world, 0} = System.cmd(script, ["eval", "IO.puts :hello_world"]) - assert String.trim_trailing(hello_world) == "hello_world" - after - File.rm_rf!("bin") - end + script = Path.absname("bin/release_test") + {hello_world, 0} = System.cmd(script, ["eval", "IO.puts :hello_world"]) + assert String.trim_trailing(hello_world) == "hello_world" end) end) end From d69df589bb51a38479bda4bcd508aa57b917fd2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Duarte?= Date: Tue, 27 Aug 2024 09:22:56 -0300 Subject: [PATCH 4/6] fix: make sure to return to original_dir afterwards --- lib/mix/lib/mix/tasks/release.init.ex | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/mix/lib/mix/tasks/release.init.ex b/lib/mix/lib/mix/tasks/release.init.ex index 811c9b69293..cda5c41678e 100644 --- a/lib/mix/lib/mix/tasks/release.init.ex +++ b/lib/mix/lib/mix/tasks/release.init.ex @@ -88,13 +88,16 @@ defmodule Mix.Tasks.Release.Init do set -e readlink_f () { + original_dir=$(pwd) cd "$(dirname "$1")" > /dev/null filename="$(basename "$1")" if [ -h "$filename" ]; then - readlink_f "$(readlink "$filename")" + result=$(readlink_f "$(readlink "$filename")") else - echo "$(pwd -P)/$filename" + result="$(pwd -P)/$filename" fi + cd "$original_dir" > /dev/null + echo "$result" } SELF=$(readlink_f "$0") From 4b0318795434ce5ba4c3e225e942f1a0bf9f625a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Duarte?= Date: Tue, 27 Aug 2024 11:22:04 -0300 Subject: [PATCH 5/6] fix: revert last commit to original readlink_f implementation --- lib/mix/lib/mix/tasks/release.init.ex | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/mix/lib/mix/tasks/release.init.ex b/lib/mix/lib/mix/tasks/release.init.ex index cda5c41678e..811c9b69293 100644 --- a/lib/mix/lib/mix/tasks/release.init.ex +++ b/lib/mix/lib/mix/tasks/release.init.ex @@ -88,16 +88,13 @@ defmodule Mix.Tasks.Release.Init do set -e readlink_f () { - original_dir=$(pwd) cd "$(dirname "$1")" > /dev/null filename="$(basename "$1")" if [ -h "$filename" ]; then - result=$(readlink_f "$(readlink "$filename")") + readlink_f "$(readlink "$filename")" else - result="$(pwd -P)/$filename" + echo "$(pwd -P)/$filename" fi - cd "$original_dir" > /dev/null - echo "$result" } SELF=$(readlink_f "$0") From c0097f73b717667c44e05df17ba2be3be4bce6a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Duarte?= Date: Tue, 27 Aug 2024 18:44:57 -0300 Subject: [PATCH 6/6] fix: setting tests unix-only --- lib/mix/test/mix/tasks/release_test.exs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/mix/test/mix/tasks/release_test.exs b/lib/mix/test/mix/tasks/release_test.exs index 063a8580ae5..35baa1d2709 100644 --- a/lib/mix/test/mix/tasks/release_test.exs +++ b/lib/mix/test/mix/tasks/release_test.exs @@ -786,14 +786,15 @@ defmodule Mix.Tasks.ReleaseTest do end) end + @tag :unix test "works properly with an absolute symlink to release" do in_fixture("release_test", fn -> Mix.Project.in_project(:release_test, ".", fn _ -> Mix.Task.run("release") File.ln_s!( - "_build/dev/rel/release_test/bin/release_test", - "release_test" + Path.absname("_build/#{Mix.env()}/rel/release_test/bin/release_test"), + Path.absname("release_test") ) script = Path.absname("release_test") @@ -803,17 +804,14 @@ defmodule Mix.Tasks.ReleaseTest do end) end + @tag :unix test "works properly with a relative symlink to release" do in_fixture("release_test", fn -> Mix.Project.in_project(:release_test, ".", fn _ -> Mix.Task.run("release") File.mkdir!("bin") - - File.ln_s!( - "../_build/dev/rel/release_test/bin/release_test", - "bin/release_test" - ) + File.ln_s!("../_build/#{Mix.env()}/rel/release_test/bin/release_test", "bin/release_test") script = Path.absname("bin/release_test") {hello_world, 0} = System.cmd(script, ["eval", "IO.puts :hello_world"])