diff --git a/lib/mix/lib/mix/scm/git.ex b/lib/mix/lib/mix/scm/git.ex index 9bd8ca0eae8..75ae91ecf66 100644 --- a/lib/mix/lib/mix/scm/git.ex +++ b/lib/mix/lib/mix/scm/git.ex @@ -29,10 +29,12 @@ defmodule Mix.SCM.Git do case opts[:lock] do { :git, lock_repo, lock_rev, lock_opts } -> File.cd!(opts[:dest], fn -> + rev_info = get_rev_info cond do - lock_repo != opts[:git] -> :outdated + lock_repo != opts[:git] -> :outdated lock_opts != get_lock_opts(opts) -> :outdated - lock_rev != get_rev -> :mismatch + lock_rev != rev_info[:rev] -> :mismatch + lock_repo != rev_info[:origin] -> :outdated true -> :ok end end) @@ -58,6 +60,10 @@ defmodule Mix.SCM.Git do def update(opts) do File.cd! opts[:dest], fn -> + # Ensures origin is set the lock repo + location = location(opts[:git]) + update_origin(location) + command = "git fetch --force --progress" if opts[:tag] do command = command <> " --tags" @@ -92,7 +98,12 @@ defmodule Mix.SCM.Git do end defp get_lock(opts, fresh) do - lock = if fresh, do: get_rev, else: get_lock_rev(opts[:lock]) + lock = if fresh do + rev_info = get_rev_info + rev_info[:rev] + else + get_lock_rev(opts[:lock]) + end { :git, opts[:git], lock, get_lock_opts(opts) } end @@ -117,23 +128,15 @@ defmodule Mix.SCM.Git do end end - defp get_rev do - check_rev System.cmd('git rev-parse --verify --quiet HEAD') - end - - defp check_rev([]), do: nil - defp check_rev(list), do: check_rev(list, []) - - defp check_rev([h|t], acc) when h in ?a..?f or h in ?0..?9 do - check_rev(t, [h|acc]) - end - - defp check_rev(fin, acc) when fin == [?\n] or fin == [] do - Enum.reverse(acc) |> iolist_to_binary + defp get_rev_info do + [origin, rev] = System.cmd('git config remote.origin.url && git rev-parse --verify --quiet HEAD') + |> iolist_to_binary + |> String.split("\n", trim: true) + [ origin: origin, rev: rev ] end - defp check_rev(_, _) do - nil + defp update_origin(location) do + System.cmd('git config remote.origin.url #{location}') end defp run_cmd_or_raise(command) do