From 958213def79409b15dd61d51f3cfef1fb77cb82b Mon Sep 17 00:00:00 2001 From: Tristan Sloughter Date: Fri, 22 May 2015 13:52:23 -0500 Subject: fall back to .app.src file if .app file fails to parse --- src/rebar_app_discover.erl | 111 +++++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 53 deletions(-) (limited to 'src') 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}}). -- cgit v1.1