From d0f958d59d1f87bda8d1d6c724a1af18af288324 Mon Sep 17 00:00:00 2001 From: Fred Hebert Date: Thu, 14 Dec 2017 10:14:53 -0500 Subject: Fix escriptize failure when ebin/ has subdirs Although fairly irregular, the presence of a subdirectory in ebin/ while running rebar3 escriptize would crash the run and generate a dump. Since ebin subdirectories are generally not supported (adding a path for an application only adds ebin/ and no subdirectories to the VM's path set), we just silently ignore the directory altogether. Fixes #1693 --- src/rebar_prv_escriptize.erl | 3 ++- test/rebar_escriptize_SUITE.erl | 27 +++++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/rebar_prv_escriptize.erl b/src/rebar_prv_escriptize.erl index 1da70f8..3d6e708 100644 --- a/src/rebar_prv_escriptize.erl +++ b/src/rebar_prv_escriptize.erl @@ -194,7 +194,8 @@ load_files(Wildcard, Dir) -> load_files(Prefix, Wildcard, Dir) -> [read_file(Prefix, Filename, Dir) - || Filename <- filelib:wildcard(Wildcard, Dir)]. + || Filename <- filelib:wildcard(Wildcard, Dir), + not filelib:is_dir(filename:join(Dir, Filename))]. read_file(Prefix, Filename, Dir) -> Filename1 = case Prefix of diff --git a/test/rebar_escriptize_SUITE.erl b/test/rebar_escriptize_SUITE.erl index 139d5cd..a6901f9 100644 --- a/test/rebar_escriptize_SUITE.erl +++ b/test/rebar_escriptize_SUITE.erl @@ -7,7 +7,8 @@ all/0, escriptize_with_name/1, escriptize_with_bad_name/1, - build_and_clean_app/1]). + build_and_clean_app/1, + escriptize_with_ebin_subdir/1]). -include_lib("common_test/include/ct.hrl"). -include_lib("eunit/include/eunit.hrl"). @@ -29,7 +30,8 @@ all() -> [ build_and_clean_app, escriptize_with_name, - escriptize_with_bad_name + escriptize_with_bad_name, + escriptize_with_ebin_subdir ]. %% Test escriptize builds and runs the app's escript @@ -59,3 +61,24 @@ escriptize_with_bad_name(Config) -> rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), rebar_test_utils:run_and_check(Config, [{escript_main_app, boogers}], ["escriptize"], {error,{rebar_prv_escriptize, {bad_name, boogers}}}). + +escriptize_with_ebin_subdir(Config) -> + AppDir = ?config(apps, Config), + Name = rebar_test_utils:create_random_name("app1_"), + Vsn = rebar_test_utils:create_random_vsn(), + + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + + filelib:ensure_dir(filename:join([AppDir, "ebin", "subdir", "subdirfile"])), + + %% To work, this test must run from the AppDir itself. To avoid breaking + %% other tests, be careful with cwd + Cwd = file:get_cwd(), + try + file:set_cwd(AppDir), + {ok, _} = rebar3:run(rebar_state:new(?config(state,Config), [], AppDir), + ["escriptize"]) + after + file:set_cwd(Cwd) % reset always + end, + ok. -- cgit v1.1