Skip to content

Commit e1b265a

Browse files
authored
Fix relative path resolution in "mix release" for symlinked scripts (#13796)
1 parent 14595bb commit e1b265a

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

lib/mix/lib/mix/tasks/release.init.ex

+11-2
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,17 @@ defmodule Mix.Tasks.Release.Init do
8787
#!/bin/sh
8888
set -e
8989
90-
SELF=$(readlink "$0" || true)
91-
if [ -z "$SELF" ]; then SELF="$0"; fi
90+
readlink_f () {
91+
cd "$(dirname "$1")" > /dev/null
92+
filename="$(basename "$1")"
93+
if [ -h "$filename" ]; then
94+
readlink_f "$(readlink "$filename")"
95+
else
96+
echo "$(pwd -P)/$filename"
97+
fi
98+
}
99+
100+
SELF=$(readlink_f "$0")
92101
RELEASE_ROOT="$(CDPATH='' cd "$(dirname "$SELF")/.." && pwd -P)"
93102
export RELEASE_ROOT
94103
RELEASE_NAME="${RELEASE_NAME:-"<%= @release.name %>"}"

lib/mix/test/mix/tasks/release_test.exs

+34
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,40 @@ defmodule Mix.Tasks.ReleaseTest do
786786
end)
787787
end
788788

789+
@tag :unix
790+
test "works properly with an absolute symlink to release" do
791+
in_fixture("release_test", fn ->
792+
Mix.Project.in_project(:release_test, ".", fn _ ->
793+
Mix.Task.run("release")
794+
795+
File.ln_s!(
796+
Path.absname("_build/#{Mix.env()}/rel/release_test/bin/release_test"),
797+
Path.absname("release_test")
798+
)
799+
800+
script = Path.absname("release_test")
801+
{hello_world, 0} = System.cmd(script, ["eval", "IO.puts :hello_world"])
802+
assert String.trim_trailing(hello_world) == "hello_world"
803+
end)
804+
end)
805+
end
806+
807+
@tag :unix
808+
test "works properly with a relative symlink to release" do
809+
in_fixture("release_test", fn ->
810+
Mix.Project.in_project(:release_test, ".", fn _ ->
811+
Mix.Task.run("release")
812+
813+
File.mkdir!("bin")
814+
File.ln_s!("../_build/#{Mix.env()}/rel/release_test/bin/release_test", "bin/release_test")
815+
816+
script = Path.absname("bin/release_test")
817+
{hello_world, 0} = System.cmd(script, ["eval", "IO.puts :hello_world"])
818+
assert String.trim_trailing(hello_world) == "hello_world"
819+
end)
820+
end)
821+
end
822+
789823
defp open_port(command, args, env \\ []) do
790824
env = for {k, v} <- env, do: {to_charlist(k), to_charlist(v)}
791825
Port.open({:spawn_executable, to_charlist(command)}, [:hide, args: args, env: env])

0 commit comments

Comments
 (0)