aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/relx.erl2
-rw-r--r--src/rlx_cmd_args.erl8
-rw-r--r--src/rlx_prv_assembler.erl35
-rw-r--r--src/rlx_prv_config.erl28
-rw-r--r--src/rlx_state.erl11
-rw-r--r--test/rlx_release_SUITE.erl46
6 files changed, 111 insertions, 19 deletions
diff --git a/src/relx.erl b/src/relx.erl
index d61f426..359d47d 100644
--- a/src/relx.erl
+++ b/src/relx.erl
@@ -204,7 +204,7 @@ opt_spec_list() ->
{config, $c, "config", {string, ""}, "The path to a config file"},
{overlay_vars, undefined, "overlay_vars", string, "Path to a file of overlay variables"},
{system_libs, undefined, "system_libs", string, "Path to dir of Erlang system libs"},
- {version, $v, "version", undefined, "Print relx version"},
+ {version, undefined, "version", undefined, "Print relx version"},
{root_dir, $r, "root", string, "The project root directory"}].
-spec format_error(Reason::term()) -> string().
diff --git a/src/rlx_cmd_args.erl b/src/rlx_cmd_args.erl
index d6bf0bb..f592474 100644
--- a/src/rlx_cmd_args.erl
+++ b/src/rlx_cmd_args.erl
@@ -300,9 +300,15 @@ create_paths(Opts, Acc) ->
Error;
ok ->
code:add_pathsa([filename:absname(Path) || Path <- Dirs]),
- {ok, Acc}
+ create_dev_mode(Opts, Acc)
end.
+-spec create_dev_mode([getopt:option()], rlx_state:cmd_args()) ->
+ {ok, rlx_state:cmd_args()} | relx:error().
+create_dev_mode(Opts, Acc) ->
+ DevMode = proplists:get_value(dev_mode, Opts, false),
+ {ok, [{dev_mode, DevMode} | Acc]}.
+
-spec check_lib_dirs([string()]) -> ok | relx:error().
check_lib_dirs([]) ->
ok;
diff --git a/src/rlx_prv_assembler.erl b/src/rlx_prv_assembler.erl
index ee5854a..fba21ca 100644
--- a/src/rlx_prv_assembler.erl
+++ b/src/rlx_prv_assembler.erl
@@ -115,6 +115,10 @@ format_error({relup_generation_error, CurrentName, UpFromName}) ->
format_error({relup_generation_warning, Module, Warnings}) ->
["Warnings generating relup \s",
rlx_util:indent(2), Module:format_warning(Warnings)];
+format_error({no_upfrom_release_found, undefined}) ->
+ io_lib:format("No earlier release for relup found", []);
+format_error({no_upfrom_release_found, Vsn}) ->
+ io_lib:format("Upfrom release version (~s) for relup not found", [Vsn]);
format_error({relup_script_generation_error,
{relup_script_generation_error, systools_relup,
{missing_sasl, _}}}) ->
@@ -167,6 +171,7 @@ create_output_dir(OutputDir) ->
copy_app_directories_to_output(State, Release, OutputDir) ->
LibDir = filename:join([OutputDir, "lib"]),
ok = ec_file:mkdir_p(LibDir),
+ IncludeSrc = rlx_state:include_src(State),
Apps = prepare_applications(State, rlx_release:application_details(Release)),
Result = lists:filter(fun({error, _}) ->
true;
@@ -174,7 +179,7 @@ copy_app_directories_to_output(State, Release, OutputDir) ->
false
end,
lists:flatten(ec_plists:map(fun(App) ->
- copy_app(LibDir, App)
+ copy_app(LibDir, App, IncludeSrc)
end, Apps))),
case Result of
[E | _] ->
@@ -191,7 +196,7 @@ prepare_applications(State, Apps) ->
Apps
end.
-copy_app(LibDir, App) ->
+copy_app(LibDir, App, IncludeSrc) ->
AppName = erlang:atom_to_list(rlx_app_info:name(App)),
AppVsn = rlx_app_info:original_vsn(App),
AppDir = rlx_app_info:dir(App),
@@ -202,16 +207,16 @@ copy_app(LibDir, App) ->
%% a release dir
ok;
true ->
- copy_app(App, AppDir, TargetDir)
+ copy_app(App, AppDir, TargetDir, IncludeSrc)
end.
-copy_app(App, AppDir, TargetDir) ->
+copy_app(App, AppDir, TargetDir, IncludeSrc) ->
remove_symlink_or_directory(TargetDir),
case rlx_app_info:link(App) of
true ->
link_directory(AppDir, TargetDir);
false ->
- copy_directory(AppDir, TargetDir)
+ copy_directory(AppDir, TargetDir, IncludeSrc)
end.
remove_symlink_or_directory(TargetDir) ->
@@ -235,16 +240,21 @@ link_directory(AppDir, TargetDir) ->
ok
end.
-copy_directory(AppDir, TargetDir) ->
+copy_directory(AppDir, TargetDir, IncludeSrc) ->
ec_plists:map(fun(SubDir) ->
copy_dir(AppDir, TargetDir, SubDir)
end, ["ebin",
"include",
"priv",
- "src",
- "c_src",
"README",
- "LICENSE"]).
+ "LICENSE" |
+ case IncludeSrc of
+ true ->
+ ["src",
+ "c_src"];
+ false ->
+ []
+ end]).
copy_dir(AppDir, TargetDir, SubDir) ->
SubSource = filename:join(AppDir, SubDir),
@@ -447,8 +457,9 @@ make_script(Options, RunFun) ->
end.
make_relup(State, Release) ->
+ Vsn = rlx_state:upfrom(State),
UpFrom =
- case rlx_state:upfrom(State) of
+ case Vsn of
undefined ->
get_last_release(State, Release);
Vsn ->
@@ -456,7 +467,7 @@ make_relup(State, Release) ->
end,
case UpFrom of
undefined ->
- ?RLX_ERROR(no_upfrom_release_found);
+ ?RLX_ERROR({no_upfrom_release_found, Vsn});
_ ->
make_upfrom_script(State, Release, UpFrom)
end.
@@ -574,7 +585,7 @@ get_up_release(State, Release, Vsn) ->
try
ec_dictionary:get({Name, Vsn}, rlx_state:realized_releases(State))
catch
- throw:notfound ->
+ throw:not_found ->
undefined
end.
diff --git a/src/rlx_prv_config.erl b/src/rlx_prv_config.erl
index b223bce..19aa576 100644
--- a/src/rlx_prv_config.erl
+++ b/src/rlx_prv_config.erl
@@ -154,6 +154,20 @@ load_terms({overrides, Overrides0}, {ok, State0}) ->
{ok, rlx_state:overrides(State0, Overrides0)};
load_terms({dev_mode, DevMode}, {ok, State0}) ->
{ok, rlx_state:dev_mode(State0, DevMode)};
+load_terms({include_src, IncludeSrc}, {ok, State0}) ->
+ {ok, rlx_state:include_src(State0, IncludeSrc)};
+load_terms({release, {RelName, Vsn, {extend, RelName2}}, Applications}, {ok, State0}) ->
+ Release0 = rlx_release:new(RelName, Vsn),
+ ExtendRelease = rlx_state:get_configured_release(State0, RelName2, Vsn),
+ Applications1 = rlx_release:goals(ExtendRelease),
+ case rlx_release:goals(Release0,
+ lists:umerge(lists:usort(Applications),
+ lists:usort(Applications1))) of
+ E={error, _} ->
+ E;
+ {ok, Release1} ->
+ {ok, rlx_state:add_configured_release(State0, Release1)}
+ end;
load_terms({release, {RelName, Vsn}, Applications}, {ok, State0}) ->
Release0 = rlx_release:new(RelName, Vsn),
case rlx_release:goals(Release0, Applications) of
@@ -177,8 +191,9 @@ load_terms({sys_config, SysConfig}, {ok, State}) ->
{ok, rlx_state:sys_config(State, filename:absname(SysConfig))};
load_terms({overlay_vars, OverlayVars}, {ok, State}) ->
CurrentOverlayVars = rlx_state:get(State, overlay_vars),
- NewOverlayVars = lists:umerge(lists:usort(OverlayVars), lists:usort(CurrentOverlayVars)),
- {ok, rlx_state:put(State, overlay_vars, NewOverlayVars)};
+ NewOverlayVars0 = list_of_overlay_vars_files(OverlayVars),
+ NewOverlayVars1 = lists:umerge(lists:usort(NewOverlayVars0), lists:usort(CurrentOverlayVars)),
+ {ok, rlx_state:put(State, overlay_vars, NewOverlayVars1)};
load_terms({Name, Value}, {ok, State})
when erlang:is_atom(Name) ->
{ok, rlx_state:put(State, Name, Value)};
@@ -196,3 +211,12 @@ gen_providers(Providers, State) ->
(_, E={_, {error, _}}) ->
E
end, {[], {ok, State}}, Providers).
+
+list_of_overlay_vars_files(undefined) ->
+ [];
+list_of_overlay_vars_files([]) ->
+ [];
+list_of_overlay_vars_files([H | _]=FileNames) when erlang:is_list(H) ->
+ FileNames;
+list_of_overlay_vars_files(FileName) when is_list(FileName) ->
+ [FileName].
diff --git a/src/rlx_state.erl b/src/rlx_state.erl
index 81f9fca..bc4af5b 100644
--- a/src/rlx_state.erl
+++ b/src/rlx_state.erl
@@ -63,6 +63,8 @@
caller/2,
dev_mode/1,
dev_mode/2,
+ include_src/1,
+ include_src/2,
upfrom/1,
format/1,
format/2]).
@@ -91,6 +93,7 @@
configured_releases :: releases(),
realized_releases :: releases(),
dev_mode=false :: boolean(),
+ include_src=true :: boolean(),
upfrom :: string() | binary() | undefined,
config_values :: ec_dictionary:dictionary(Key::atom(),
Value::term())}).
@@ -125,6 +128,7 @@ new(PropList, Targets)
output_dir=proplists:get_value(output_dir, PropList, ""),
lib_dirs=[to_binary(Dir) || Dir <- proplists:get_value(lib_dirs, PropList, [])],
config_file=proplists:get_value(config, PropList, undefined),
+ dev_mode = proplists:get_value(dev_mode, PropList),
actions = Targets,
caller = Caller,
goals=proplists:get_value(goals, PropList, []),
@@ -328,6 +332,13 @@ dev_mode(#state_t{dev_mode=DevMode}) ->
dev_mode(S, DevMode) ->
S#state_t{dev_mode=DevMode}.
+-spec include_src(t()) -> boolean().
+include_src(#state_t{include_src=IncludeSrc}) ->
+ IncludeSrc.
+
+-spec include_src(t(), boolean()) -> t().
+include_src(S, IncludeSrc) ->
+ S#state_t{include_src=IncludeSrc}.
-spec upfrom(t()) -> string() | binary() | undefined.
upfrom(#state_t{upfrom=UpFrom}) ->
diff --git a/test/rlx_release_SUITE.erl b/test/rlx_release_SUITE.erl
index 184f444..d16dce9 100644
--- a/test/rlx_release_SUITE.erl
+++ b/test/rlx_release_SUITE.erl
@@ -25,6 +25,7 @@
init_per_testcase/2,
all/0,
make_release/1,
+ make_extend_release/1,
make_scriptless_release/1,
make_overridden_release/1,
make_skip_app_release/1,
@@ -64,8 +65,8 @@ init_per_testcase(_, Config) ->
{state, State} | Config].
all() ->
- [make_release, make_scriptless_release, make_overridden_release,
- make_auto_skip_empty_app_release,
+ [make_release, make_extend_release, make_scriptless_release,
+ make_overridden_release, make_auto_skip_empty_app_release,
make_skip_app_release, make_app_type_none_release,
make_implicit_config_release, make_rerun_overridden_release,
overlay_release, make_goalless_release, make_depfree_release,
@@ -107,6 +108,43 @@ make_release(Config) ->
?assert(lists:member({goal_app_2, "0.0.1"}, AppSpecs)),
?assert(lists:member({lib_dep_1, "0.0.1", load}, AppSpecs)).
+make_extend_release(Config) ->
+ LibDir1 = proplists:get_value(lib1, Config),
+ [(fun({Name, Vsn}) ->
+ create_app(LibDir1, Name, Vsn, [kernel, stdlib], [])
+ end)(App)
+ ||
+ App <-
+ [{create_random_name("lib_app1_"), create_random_vsn()}
+ || _ <- lists:seq(1, 100)]],
+
+ create_app(LibDir1, "goal_app_1", "0.0.1", [stdlib,kernel,non_goal_1], []),
+ create_app(LibDir1, "lib_dep_1", "0.0.1", [stdlib,kernel], []),
+ create_app(LibDir1, "goal_app_2", "0.0.1", [stdlib,kernel,goal_app_1,non_goal_2], []),
+ create_app(LibDir1, "non_goal_1", "0.0.1", [stdlib,kernel], [lib_dep_1]),
+ create_app(LibDir1, "non_goal_2", "0.0.1", [stdlib,kernel], []),
+
+ ConfigFile = filename:join([LibDir1, "relx.config"]),
+ write_config(ConfigFile,
+ [{release, {foo, "0.0.1"},
+ [goal_app_1,
+ goal_app_2]},
+ {release, {foo_test, "0.0.1", {extend, foo}},
+ [goal_app_2]}]),
+ OutputDir = filename:join([proplists:get_value(data_dir, Config),
+ create_random_name("relx-output")]),
+ {ok, State} = relx:do(foo_test, undefined, [], [LibDir1], 3,
+ OutputDir, ConfigFile),
+ [{{foo_test, "0.0.1"}, Release}] = ec_dictionary:to_list(rlx_state:realized_releases(State)),
+ AppSpecs = rlx_release:applications(Release),
+ ?assert(lists:keymember(stdlib, 1, AppSpecs)),
+ ?assert(lists:keymember(kernel, 1, AppSpecs)),
+ ?assert(lists:member({non_goal_1, "0.0.1"}, AppSpecs)),
+ ?assert(lists:member({non_goal_2, "0.0.1"}, AppSpecs)),
+ ?assert(lists:member({goal_app_1, "0.0.1"}, AppSpecs)),
+ ?assert(lists:member({goal_app_2, "0.0.1"}, AppSpecs)),
+ ?assert(lists:member({lib_dep_1, "0.0.1", load}, AppSpecs)).
+
make_invalid_config_release(Config) ->
LibDir1 = proplists:get_value(lib1, Config),
[(fun({Name, Vsn}) ->
@@ -410,11 +448,13 @@ make_rerun_overridden_release(Config) ->
create_app(OverrideDir1, OverrideApp, OverrideVsn, [stdlib,kernel], []),
ConfigFile = filename:join([LibDir1, "relx.config"]),
+ OverlayVars = filename:join([LibDir1, "vars1.config"]),
write_config(ConfigFile,
[{release, {foo, "0.0.1"},
[goal_app_1,
erlang:list_to_atom(OverrideApp),
- goal_app_2]}]),
+ goal_app_2]},
+ {overlay_vars, [OverlayVars]}]),
OutputDir = filename:join([proplists:get_value(data_dir, Config),
create_random_name("relx-output")]),
{ok, Cwd} = file:get_cwd(),