@@ -70,16 +70,19 @@ defmodule Mix.Tasks.Deps.Partition do
70
70
end
71
71
end )
72
72
73
- send_deps_and_server_loop ( clients , [ ] , deps , [ ] )
73
+ status = Map . new ( deps , & { & 1 . app , :pending } )
74
+ send_deps_and_server_loop ( clients , [ ] , deps , status )
74
75
end
75
76
76
- defp send_deps_and_server_loop ( available , busy , deps , completed ) do
77
- { available , busy , deps } = send_deps ( available , busy , deps , completed )
78
- server_loop ( available , busy , deps , completed )
77
+ defp send_deps_and_server_loop ( available , busy , deps , status ) do
78
+ { available , busy , deps } = send_deps ( available , busy , deps , status )
79
+ server_loop ( available , busy , deps , status )
79
80
end
80
81
81
- defp send_deps ( [ client | available ] , busy , deps , completed ) do
82
- case pop_with ( deps , fn dep -> Enum . all? ( dep . deps , & not_pending? ( & 1 . app , deps , completed ) ) end ) do
82
+ defp send_deps ( [ client | available ] , busy , deps , status ) do
83
+ case pop_with ( deps , fn dep ->
84
+ Enum . all? ( dep . deps , & ( Map . get ( status , & 1 . app , :unknown ) != :pending ) )
85
+ end ) do
83
86
:error ->
84
87
{ [ client | available ] , busy , deps }
85
88
@@ -89,35 +92,34 @@ defmodule Mix.Tasks.Deps.Partition do
89
92
end
90
93
91
94
:gen_tcp . send ( client . socket , "#{ dep . app } \n " )
92
- send_deps ( available , [ client | busy ] , deps , completed )
95
+ send_deps ( available , [ client | busy ] , deps , status )
93
96
end
94
97
end
95
98
96
- defp send_deps ( [ ] , busy , deps , _completed ) do
99
+ defp send_deps ( [ ] , busy , deps , _status ) do
97
100
{ [ ] , busy , deps }
98
101
end
99
102
100
- defp not_pending? ( app , deps , completed ) do
101
- Keyword . has_key? ( completed , app ) or not Enum . any? ( deps , & ( & 1 . app == app ) )
102
- end
103
-
104
- defp server_loop ( available , _busy = [ ] , _deps = [ ] , completed ) do
103
+ defp server_loop ( available , _busy = [ ] , _deps = [ ] , status ) do
105
104
shutdown_clients ( available )
106
- Enum . any? ( completed , & ( elem ( & 1 , 1 ) == true ) )
105
+ Enum . any? ( status , & ( elem ( & 1 , 1 ) == true ) )
107
106
end
108
107
109
- defp server_loop ( available , busy , deps , completed ) do
108
+ defp server_loop ( available , busy , deps , status ) do
110
109
receive do
111
110
{ :tcp , socket , data } ->
112
- [ app , status ] = data |> String . trim ( ) |> String . split ( ":" ) |> Enum . map ( & String . to_atom / 1 )
111
+ [ app , compiled? ] =
112
+ data |> String . trim ( ) |> String . split ( ":" ) |> Enum . map ( & String . to_atom / 1 )
113
+
113
114
deps = Enum . reject ( deps , & ( & 1 . app == app ) )
115
+ status = Map . replace! ( status , app , compiled? )
114
116
{ client , busy } = pop_with ( busy , & ( & 1 . socket == socket ) )
115
117
116
118
if Mix . debug? ( ) do
117
119
Mix . shell ( ) . info ( "-- mix deps.partition #{ client . index } compiled #{ app } " )
118
120
end
119
121
120
- send_deps_and_server_loop ( [ client | available ] , busy , deps , [ { app , status } | completed ] )
122
+ send_deps_and_server_loop ( [ client | available ] , busy , deps , status )
121
123
122
124
{ :tcp_closed , socket } ->
123
125
shutdown_clients ( available ++ busy )
@@ -134,7 +136,7 @@ defmodule Mix.Tasks.Deps.Partition do
134
136
IO . write ( [ Integer . to_string ( index ) , "> " , data , terminator ] )
135
137
end
136
138
137
- server_loop ( available , busy , deps , completed )
139
+ server_loop ( available , busy , deps , status )
138
140
end
139
141
end
140
142
0 commit comments