diff --git a/src/rebar_app_utils.erl b/src/rebar_app_utils.erl index dbd085e..7f48ffd 100644 --- a/src/rebar_app_utils.erl +++ b/src/rebar_app_utils.erl @@ -27,7 +27,11 @@ -module(rebar_app_utils). -export([is_app_dir/0, is_app_dir/1, - load_app_file/1]). + app_name/1, + app_applications/1, + app_vsn/1]). + +-export([load_app_file/1]). % TEMPORARY -include("rebar.hrl"). @@ -47,14 +51,45 @@ is_app_dir(Dir) -> false end. +app_name(AppFile) -> + case load_app_file(AppFile) of + {ok, AppName, _} -> + AppName; + {error, Reason} -> + ?ABORT("Failed to extract name from ~s: ~p\n", + [AppFile, Reason]) + end. + +app_applications(AppFile) -> + case load_app_file(AppFile) of + {ok, _, AppInfo} -> + proplists:get_value(applications, AppInfo); + {error, Reason} -> + ?ABORT("Failed to extract applications from ~s: ~p\n", + [AppFile, Reason]) + end. + +app_vsn(AppFile) -> + case load_app_file(AppFile) of + {ok, _, AppInfo} -> + proplists:get_value(vsn, AppInfo); + {error, Reason} -> + ?ABORT("Failed to extract vsn from ~s: ~p\n", + [AppFile, Reason]) + end. + + + +%% =================================================================== +%% Internal functions +%% =================================================================== + load_app_file(Filename) -> case file:consult(Filename) of {ok, [{application, AppName, AppData}]} -> {ok, AppName, AppData}; {error, Reason} -> - ?ERROR("Failed to load app file from ~s: ~p\n", [Filename, Reason]), - ?FAIL; + {error, Reason}; Other -> - ?ERROR("Unexpected terms from app file ~s: ~p\n", [Filename, Other]), - ?FAIL + {error, {unexpected_terms, Other}} end. diff --git a/src/rebar_deps.erl b/src/rebar_deps.erl index 0ccd7ce..ec74e27 100644 --- a/src/rebar_deps.erl +++ b/src/rebar_deps.erl @@ -195,9 +195,9 @@ is_app_available(App, VsnRegex) -> is_app_available(App, VsnRegex, Path) -> case rebar_app_utils:is_app_dir(Path) of {true, AppFile} -> - case rebar_app_utils:load_app_file(AppFile) of - {ok, App, AppData} -> - {vsn, Vsn} = lists:keyfind(vsn, 1, AppData), + case rebar_app_utils:app_name(AppFile) of + App -> + Vsn = rebar_app_utils:app_vsn(AppFile), ?INFO("Looking for ~s-~s ; found ~s-~s at ~s\n", [App, VsnRegex, App, Vsn, Path]), case re:run(Vsn, VsnRegex, [{capture, none}]) of @@ -208,11 +208,9 @@ is_app_available(App, VsnRegex, Path) -> [AppFile, Vsn, VsnRegex]), false end; - {ok, OtherApp, _} -> + OtherApp -> ?WARN("~s has application id ~p; expected ~p\n", [AppFile, OtherApp, App]), - false; - {error, Reason} -> - ?ABORT("Failed to parse ~s: ~p\n", [AppFile, Reason]) + false end; false -> ?WARN("Expected ~s to be an app dir (containing ebin/*.app), but no .app found.\n", diff --git a/src/rebar_dialyzer.erl b/src/rebar_dialyzer.erl index 35bb201..49edfb6 100644 --- a/src/rebar_dialyzer.erl +++ b/src/rebar_dialyzer.erl @@ -85,9 +85,8 @@ analyze(Config, File) -> build_plt(Config, File) -> Plt = plt_path(Config, File), - {ok, _AppName, AppData} = rebar_app_utils:load_app_file(File), - Apps = proplists:get_value(applications, AppData), - + Apps = rebar_app_utils:app_applications(File), + Warnings = dialyzer:run([{analysis_type, plt_build}, {files_rec, app_dirs(Apps)}, {output_plt, Plt}]), @@ -140,7 +139,7 @@ output_warnings(Warnings) -> %% @spec plt_path(Config::#config{}, File::string()) -> string() -spec(plt_path(Config::#config{}, File::string()) -> string()). plt_path(Config, File) -> - {ok, AppName, _AppData} = rebar_app_utils:load_app_file(File), + AppName = rebar_app_utils:app_name(File), DialyzerOpts = rebar_config:get(Config, dialyzer_opts, []), case proplists:get_value(plt, DialyzerOpts) of undefined -> diff --git a/src/rebar_escripter.erl b/src/rebar_escripter.erl index 19101b6..84747c1 100644 --- a/src/rebar_escripter.erl +++ b/src/rebar_escripter.erl @@ -37,7 +37,7 @@ escriptize(_Config, AppFile) -> %% Extract the application name from the archive -- this will be be what %% we call the output script - {ok, AppName, _AppData} = rebar_app_utils:load_app_file(AppFile), + AppName = rebar_app_utils:app_name(AppFile), %% Construct the archive of everything in ebin/ dir -- put it on the %% top-level of the zip file so that code loading works properly. diff --git a/src/rebar_port_compiler.erl b/src/rebar_port_compiler.erl index dace112..14f88a9 100644 --- a/src/rebar_port_compiler.erl +++ b/src/rebar_port_compiler.erl @@ -325,12 +325,9 @@ so_name(Config, AppFile) -> undefined -> %% Get the app name, which we'll use to %% generate the linked port driver name - case rebar_app_utils:load_app_file(AppFile) of - {ok, AppName, _} -> - lists:concat([AppName, "_drv.so"]); - error -> - ?FAIL - end; + AppName = rebar_app_utils:app_name(AppFile), + lists:concat([AppName, "_drv.so"]); + Soname -> Soname end,