@@ -86,7 +86,8 @@ do_(State) ->
86
86
DepsDict = deps_dict (rebar_state :all_deps (State )),
87
87
AltDeps = find_non_default_deps (Deps , State ),
88
88
FilteredNames = cull_default_names_if_profiles (Names , Deps , State ),
89
- case prepare_locks (FilteredNames , Deps , Locks , [], DepsDict , AltDeps ) of
89
+ Checkouts = [rebar_app_info :name (Dep ) || Dep <- rebar_state :all_checkout_deps (State )],
90
+ case prepare_locks (FilteredNames , Deps , Locks , [], DepsDict , AltDeps , Checkouts ) of
90
91
{error , Reason } ->
91
92
{error , Reason };
92
93
{Locks0 , Unlocks0 } ->
@@ -123,6 +124,9 @@ format_error({transitive_dependency, Name}) ->
123
124
io_lib :format (" Dependency ~ts is transitive and cannot be safely upgraded. "
124
125
" Promote it to your top-level rebar.config file to upgrade it." ,
125
126
[Name ]);
127
+ format_error ({checkout_dependency , Name }) ->
128
+ io_lib :format (" Dependency ~ts is a checkout dependency under _checkouts/ and checkouts cannot be upgraded." ,
129
+ [Name ]);
126
130
format_error (Reason ) ->
127
131
io_lib :format (" ~p " , [Reason ]).
128
132
@@ -190,20 +194,20 @@ cull_default_names_if_profiles(Names, Deps, State) ->
190
194
end , Names )
191
195
end .
192
196
193
- prepare_locks ([], _ , Locks , Unlocks , _Dict , _AltDeps ) ->
197
+ prepare_locks ([], _ , Locks , Unlocks , _Dict , _AltDeps , _Checkouts ) ->
194
198
{Locks , Unlocks };
195
- prepare_locks ([Name |Names ], Deps , Locks , Unlocks , Dict , AltDeps ) ->
199
+ prepare_locks ([Name |Names ], Deps , Locks , Unlocks , Dict , AltDeps , Checkouts ) ->
196
200
AtomName = binary_to_atom (Name , utf8 ),
197
201
case lists :keyfind (Name , 1 , Locks ) of
198
202
{_ , _ , 0 } = Lock ->
199
203
case rebar_utils :tup_find (AtomName , Deps ) of
200
204
false ->
201
205
? WARN (" Dependency ~ts has been removed and will not be upgraded" , [Name ]),
202
- prepare_locks (Names , Deps , Locks , Unlocks , Dict , AltDeps );
206
+ prepare_locks (Names , Deps , Locks , Unlocks , Dict , AltDeps , Checkouts );
203
207
Dep ->
204
208
{Source , NewLocks , NewUnlocks } = prepare_lock (Dep , Lock , Locks , Dict ),
205
209
prepare_locks (Names , Deps , NewLocks ,
206
- [{Name , Source , 0 } | NewUnlocks ++ Unlocks ], Dict , AltDeps )
210
+ [{Name , Source , 0 } | NewUnlocks ++ Unlocks ], Dict , AltDeps , Checkouts )
207
211
end ;
208
212
{_ , _ , Level } = Lock when Level > 0 ->
209
213
case rebar_utils :tup_find (AtomName , Deps ) of
@@ -212,15 +216,19 @@ prepare_locks([Name|Names], Deps, Locks, Unlocks, Dict, AltDeps) ->
212
216
Dep -> % Dep has been promoted
213
217
{Source , NewLocks , NewUnlocks } = prepare_lock (Dep , Lock , Locks , Dict ),
214
218
prepare_locks (Names , Deps , NewLocks ,
215
- [{Name , Source , 0 } | NewUnlocks ++ Unlocks ], Dict , AltDeps )
219
+ [{Name , Source , 0 } | NewUnlocks ++ Unlocks ], Dict , AltDeps , Checkouts )
216
220
end ;
217
221
false ->
218
- case rebar_utils :tup_find (AtomName , AltDeps ) of
222
+ case lists :member (atom_to_binary (AtomName , utf8 ), Checkouts ) of
223
+ true ->
224
+ ? PRV_ERROR ({checkout_dependency , Name });
219
225
false ->
220
- % % TODO: output a different error if the app is a checkout
221
- ? PRV_ERROR ({unknown_dependency , Name });
222
- _ -> % non-default profile dependency found, pass through
223
- prepare_locks (Names , Deps , Locks , Unlocks , Dict , AltDeps )
226
+ case rebar_utils :tup_find (AtomName , AltDeps ) of
227
+ false ->
228
+ ? PRV_ERROR ({unknown_dependency , Name });
229
+ _ -> % non-default profile dependency found, pass through
230
+ prepare_locks (Names , Deps , Locks , Unlocks , Dict , AltDeps , Checkouts )
231
+ end
224
232
end
225
233
end .
226
234
0 commit comments