chore(update_appup): insert `load_module`s after `application:stop`

If there is already any `application:stop(Application)` call in the
appup instructions, we prefer to add `load_module` instructions after
it, so we can be sure that the load is replaced safely.
This commit is contained in:
Thales Macedo Garitezi 2021-12-17 16:31:04 -03:00
parent 42ca5ab5a9
commit fef8a18bfb
No known key found for this signature in database
GPG Key ID: DD279F8152A9B6DD
1 changed files with 22 additions and 2 deletions

View File

@ -298,8 +298,11 @@ do_merge_update_actions(App, Vsn, {New0, Changed0, Deleted0}, OldActions) ->
Reloads = [{load_module, M, brutal_purge, soft_purge, []}
|| not contains_restart_application(App, OldActions),
M <- Changed ++ New],
Reloads ++
OldActions ++
{OldActionsWithStop, OldActionsAfterStop} =
find_application_stop_instruction(App, OldActions),
OldActionsWithStop ++
Reloads ++
OldActionsAfterStop ++
[{delete_module, M} || M <- Deleted] ++
AppSpecific.
@ -308,6 +311,23 @@ do_merge_update_actions(App, Vsn, {New0, Changed0, Deleted0}, OldActions) ->
contains_restart_application(Application, Actions) ->
lists:member({restart_application, Application}, Actions).
%% If there is an `application:stop(Application)' call in the
%% instructions, we insert `load_module' instructions after it.
find_application_stop_instruction(Application, Actions) ->
{Before, After0} =
lists:splitwith(
fun({apply, {application, stop, [Application]}}) ->
false;
(_) ->
true
end, Actions),
case After0 of
[StopInst | After] ->
{Before ++ [StopInst], After};
[] ->
{[], Before}
end.
%% @doc Process the existing actions to exclude modules that are
%% already handled
process_old_action({purge, Modules}) ->