From 0f99ba22804abe2f69f1425b82f6dc1d098ab441 Mon Sep 17 00:00:00 2001 From: joewilliams Date: Thu, 3 Mar 2011 10:39:44 -0800 Subject: [PATCH] Fix bug that causes appup generation to fail This commit changes how rebar determines which apps have been updated, added and removed from a release during appup generation. Rather than use app files it now determines this from the rel file in each version of the release. In addition it fixes a bug reported on the mailing list when generating appups when an application has been added or removed from either release. --- src/rebar_appups.erl | 38 +++++++++++++++++++------------------- src/rebar_rel_utils.erl | 27 ++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 22 deletions(-) diff --git a/src/rebar_appups.erl b/src/rebar_appups.erl index ec1df0a..079d596 100644 --- a/src/rebar_appups.erl +++ b/src/rebar_appups.erl @@ -55,14 +55,8 @@ NewName == OldName, "Reltool and .rel release names do not match~n", []), - %% Get lists of the old and new app files - OldAppFiles = filelib:wildcard( - filename:join([OldVerPath, "lib", "*", "ebin", "*.app"])), - NewAppFiles = filelib:wildcard( - filename:join([NewName, "lib", "*", "ebin", "*.app"])), - %% Find all the apps that have been upgraded - UpgradedApps = get_upgraded_apps(OldAppFiles, NewAppFiles), + UpgradedApps = get_upgraded_apps(Name, OldVerPath, NewVerPath), %% Get a list of any appup files that exist in the new release NewAppUpFiles = rebar_utils:find_files( @@ -85,18 +79,24 @@ %% Internal functions %% =================================================================== -get_upgraded_apps(OldAppFiles, NewAppFiles) -> - OldAppsVer = [{rebar_app_utils:app_name(AppFile), - rebar_app_utils:app_vsn(AppFile)} || AppFile <- OldAppFiles], - NewAppsVer = [{rebar_app_utils:app_name(AppFile), - rebar_app_utils:app_vsn(AppFile)} || AppFile <- NewAppFiles], - UpgradedApps = lists:subtract(NewAppsVer, OldAppsVer), - lists:map( - fun({App, NewVer}) -> - {App, OldVer} = proplists:lookup(App, OldAppsVer), - {App, {OldVer, NewVer}} - end, - UpgradedApps). +get_upgraded_apps(Name, OldVerPath, NewVerPath) -> + OldApps = rebar_rel_utils:get_rel_apps(Name, OldVerPath), + NewApps = rebar_rel_utils:get_rel_apps(Name, NewVerPath), + + Sorted = lists:umerge(lists:sort(NewApps), lists:sort(OldApps)), + AddedorChanged = lists:subtract(Sorted, OldApps), + DeletedorChanged = lists:subtract(Sorted, NewApps), + ?DEBUG("Added or Changed: ~p~n", [AddedorChanged]), + ?DEBUG("Deleted or Changed: ~p~n", [DeletedorChanged]), + + AddedDeletedChanged = lists:ukeysort(1, lists:append(DeletedorChanged, + AddedorChanged)), + UpgradedApps = lists:subtract(AddedorChanged, AddedDeletedChanged), + ?DEBUG("Upgraded Apps:~p~n", [UpgradedApps]), + + [{AppName, {proplists:get_value(AppName, OldApps), NewVer}} + || {AppName, NewVer} <- UpgradedApps]. + file_to_name(File) -> filename:rootname(filename:basename(File)). diff --git a/src/rebar_rel_utils.erl b/src/rebar_rel_utils.erl index 9729e20..d3baf4d 100644 --- a/src/rebar_rel_utils.erl +++ b/src/rebar_rel_utils.erl @@ -31,7 +31,10 @@ get_reltool_release_info/1, get_rel_release_info/1, get_rel_release_info/2, - get_previous_release_path/0]). + get_rel_apps/1, + get_rel_apps/2, + get_previous_release_path/0, + get_rel_file_path/2]). -include("rebar.hrl"). @@ -70,11 +73,29 @@ get_rel_release_info(RelFile) -> %% Get release name and version from a name and a path get_rel_release_info(Name, Path) -> + RelPath = get_rel_file_path(Name, Path), + get_rel_release_info(RelPath). + +%% Get list of apps included in a release from a rel file +get_rel_apps(RelFile) -> + case file:consult(RelFile) of + {ok, [{release, _, _, Apps}]} -> + Apps; + _ -> + ?ABORT("Failed to parse ~s~n", [RelFile]) + end. + +%% Get list of apps included in a release from a name and a path +get_rel_apps(Name, Path) -> + RelPath = get_rel_file_path(Name, Path), + get_rel_apps(RelPath). + +%% Get rel file path from name and path +get_rel_file_path(Name, Path) -> [RelFile] = filelib:wildcard(filename:join([Path, "releases", "*", Name ++ ".rel"])), [BinDir|_] = re:replace(RelFile, Name ++ "\\.rel", ""), - get_rel_release_info(filename:join([binary_to_list(BinDir), - Name ++ ".rel"])). + filename:join([binary_to_list(BinDir), Name ++ ".rel"]). %% Get the previous release path from a global variable get_previous_release_path() ->