summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoewilliams <joe@joetify.com>2011-03-03 10:39:44 -0800
committerjoewilliams <joe@joetify.com>2011-03-03 16:02:37 -0800
commit0f99ba22804abe2f69f1425b82f6dc1d098ab441 (patch)
tree591fe11cae00ed064102ed93699ff13634267fa4
parentd725e5fe926da14812c2d1f18e021dbcee1a9cad (diff)
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.
-rw-r--r--src/rebar_appups.erl38
-rw-r--r--src/rebar_rel_utils.erl27
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() ->