diff options
-rw-r--r-- | src/relx.erl | 2 | ||||
-rw-r--r-- | src/rlx_cmd_args.erl | 8 | ||||
-rw-r--r-- | src/rlx_prv_assembler.erl | 35 | ||||
-rw-r--r-- | src/rlx_prv_config.erl | 28 | ||||
-rw-r--r-- | src/rlx_state.erl | 11 | ||||
-rw-r--r-- | test/rlx_release_SUITE.erl | 46 |
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(), |