summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFred Hebert <mononcqc@ferd.ca>2019-04-16 20:10:52 -0400
committerGitHub <noreply@github.com>2019-04-16 20:10:52 -0400
commit45aaba22b405b222fd28e46c625748a99a53cff3 (patch)
treeba1ef877ddf38a6f5844146e47f4e2f789ab911b
parent14928247cda69d953e673ed6b5feb6ff679a2dfc (diff)
parentcb881390dce42dab63f18dba59eddd1e4990b969 (diff)
Merge pull request #2035 from ankhers/lint_app_file
Add basic linting for .app file
-rw-r--r--src/rebar_app_utils.erl31
-rw-r--r--test/rebar_compile_SUITE.erl20
2 files changed, 49 insertions, 2 deletions
diff --git a/src/rebar_app_utils.erl b/src/rebar_app_utils.erl
index 0ea6ad8..91c095c 100644
--- a/src/rebar_app_utils.erl
+++ b/src/rebar_app_utils.erl
@@ -101,6 +101,7 @@ validate_application_info(AppInfo, AppDetail) ->
undefined ->
false;
AppFile ->
+ lint_detail(AppDetail, AppFile),
case proplists:get_value(modules, AppDetail) of
undefined ->
?PRV_ERROR({module_list, AppFile});
@@ -109,6 +110,36 @@ validate_application_info(AppInfo, AppDetail) ->
end
end.
+-spec lint_detail(list(), file:filename_all()) -> ok.
+lint_detail(AppDetail, AppFile) ->
+ lint_description(AppDetail, AppFile),
+ lint_applications(AppDetail, AppFile).
+
+-spec lint_description(list(), file:filename_all()) -> ok.
+lint_description(AppDetail, AppFile) ->
+ case proplists:get_value(description, AppDetail, "") of
+ "" -> ?WARN("~p is missing description entry", [AppFile]);
+ _ -> ok
+ end.
+
+-spec lint_applications(list(), file:filename_all()) -> ok.
+lint_applications(AppDetail, AppFile) ->
+ case proplists:get_value(applications, AppDetail) of
+ undefined -> ?WARN("~p is missing applications entry", [AppFile]);
+ AppList when is_list(AppList) ->
+ case lists:member(kernel, AppList) of
+ false ->
+ ?WARN("~p is missing kernel from applications list", [AppFile]);
+ true -> ok
+ end,
+ case lists:member(stdlib, AppList) of
+ false ->
+ ?WARN("~p is missing stdlib from applications list", [AppFile]);
+ true -> ok
+ end;
+ _ -> ?WARN("~p requires a list for applications value", [AppFile])
+ end.
+
%% @doc parses all dependencies from the root of the project
-spec parse_deps(Dir, Deps, State, Locks, Level) -> [rebar_app_info:t()] when
Dir :: file:filename(),
diff --git a/test/rebar_compile_SUITE.erl b/test/rebar_compile_SUITE.erl
index 0bc3ad0..44f20d7 100644
--- a/test/rebar_compile_SUITE.erl
+++ b/test/rebar_compile_SUITE.erl
@@ -40,7 +40,9 @@ all() ->
always_recompile_when_erl_compiler_options_set,
dont_recompile_when_erl_compiler_options_env_does_not_change,
recompile_when_erl_compiler_options_env_changes,
- rebar_config_os_var].
+ rebar_config_os_var,
+
+ app_file_linting].
groups() ->
[{basic_app, [], [build_basic_app, paths_basic_app, clean_basic_app]},
@@ -431,7 +433,6 @@ paths_release_apps(Config) ->
[Vsn1, Vsn2] = ?config(vsns, Config),
{ok, State} = rebar_test_utils:run_and_check(Config, [], ["compile"], return),
-
code:add_paths(rebar_state:code_paths(State, all_deps)),
ok = application:load(list_to_atom(Name1)),
ok = application:load(list_to_atom(Name2)),
@@ -2312,6 +2313,21 @@ regex_filter_regression(Config) ->
{ok, [{file, Expected}]}),
ok.
+app_file_linting(Config) ->
+ meck:new(rebar_log, [no_link, passthrough]),
+ AppDir = ?config(apps, Config),
+ Name = rebar_test_utils:create_random_name("app_file_linting"),
+ Vsn = rebar_test_utils:create_random_vsn(),
+ rebar_test_utils:create_app(AppDir, Name, Vsn, [foo]),
+
+ _ = rebar_test_utils:run_and_check(Config, [], ["compile"], return),
+ History = meck:history(rebar_log),
+ Warnings = [{Str, Args} || {_, {rebar_log, log, [warn, Str, Args]}, _} <- History],
+
+ ?assert(none /= proplists:lookup("~p is missing description entry", Warnings)),
+ ?assert(none /= proplists:lookup("~p is missing kernel from applications list", Warnings)),
+ ?assert(none /= proplists:lookup("~p is missing stdlib from applications list", Warnings)).
+
%%
%% a copy of lib/parsetools/include/yeccpre.hrl so we can test yrl includefile