diff --git a/lib/mix/lib/mix/scm/git.ex b/lib/mix/lib/mix/scm/git.ex index cb2c29f5c35..2cb1e262beb 100644 --- a/lib/mix/lib/mix/scm/git.ex +++ b/lib/mix/lib/mix/scm/git.ex @@ -420,13 +420,21 @@ defmodule Mix.SCM.Git do version = ["--version"] |> git!("") - |> parse_version() + |> parse_version_output() Mix.State.put(:git_version, version) version end end + defp parse_version_output(output) do + output + |> String.trim() + |> String.split("\n") + |> List.last() + |> parse_version() + end + defp parse_version("git version " <> version) do version |> String.split(".") @@ -435,6 +443,10 @@ defmodule Mix.SCM.Git do |> List.to_tuple() end + defp parse_version(other) do + Mix.raise("Unable to parse Git version from: #{inspect(other)}") + end + defp format_version(version) do version |> Tuple.to_list() |> Enum.join(".") end diff --git a/lib/mix/test/mix/tasks/deps.git_test.exs b/lib/mix/test/mix/tasks/deps.git_test.exs index 58e52f196e9..985d0405bda 100644 --- a/lib/mix/test/mix/tasks/deps.git_test.exs +++ b/lib/mix/test/mix/tasks/deps.git_test.exs @@ -72,6 +72,27 @@ defmodule Mix.Tasks.DepsGitTest do end) end + test "gets Git repos with git trace enabled" do + on_exit(fn -> + System.delete_env("GIT_TRACE") + :ets.delete(Mix.State, :git_version) + end) + + System.put_env("GIT_TRACE", "1") + :ets.delete(Mix.State, :git_version) + + in_fixture("no_mixfile", fn -> + Mix.Project.push(GitApp) + + Mix.Tasks.Deps.Get.run([]) + message = "* Getting git_repo (#{fixture_path("git_repo")})" + assert_received {:mix_shell, :info, [^message]} + + assert File.read!("mix.lock") =~ + ~r/"git_repo": {:git, #{inspect(fixture_path("git_repo"))}, "[a-f0-9]+", \[\]}/ + end) + end + test "gets and updates Git repos with submodules" do in_fixture("no_mixfile", fn -> Mix.Project.push(GitSubmodulesApp)