summaryrefslogtreecommitdiff
path: root/src/rebar_otp_app.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rebar_otp_app.erl')
-rw-r--r--src/rebar_otp_app.erl41
1 files changed, 26 insertions, 15 deletions
diff --git a/src/rebar_otp_app.erl b/src/rebar_otp_app.erl
index ddaa44b..952271b 100644
--- a/src/rebar_otp_app.erl
+++ b/src/rebar_otp_app.erl
@@ -58,11 +58,12 @@ compile(State, App) ->
validate_app(State, App1).
format_error({missing_app_file, Filename}) ->
- io_lib:format("App file is missing: ~s", [Filename]);
-format_error({file_read, File, Reason}) ->
- io_lib:format("Failed to read required file ~s for processing: ~s", [File, file:format_error(Reason)]);
+ io_lib:format("App file is missing: ~ts", [Filename]);
+format_error({file_read, AppName, File, Reason}) ->
+ io_lib:format("Failed to read required ~ts file for processing the application '~ts': ~ts",
+ [File, AppName, file:format_error(Reason)]);
format_error({invalid_name, File, AppName}) ->
- io_lib:format("Invalid ~s: name of application (~p) must match filename.", [File, AppName]).
+ io_lib:format("Invalid ~ts: name of application (~p) must match filename.", [File, AppName]).
%% ===================================================================
%% Internal functions
@@ -79,7 +80,7 @@ validate_app(State, App) ->
Error
end;
{error, Reason} ->
- ?PRV_ERROR({file_read, AppFile, Reason})
+ ?PRV_ERROR({file_read, rebar_app_info:name(App), ".app", Reason})
end.
validate_app_modules(State, App, AppData) ->
@@ -110,25 +111,28 @@ preprocess(State, AppInfo, AppSrcFile) ->
A1 = apply_app_vars(AppVars, AppData),
%% AppSrcFile may contain instructions for generating a vsn number
- Vsn = app_vsn(AppData, AppSrcFile, State),
+ Vsn = app_vsn(AppInfo, AppData, AppSrcFile, State),
A2 = lists:keystore(vsn, 1, A1, {vsn, Vsn}),
%% systools:make_relup/4 fails with {missing_param, registered}
%% without a 'registered' value.
A3 = ensure_registered(A2),
+ %% some tools complain if a description is not present.
+ A4 = ensure_description(A3),
+
%% Build the final spec as a string
- Spec = io_lib:format("~p.\n", [{application, AppName, A3}]),
+ Spec = io_lib:format("~p.\n", [{application, AppName, A4}]),
%% Setup file .app filename and write new contents
EbinDir = rebar_app_info:ebin_dir(AppInfo),
- filelib:ensure_dir(filename:join(EbinDir, "dummy.beam")),
+ rebar_file_utils:ensure_dir(EbinDir),
AppFile = rebar_app_utils:app_src_to_app(OutDir, AppSrcFile),
- ok = rebar_file_utils:write_file_if_contents_differ(AppFile, Spec),
+ ok = rebar_file_utils:write_file_if_contents_differ(AppFile, Spec, utf8),
AppFile;
{error, Reason} ->
- throw(?PRV_ERROR({file_read, AppSrcFile, Reason}))
+ throw(?PRV_ERROR({file_read, rebar_app_info:name(AppInfo), ".app.src", Reason}))
end.
load_app_vars(State) ->
@@ -195,6 +199,15 @@ ensure_registered(AppData) ->
AppData
end.
+ensure_description(AppData) ->
+ case lists:keyfind(description, 1, AppData) of
+ false ->
+ %% Required for releases to work.
+ [{description, ""} | AppData];
+ {description, _} ->
+ AppData
+ end.
+
%% In the case of *.app.src we want to give the user the ability to
%% dynamically script the application resource file (think dynamic version
%% string, etc.), in a way similar to what can be done with the rebar
@@ -214,15 +227,13 @@ consult_app_file(Filename) ->
end
end.
-app_vsn(AppData, AppFile, State) ->
- AppDir = filename:dirname(filename:dirname(AppFile)),
- Resources = rebar_state:resources(State),
- rebar_utils:vcs_vsn(get_value(vsn, AppData, AppFile), AppDir, Resources).
+app_vsn(AppInfo, AppData, AppFile, State) ->
+ rebar_utils:vcs_vsn(AppInfo, get_value(vsn, AppData, AppFile), State).
get_value(Key, AppInfo, AppFile) ->
case proplists:get_value(Key, AppInfo) of
undefined ->
- ?ABORT("Failed to get app value '~p' from '~s'~n", [Key, AppFile]);
+ ?ABORT("Failed to get app value '~p' from '~ts'~n", [Key, AppFile]);
Value ->
Value
end.