aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric B Merritt <[email protected]>2013-04-09 16:40:29 -0700
committerEric B Merritt <[email protected]>2013-04-09 16:40:50 -0700
commit4e863bd88520be1a786026eeb861cb70d00e7b01 (patch)
tree5fd62ac16db0044a0f8bac4914e39be76ced2447
parent9cc71b80c4387579469042b93f3240a0fd7c41c2 (diff)
downloadrelx-4e863bd88520be1a786026eeb861cb70d00e7b01.tar.gz
relx-4e863bd88520be1a786026eeb861cb70d00e7b01.tar.bz2
relx-4e863bd88520be1a786026eeb861cb70d00e7b01.zip
fixes #29 - look for common sub dirs for discovery
With this change relcool looks for the common sub directories to add to the search. Those directories are now, relative to the project dir, `apps`, `lib`, `ebin`, and the release output dir. These automatic subdirs can be disabled by setting `disable_project_subdirs` to `true` in the config. The release output dir is also added to the discovery process. This can be disabled by setting `disable_discover_release_output` to true.
-rw-r--r--src/rcl_app_discovery.erl10
-rw-r--r--src/rcl_app_info.erl1
-rw-r--r--src/rcl_prv_discover.erl51
-rw-r--r--src/rcl_rel_discovery.erl11
-rw-r--r--src/rcl_state.erl9
-rw-r--r--test/rclt_command_SUITE.erl4
-rw-r--r--test/rclt_discover_SUITE.erl9
-rw-r--r--test/rclt_release_SUITE.erl2
8 files changed, 64 insertions, 33 deletions
diff --git a/src/rcl_app_discovery.erl b/src/rcl_app_discovery.erl
index 43557c4..1f1ecc8 100644
--- a/src/rcl_app_discovery.erl
+++ b/src/rcl_app_discovery.erl
@@ -86,7 +86,7 @@ setup_overrides(State, AppMetas0) ->
Overrides = rcl_state:overrides(State),
AppMetas1 = [AppMeta || AppMeta <- AppMetas0,
not lists:keymember(app_name(AppMeta), 1, Overrides)],
- [case is_valid_otp_app(filename:join([FileName, "ebin",
+ [case is_valid_otp_app(filename:join([FileName, <<"ebin">>,
erlang:atom_to_list(AppName) ++ ".app"])) of
{noresult, false} ->
{error, {invalid_override, AppName, FileName}};
@@ -134,11 +134,11 @@ is_valid_otp_app(File) ->
%% Is this an ebin dir?
EbinDir = filename:dirname(File),
case filename:basename(EbinDir) of
- "ebin" ->
- case lists:suffix(".app", File) of
- true ->
+ <<"ebin">> ->
+ case filename:extension(File) of
+ <<".app">> ->
has_at_least_one_beam(EbinDir, File);
- false ->
+ _ ->
{noresult, false}
end;
_ ->
diff --git a/src/rcl_app_info.erl b/src/rcl_app_info.erl
index f2afa0b..dadc579 100644
--- a/src/rcl_app_info.erl
+++ b/src/rcl_app_info.erl
@@ -91,7 +91,6 @@ new(AppName, Vsn, Dir, ActiveDeps, LibraryDeps) ->
{ok, t()} | relcool:error().
new(AppName, Vsn, Dir, ActiveDeps, LibraryDeps, Link)
when erlang:is_atom(AppName),
- erlang:is_list(Dir),
erlang:is_list(ActiveDeps),
erlang:is_list(LibraryDeps) ->
case parse_version(Vsn) of
diff --git a/src/rcl_prv_discover.erl b/src/rcl_prv_discover.erl
index 10fb28b..fa810a6 100644
--- a/src/rcl_prv_discover.erl
+++ b/src/rcl_prv_discover.erl
@@ -79,29 +79,54 @@ get_lib_dirs(State) ->
true ->
LibDirs0;
false ->
- add_current_dir(State, LibDirs0)
+ lists:flatten([LibDirs0,
+ add_common_project_dirs(State),
+ add_system_lib_dir(State),
+ add_release_output_dir(State)])
end.
--spec add_current_dir(rcl_state:t(), [file:name()]) -> [file:name()].
-add_current_dir(State, LibDirs) ->
+-spec add_common_project_dirs(rcl_state:t()) -> [file:name()].
+add_common_project_dirs(State) ->
%% Check to see if there is a rebar.config. If so then look for a deps
%% dir. If both are there then we add that to the lib dirs.
- Root = rcl_state:root_dir(State),
- add_system_lib_dir(State, [filename:absname(Root) | LibDirs]).
+ case rcl_state:get(State, disable_project_subdirs, false) of
+ true ->
+ [];
+ false ->
+ Root = rcl_state:root_dir(State),
+ Apps = filename:join(Root, "apps"),
+ Lib = filename:join(Root, "lib"),
+ Deps = filename:join(Root, "deps"),
+ lists:foldl(fun(Dir, LibDirs) ->
+ case ec_file:exists(Dir) of
+ true ->
+ [erlang:iolist_to_binary(Dir) | LibDirs];
+ false ->
+ LibDirs
+ end
+ end, [], [Deps, Lib, Apps])
+ end.
--spec add_system_lib_dir(rcl_state:t(), [file:name()]) -> [file:name()].
-add_system_lib_dir(State, LibDirs) ->
+-spec add_system_lib_dir(rcl_state:t()) -> [file:name()].
+add_system_lib_dir(State) ->
ExcludeSystem = rcl_state:get(State, discover_exclude_system, false),
-
case ExcludeSystem of
true ->
- LibDirs;
+ [];
+ false ->
+ erlang:iolist_to_binary(code:lib_dir())
+ end.
+
+add_release_output_dir(State) ->
+ case rcl_state:get(State, disable_discover_release_output, false) of
+ true ->
+ [];
false ->
- SystemLibDir0 = code:lib_dir(),
- case filelib:is_dir(SystemLibDir0) of
+ Output = erlang:iolist_to_binary(rcl_state:output_dir(State)),
+ case ec_file:exists(erlang:binary_to_list(Output)) of
true ->
- [SystemLibDir0 | LibDirs];
+ Output;
false ->
- LibDirs
+ []
end
end.
diff --git a/src/rcl_rel_discovery.erl b/src/rcl_rel_discovery.erl
index 38d7913..d9012ea 100644
--- a/src/rcl_rel_discovery.erl
+++ b/src/rcl_rel_discovery.erl
@@ -74,12 +74,13 @@ resolve_rel_metadata(State, LibDirs, AppMeta) ->
case Errors of
[] ->
+ ReleaseMeta1 = [RelMeta || {ok, RelMeta} <- ReleaseMeta0],
rcl_log:debug(rcl_state:log(State),
fun() ->
["Resolved the following OTP Releases from the system: \n",
- [[rcl_release:format(1, Rel), "\n"] || Rel <- ReleaseMeta0]]
+ [[rcl_release:format(1, Rel), "\n"] || Rel <- ReleaseMeta1]]
end),
- {ok, ReleaseMeta0};
+ {ok, ReleaseMeta1};
_ ->
?RCL_ERROR(Errors)
end.
@@ -105,10 +106,10 @@ discover_dir(File, AppMeta, file) ->
| {error, Reason::term()}
| {noresult, false}.
is_valid_release(File, AppMeta) ->
- case lists:suffix(".rel", File) of
- true ->
+ case filename:extension(File) of
+ <<".rel">>->
resolve_release(File, AppMeta);
- false ->
+ _ ->
{noresult, false}
end.
diff --git a/src/rcl_state.erl b/src/rcl_state.erl
index 6568541..7247818 100644
--- a/src/rcl_state.erl
+++ b/src/rcl_state.erl
@@ -103,7 +103,7 @@ new(PropList, Target)
State0 =
#state_t{log = proplists:get_value(log, PropList, rcl_log:new(error)),
output_dir=proplists:get_value(output_dir, PropList, ""),
- lib_dirs=proplists:get_value(lib_dirs, PropList, ""),
+ lib_dirs=[to_binary(Dir) || Dir <- proplists:get_value(lib_dirs, PropList, [])],
config_file=proplists:get_value(config, PropList, undefined),
action = Target,
goals=proplists:get_value(goals, PropList, []),
@@ -292,6 +292,13 @@ create_logic_providers(State0) ->
State5#state_t{providers=[ConfigProvider, DiscoveryProvider,
ReleaseProvider, OverlayProvider, AssemblerProvider]}.
+to_binary(Dir)
+ when erlang:is_list(Dir) ->
+ erlang:list_to_binary(Dir);
+to_binary(Dir)
+ when erlang:is_binary(Dir) ->
+ Dir.
+
%%%===================================================================
%%% Test Functions
%%%===================================================================
diff --git a/test/rclt_command_SUITE.erl b/test/rclt_command_SUITE.erl
index 3d06dad..9c96005 100644
--- a/test/rclt_command_SUITE.erl
+++ b/test/rclt_command_SUITE.erl
@@ -45,8 +45,8 @@ all() ->
normal_passing_case(Config) ->
DataDir = proplists:get_value(data_dir, Config),
- Lib1 = filename:join([DataDir, "lib1"]),
- Lib2 = filename:join([DataDir, "lib2"]),
+ Lib1 = filename:join([DataDir, <<"lib1">>]),
+ Lib2 = filename:join([DataDir, <<"lib2">>]),
Outdir = filename:join([DataDir, "outdir"]),
ok = rcl_util:mkdir_p(Lib1),
ok = rcl_util:mkdir_p(Lib2),
diff --git a/test/rclt_discover_SUITE.erl b/test/rclt_discover_SUITE.erl
index 4b6cb2a..e3a2861 100644
--- a/test/rclt_discover_SUITE.erl
+++ b/test/rclt_discover_SUITE.erl
@@ -111,7 +111,7 @@ no_beam_case(Config) ->
write_app_file(AppDir, BadName, BadVsn),
State0 = proplists:get_value(state, Config),
{DiscoverProvider, {ok, State1}} = rcl_provider:new(rcl_prv_discover, State0),
- EbinDir = filename:join([LibDir2, BadName, "ebin"]),
+ EbinDir = filename:join([LibDir2, BadName, <<"ebin">>]),
?assertMatch({error, {_, [{no_beam_files, EbinDir}]}},
rcl_provider:do(DiscoverProvider, State1)).
@@ -135,14 +135,12 @@ bad_ebin_case(Config) ->
BadName = create_random_name("error_bad"),
BadVsn = create_random_vsn(),
AppDir = filename:join([LibDir2, BadName]),
- Filename = filename:join([AppDir, "ebin", BadName ++ ".app"]),
- io:format("BAD -> ~p~n", [Filename]),
+ Filename = filename:join([AppDir, <<"ebin">>, BadName ++ ".app"]),
ok = filelib:ensure_dir(Filename),
ok = ec_file:write_term(Filename, get_bad_app_metadata(BadName, BadVsn)),
write_beam_file(AppDir, BadName),
State0 = proplists:get_value(state, Config),
{DiscoverProvider, {ok, State1}} = rcl_provider:new(rcl_prv_discover, State0),
-
?assertMatch({error, {_, [{invalid_app_file, Filename}]}},
rcl_provider:do(DiscoverProvider, State1)).
@@ -154,7 +152,8 @@ create_app(Dir, Name, Vsn) ->
AppDir = filename:join([Dir, Name]),
write_app_file(AppDir, Name, Vsn),
write_beam_file(AppDir, Name),
- {ok, App} = rcl_app_info:new(erlang:list_to_atom(Name), Vsn, AppDir,
+ {ok, App} = rcl_app_info:new(erlang:list_to_atom(Name), Vsn,
+ erlang:iolist_to_binary(AppDir),
[kernel, stdlib], []),
App.
diff --git a/test/rclt_release_SUITE.erl b/test/rclt_release_SUITE.erl
index fccdfcc..c774619 100644
--- a/test/rclt_release_SUITE.erl
+++ b/test/rclt_release_SUITE.erl
@@ -290,7 +290,7 @@ make_rerun_overridden_release(Config) ->
OutputDir = filename:join([proplists:get_value(data_dir, Config),
create_random_name("relcool-output")]),
{ok, Cwd} = file:get_cwd(),
- {ok, State} = relcool:do(Cwd, undefined, undefined, [], [LibDir1], 2,
+ {ok, _} = relcool:do(Cwd, undefined, undefined, [], [LibDir1], 2,
OutputDir, [{OverrideAppName, OverrideAppDir}],
ConfigFile),