Skip to content

Commit e309da4

Browse files
committed
Ensure dependencies are marked as fetched before writes to avoid races
1 parent e5ace9b commit e309da4

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

lib/mix/lib/mix/dep/fetcher.ex

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ defmodule Mix.Dep.Fetcher do
6363

6464
# If the dependency is not available or we have a lock mismatch
6565
out_of_date?(dep) ->
66+
# Mark the dependency as fetched upfront, in case updating
67+
# fails, get interrupted, or corrupted.
68+
mark_as_fetched([dep])
69+
6670
new =
6771
if scm.checked_out?(opts) do
6872
Mix.shell().info("* Updating #{format_dep(dep)}")
@@ -73,7 +77,6 @@ defmodule Mix.Dep.Fetcher do
7377
end
7478

7579
if new do
76-
mark_as_fetched([dep])
7780
dep = put_in(dep.opts[:lock], new)
7881
{dep, [app | acc], Map.put(lock, app, new)}
7982
else
@@ -108,11 +111,13 @@ defmodule Mix.Dep.Fetcher do
108111
[]
109112
end
110113

114+
# Mark parents as fetched before we write the lock file.
115+
mark_as_fetched(parent_deps)
116+
111117
# Merge the new lock on top of the old to guarantee we don't
112118
# leave out things that could not be fetched and save it.
113119
lock = Map.merge(old_lock, new_lock)
114120
Mix.Dep.Lock.write(lock, opts)
115-
mark_as_fetched(parent_deps)
116121

117122
# See if any of the deps diverged and abort.
118123
show_diverged!(Enum.filter(all_deps, &Mix.Dep.diverged?/1))

0 commit comments

Comments
 (0)