diff --git a/scripts/update_appup.escript b/scripts/update_appup.escript index 214c03141..1eb769252 100755 --- a/scripts/update_appup.escript +++ b/scripts/update_appup.escript @@ -12,6 +12,10 @@ added to each patch release preceding the current release. If an entry for a module already exists, this module is ignored. The existing actions are kept. +Please note that it only compares the current release with its +predecessor, assuming that the upgrade actions for the older releases +are correct. + Note: The defaults are set up for emqx, but they can be tuned to support other repos too. @@ -76,7 +80,12 @@ main(Options = #{check := Check}, Baseline) -> process_app(Baseline, Check, App, AppUpgrade, AppDowngrade) end , Apps - ). + ), + log(" +NOTE: Please review the changes manually. This script does not know about NIF +changes, supervisor changes, process restarts and so on. Also the load order of +the beam files might need updating. +"). process_app(_, _, App, {[], [], []}, {[], [], []}) -> %% No changes, just check the appup file if present: @@ -87,17 +96,17 @@ process_app(_, _, App, {[], [], []}, {[], [], []}) -> undefined -> ok end; -process_app(PredVersion, _Check, App, Upgrade, Downgrade) -> +process_app(PredVersion, Check, App, Upgrade, Downgrade) -> case locate(App, ".appup.src") of {ok, AppupFile} -> - update_appup(PredVersion, AppupFile, Upgrade, Downgrade); + update_appup(Check, PredVersion, AppupFile, Upgrade, Downgrade); undefined -> case create_stub(App) of false -> %% External dependency, skip ok; AppupFile -> - update_appup(PredVersion, AppupFile, Upgrade, Downgrade) + update_appup(Check, PredVersion, AppupFile, Upgrade, Downgrade) end end. @@ -112,7 +121,7 @@ create_stub(App) -> false end. -update_appup(PredVersion, File, UpgradeChanges, DowngradeChanges) -> +update_appup(Check, PredVersion, File, UpgradeChanges, DowngradeChanges) -> log("Updating appup: ~p~n", [File]), {_, Upgrade0, Downgrade0} = read_appup(File), Upgrade = update_actions(PredVersion, UpgradeChanges, Upgrade0), @@ -136,7 +145,7 @@ do_update_actions(Changes, {Vsn, Actions}) -> {Vsn, process_changes(Changes, Actions)}. process_changes({New0, Changed0, Deleted0}, OldActions) -> - AlreadyHandled = lists:map(fun(It) -> element(2, It) end, OldActions), + AlreadyHandled = lists:flatten(lists:map(fun process_old_action/1, OldActions)), New = New0 -- AlreadyHandled, Changed = Changed0 -- AlreadyHandled, Deleted = Deleted0 -- AlreadyHandled, @@ -144,6 +153,18 @@ process_changes({New0, Changed0, Deleted0}, OldActions) -> OldActions ++ [{delete_module, M} || M <- Deleted]. +%% @doc Process the existing actions to exclude modules that are +%% already handled +process_old_action({purge, Modules}) -> + Modules; +process_old_action({delete_module, Module}) -> + [Module]; +process_old_action(LoadModule) when is_tuple(LoadModule) andalso + element(1, LoadModule) =:= load_module -> + element(2, LoadModule); +process_old_action(_) -> + []. + ensure_pred_versions(PredVersion, Versions) -> {Maj, Min, Patch} = parse_semver(PredVersion), PredVersions = [semver(Maj, Min, P) || P <- lists:seq(0, Patch)], @@ -192,17 +213,17 @@ diff_app_modules(Modules, OldModules) -> find_beams(Dir) -> [filename:join(Dir, I) || I <- filelib:wildcard("**/ebin/*.beam", Dir)]. -prepare(Baseline, #{clone_url := Repo, make_command := MakeCommand, beams_dir := BeamDir}) -> +prepare(Baseline, Options = #{make_command := MakeCommand, beams_dir := BeamDir}) -> log("~n===================================~n" "Baseline: ~s" "~n===================================~n", [Baseline]), log("Building the current version...~n"), bash(MakeCommand), log("Downloading and building the previous release...~n"), - {ok, PredRootDir} = build_pred_release(Baseline, Repo, MakeCommand), + {ok, PredRootDir} = build_pred_release(Baseline, Options), {BeamDir, filename:join(PredRootDir, BeamDir)}. -build_pred_release(Baseline, Repo, MakeCommand) -> +build_pred_release(Baseline, #{clone_url := Repo, make_command := MakeCommand}) -> BaseDir = "/tmp/emqx-baseline/", Dir = filename:basename(Repo, ".git") ++ [$-|Baseline], %% TODO: shallow clone @@ -248,8 +269,8 @@ hashsums([File|Rest], Acc0) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% parse_semver(Version) -> - case re(Version, "^([0-9]+)\.([0-9]+)\.([0-9]+)$") of - {match, [Maj, Min, Patch]} -> + case re(Version, "^([0-9]+)\\.([0-9]+)\\.([0-9]+)(\\.[0-9]+)?$") of + {match, [Maj, Min, Patch|_]} -> {list_to_integer(Maj), list_to_integer(Min), list_to_integer(Patch)}; _ -> error({not_a_semver, Version})