summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rebar_app_discover.erl111
1 files changed, 58 insertions, 53 deletions
diff --git a/src/rebar_app_discover.erl b/src/rebar_app_discover.erl
index 34310c7..74ab332 100644
--- a/src/rebar_app_discover.erl
+++ b/src/rebar_app_discover.erl
@@ -7,6 +7,7 @@
find_apps/2,
find_app/2]).
+-include("rebar.hrl").
-include_lib("providers/include/providers.hrl").
do(State, LibDirs) ->
@@ -123,59 +124,7 @@ find_apps(LibDirs, Validate) ->
find_app(AppDir, Validate) ->
AppFile = filelib:wildcard(filename:join([AppDir, "ebin", "*.app"])),
AppSrcFile = filelib:wildcard(filename:join([AppDir, "src", "*.app.src"])),
- case AppFile of
- [File] ->
- AppInfo = create_app_info(AppDir, File),
- AppInfo1 = rebar_app_info:app_file(AppInfo, File),
- AppInfo2 = case AppSrcFile of
- [F] ->
- rebar_app_info:app_file_src(AppInfo1, F);
- [] ->
- AppInfo1;
- Other when is_list(Other) ->
- throw({error, {multiple_app_files, Other}})
- end,
- case Validate of
- valid ->
- case rebar_app_utils:validate_application_info(AppInfo2) of
- true ->
- {true, AppInfo2};
- _ ->
- false
- end;
- invalid ->
- case rebar_app_utils:validate_application_info(AppInfo2) of
- true ->
- false;
- _ ->
- {true, AppInfo2}
- end;
- all ->
- {true, AppInfo2}
- end;
- [] ->
- case AppSrcFile of
- [File] ->
- case Validate of
- V when V =:= invalid ; V =:= all ->
- AppInfo = create_app_info(AppDir, File),
- case AppInfo of
- {error, Reason} ->
- throw({error, {invalid_app_file, File, Reason}});
- _ ->
- {true, rebar_app_info:app_file_src(AppInfo, File)}
- end;
- valid ->
- false
- end;
- [] ->
- false;
- Other when is_list(Other) ->
- throw({error, {multiple_app_files, Other}})
- end;
- Other when is_list(Other) ->
- throw({error, {multiple_app_files, Other}})
- end.
+ try_handle_app_file(AppFile, AppDir, AppSrcFile, Validate).
app_dir(AppFile) ->
filename:join(rebar_utils:droplast(filename:split(filename:dirname(AppFile)))).
@@ -202,3 +151,59 @@ dedup([]) -> [];
dedup([A]) -> [A];
dedup([H,H|T]) -> dedup([H|T]);
dedup([H|T]) -> [H|dedup(T)].
+
+try_handle_app_file([], AppDir, AppSrcFile, Validate) ->
+ try_handle_app_src_file([], AppDir, AppSrcFile, Validate);
+try_handle_app_file([File], AppDir, AppSrcFile, Validate) ->
+ try create_app_info(AppDir, File) of
+ AppInfo ->
+ AppInfo1 = rebar_app_info:app_file(AppInfo, File),
+ AppInfo2 = case AppSrcFile of
+ [F] ->
+ rebar_app_info:app_file_src(AppInfo1, F);
+ [] ->
+ AppInfo1;
+ Other when is_list(Other) ->
+ throw({error, {multiple_app_files, Other}})
+ end,
+ case Validate of
+ valid ->
+ case rebar_app_utils:validate_application_info(AppInfo2) of
+ true ->
+ {true, AppInfo2};
+ _ ->
+ false
+ end;
+ invalid ->
+ case rebar_app_utils:validate_application_info(AppInfo2) of
+ true ->
+ false;
+ _ ->
+ {true, AppInfo2}
+ end;
+ all ->
+ {true, AppInfo2}
+ end
+ catch
+ throw:{error, {Module, Reason}} ->
+ ?DEBUG("Falling back to app.src file because .app failed: ~s", [Module:format_error(Reason)]),
+ try_handle_app_src_file(File, AppDir, AppSrcFile, Validate)
+ end;
+try_handle_app_file(Other, _AppDir, _AppSrcFile, _Validate) ->
+ throw({error, {multiple_app_files, Other}}).
+
+try_handle_app_src_file(_, _AppDir, [], _Validate) ->
+ false;
+try_handle_app_src_file(_, _AppDir, _AppSrcFile, valid) ->
+ false;
+try_handle_app_src_file(_, AppDir, [File], Validate) when Validate =:= invalid
+ ; Validate =:= all ->
+ AppInfo = create_app_info(AppDir, File),
+ case AppInfo of
+ {error, Reason} ->
+ throw({error, {invalid_app_file, File, Reason}});
+ _ ->
+ {true, rebar_app_info:app_file_src(AppInfo, File)}
+ end;
+try_handle_app_src_file(_, _AppDir, Other, _Validate) ->
+ throw({error, {multiple_app_files, Other}}).