Skip to content

Commit d31a58f

Browse files
committed
Don't go through hex.pm API server to install Hex
Signed-off-by: Eric Meadows-Jönsson <[email protected]>
1 parent f97ab26 commit d31a58f

File tree

1 file changed

+29
-4
lines changed

1 file changed

+29
-4
lines changed

lib/mix/lib/mix/tasks/local.hex.ex

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
defmodule Mix.Tasks.Local.Hex do
22
use Mix.Task
33

4-
@hex_url "https://hex.pm/installs/hex.ez"
5-
@hex_requirement ">= 0.5.0"
4+
@hex_s3 "https://s3.amazonaws.com/s3.hex.pm"
5+
@hex_list_url @hex_s3 <> "/installs/list.csv"
6+
@hex_archive_url @hex_s3 <> "/installs/[VERSION]/hex.ez"
7+
@hex_requirement ">= 0.5.0"
68

79
@shortdoc "Install hex locally"
810

911
@moduledoc """
10-
Install hex locally from #{@hex_url}.
12+
Install Hex locally.
1113
1214
mix local.hex
1315
@@ -18,7 +20,9 @@ defmodule Mix.Tasks.Local.Hex do
1820
"""
1921
@spec run(OptionParser.argv) :: boolean
2022
def run(args) do
21-
url = @hex_url <> "?elixir=" <> System.version
23+
version = get_matching_version()
24+
url = String.replace(@hex_archive_url, "[VERSION]", version)
25+
2226
Mix.Tasks.Archive.Install.run [url, "--shell" | args]
2327
end
2428

@@ -75,4 +79,25 @@ defmodule Mix.Tasks.Local.Hex do
7579
:erlang.raise(kind, reason, stacktrace)
7680
end
7781
end
82+
83+
defp get_matching_version do
84+
Mix.Utils.read_path!(@hex_list_url)
85+
|> parse_csv
86+
|> all_eligibile_versions
87+
|> List.last
88+
end
89+
90+
defp parse_csv(body) do
91+
:binary.split(body, "\n", [:global, :trim])
92+
|> Enum.flat_map(fn line ->
93+
[_hex|elixirs] = :binary.split(line, ",", [:global, :trim])
94+
elixirs
95+
end)
96+
|> Enum.uniq
97+
end
98+
99+
defp all_eligibile_versions(versions) do
100+
{:ok, current_version} = Version.parse(System.version)
101+
Enum.filter(versions, &Version.compare(&1, current_version) != :gt)
102+
end
78103
end

0 commit comments

Comments
 (0)