diff options
-rw-r--r-- | src/rlx_prv_assembler.erl | 48 | ||||
-rw-r--r-- | src/rlx_prv_config.erl | 2 | ||||
-rw-r--r-- | src/rlx_rel_discovery.erl | 18 | ||||
-rw-r--r-- | src/rlx_state.erl | 5 | ||||
-rw-r--r-- | test/rlx_discover_SUITE.erl | 6 | ||||
-rw-r--r-- | test/rlx_release_SUITE.erl | 8 |
6 files changed, 60 insertions, 27 deletions
diff --git a/src/rlx_prv_assembler.erl b/src/rlx_prv_assembler.erl index 282f050..cdbcea0 100644 --- a/src/rlx_prv_assembler.erl +++ b/src/rlx_prv_assembler.erl @@ -331,24 +331,26 @@ write_bin_file(State, Release, OutputDir, RelDir) -> ok = file:write_file(BareRel, StartFile), ok = file:change_mode(BareRel, 8#777) end, - copy_or_generate_vmargs_file(State, RelName, RelDir), + copy_or_generate_vmargs_file(State, Release, OutputDir, RelDir), copy_or_generate_sys_config_file(State, Release, OutputDir, RelDir). %% @doc copy vm.args or generate one to releases/VSN/vm.args --spec copy_or_generate_vmargs_file(rlx_state:t(), string(), file:name()) -> +-spec copy_or_generate_vmargs_file(rlx_state:t(), rlx_release:t(), file:name(), file:name()) -> {ok, rlx_state:t()} | relx:error(). -copy_or_generate_vmargs_file(State, RelName, RelDir) -> +copy_or_generate_vmargs_file(State, Release, OutputDir, RelDir) -> RelVmargsPath = filename:join([RelDir, "vm.args"]), case rlx_state:vm_args(State) of undefined -> + RelName = erlang:atom_to_list(rlx_release:name(Release)), unless_exists_write_default(RelVmargsPath, vm_args_file(RelName)); ArgsPath -> case filelib:is_regular(ArgsPath) of false -> ?RLX_ERROR({vmargs_does_not_exist, ArgsPath}); true -> - ec_file:copy(ArgsPath, RelVmargsPath) + copy_or_symlink_config_file(State, Release, OutputDir, RelDir, + ArgsPath, RelVmargsPath) end end. @@ -367,23 +369,24 @@ copy_or_generate_sys_config_file(State, Release, OutputDir, RelDir) -> false -> ?RLX_ERROR({config_does_not_exist, ConfigPath}); true -> - copy_or_symlink_sys_config_file(State, Release, OutputDir, RelDir, + copy_or_symlink_config_file(State, Release, OutputDir, RelDir, ConfigPath, RelSysConfPath) end end. %% @doc copy config/sys.config or generate one to releases/VSN/sys.config --spec copy_or_symlink_sys_config_file(rlx_state:t(), rlx_release:t(), - file:name(), file:name(), - file:name(), file:name()) -> - {ok, rlx_state:t()} | relx:error(). -copy_or_symlink_sys_config_file(State, Release, OutputDir, RelDir, - ConfigPath, RelSysConfPath) -> +-spec copy_or_symlink_config_file(rlx_state:t(), rlx_release:t(), + file:name(), file:name(), + file:name(), file:name()) -> + {ok, rlx_state:t()} | relx:error(). +copy_or_symlink_config_file(State, Release, OutputDir, RelDir, + ConfigPath, RelConfPath) -> + ensure_not_exist(RelConfPath), case rlx_state:dev_mode(State) of true -> - ok = file:make_symlink(ConfigPath, RelSysConfPath); + ok = file:make_symlink(ConfigPath, RelConfPath); _ -> - ok = ec_file:copy(ConfigPath, RelSysConfPath) + ok = ec_file:copy(ConfigPath, RelConfPath) end, include_erts(State, Release, OutputDir, RelDir). @@ -427,14 +430,14 @@ make_boot_script(State, Release, OutputDir, RelDir) -> systools:make_script(Name, CorrectedOptions) end) of ok -> - ec_cmd_log:error(rlx_state:log(State), + ec_cmd_log:info(rlx_state:log(State), "release successfully created!"), create_RELEASES(OutputDir, ReleaseFile), {ok, State}; error -> ?RLX_ERROR({release_script_generation_error, ReleaseFile}); {ok, _, []} -> - ec_cmd_log:error(rlx_state:log(State), + ec_cmd_log:info(rlx_state:log(State), "release successfully created!"), create_RELEASES(OutputDir, ReleaseFile), {ok, State}; @@ -637,6 +640,15 @@ unless_exists_write_default(Path, File) -> ok = file:write_file(Path, File) end. +-spec ensure_not_exist(file:name()) -> ok. +ensure_not_exist(RelConfPath) -> + case ec_file:exists(RelConfPath) of + false -> + ok; + _ -> + ec_file:remove(RelConfPath) + end. + erl_script(ErtsVsn) -> [<<"#!/bin/sh set -e @@ -938,8 +950,8 @@ case \"$1\" in # however, for debugging, sometimes start_clean.boot is useful. # For e.g. 'setup', one may even want to name another boot script. case \"$1\" in - console) [ -f $REL_DIR/$REL_NAME.boot ] && BOOTFILE=$REL_NAME || BOOTFILE=start ;; - console_clean) BOOTFILE=start_clean ;; + console) [ -f $REL_DIR/$REL_NAME.boot ] && BOOTFILE=$REL_DIR/$REL_NAME || BOOTFILE=$REL_DIR/start ;; + console_clean) BOOTFILE=$ROOTDIR/bin/start_clean ;; console_boot) shift BOOTFILE=\"$1\" @@ -949,7 +961,7 @@ case \"$1\" in # Setup beam-required vars EMU=beam PROGNAME=`echo $0 | sed 's/.*\\///'` - CMD=\"$BINDIR/erlexec -boot $REL_DIR/$BOOTFILE -mode embedded -config $CONFIG_PATH -args_file $VMARGS_PATH\" + CMD=\"$BINDIR/erlexec -boot $BOOTFILE -mode embedded -config $CONFIG_PATH -args_file $VMARGS_PATH\" export EMU export PROGNAME diff --git a/src/rlx_prv_config.erl b/src/rlx_prv_config.erl index aa2e79c..0379c2f 100644 --- a/src/rlx_prv_config.erl +++ b/src/rlx_prv_config.erl @@ -189,6 +189,8 @@ load_terms({vm_args, VmArgs}, {ok, State}) -> {ok, rlx_state:vm_args(State, filename:absname(VmArgs))}; load_terms({sys_config, SysConfig}, {ok, State}) -> {ok, rlx_state:sys_config(State, filename:absname(SysConfig))}; +load_terms({output_dir, OutputDir}, {ok, State}) -> + {ok, rlx_state:output_dir(State, filename:absname(OutputDir))}; load_terms({overlay_vars, OverlayVars}, {ok, State}) -> CurrentOverlayVars = rlx_state:get(State, overlay_vars), NewOverlayVars0 = list_of_overlay_vars_files(OverlayVars), diff --git a/src/rlx_rel_discovery.erl b/src/rlx_rel_discovery.erl index 837ebe6..23c0ab9 100644 --- a/src/rlx_rel_discovery.erl +++ b/src/rlx_rel_discovery.erl @@ -38,12 +38,18 @@ -spec do(rlx_state:t(), [file:name()], [rlx_app_info:t()]) -> {ok, [rlx_release:t()]} | relx:error(). do(State, LibDirs, AppMeta) -> - ec_cmd_log:info(rlx_state:log(State), - fun() -> - ["Resolving available OTP Releases from directories:\n", - string:join([[rlx_util:indent(2), LibDir] || LibDir <- LibDirs], "\n")] - end), - resolve_rel_metadata(State, LibDirs, AppMeta). + case rlx_state:get(State, disable_rel_discovery, false) of + true -> + ec_cmd_log:debug(rlx_state:log(State), "Disbaled resolving of OTP releases"), + {ok, []}; + false -> + ec_cmd_log:info(rlx_state:log(State), + fun() -> + ["Resolving available OTP Releases from directories:\n", + string:join([[rlx_util:indent(2), LibDir] || LibDir <- LibDirs], "\n")] + end), + resolve_rel_metadata(State, LibDirs, AppMeta) + end. -spec format_error([ErrorDetail::term()]) -> iolist(). format_error(ErrorDetails) diff --git a/src/rlx_state.erl b/src/rlx_state.erl index bc4af5b..2d0493b 100644 --- a/src/rlx_state.erl +++ b/src/rlx_state.erl @@ -27,6 +27,7 @@ log/1, actions/1, output_dir/1, + output_dir/2, lib_dirs/1, add_lib_dirs/2, overrides/1, @@ -186,6 +187,10 @@ log(#state_t{log=LogState}) -> output_dir(#state_t{output_dir=OutDir}) -> OutDir. +-spec output_dir(t(), Directory::file:filename()) -> t(). +output_dir(State, Directory) -> + State#state_t{output_dir=Directory}. + -spec lib_dirs(t()) -> [file:name()]. lib_dirs(#state_t{lib_dirs=LibDir}) -> LibDir. diff --git a/test/rlx_discover_SUITE.erl b/test/rlx_discover_SUITE.erl index e75ea36..0fb1ad7 100644 --- a/test/rlx_discover_SUITE.erl +++ b/test/rlx_discover_SUITE.erl @@ -110,10 +110,12 @@ no_beam_case(Config) -> AppDir = filename:join([LibDir2, BadName]), write_app_file(AppDir, BadName, BadVsn), State0 = proplists:get_value(state, Config), - {DiscoverProvider, {ok, State1}} = rlx_provider:new(rlx_prv_discover, State0), + %% Deliberately disable release discovery when running `rlx_prv_discover` + State1 = rlx_state:put(State0, disable_rel_discovery, true), + {DiscoverProvider, {ok, State2}} = rlx_provider:new(rlx_prv_discover, State1), ?assertMatch({ok, _}, - rlx_provider:do(DiscoverProvider, State1)). + rlx_provider:do(DiscoverProvider, State2)). bad_ebin_case(Config) -> LibDir1 = proplists:get_value(lib1, Config), diff --git a/test/rlx_release_SUITE.erl b/test/rlx_release_SUITE.erl index c2ed984..8f27050 100644 --- a/test/rlx_release_SUITE.erl +++ b/test/rlx_release_SUITE.erl @@ -900,10 +900,14 @@ make_dev_mode_release(Config) -> SysConfig = filename:join([LibDir1, "config", "sys.config"]), write_config(SysConfig, [{this_is_a_test, "yup it is"}]), + VmArgs = filename:join([LibDir1, "config", "vm.args"]), + ec_file:write(VmArgs, ""), + ConfigFile = filename:join([LibDir1, "relx.config"]), write_config(ConfigFile, [{dev_mode, true}, {sys_config, SysConfig}, + {vm_args, VmArgs}, {release, {foo, "0.0.1"}, [goal_app_1, goal_app_2]}]), @@ -919,7 +923,9 @@ make_dev_mode_release(Config) -> ?assert(ec_file:is_symlink(filename:join([OutputDir, "lib", "goal_app_2-0.0.1"]))), ?assert(ec_file:is_symlink(filename:join([OutputDir, "lib", "lib_dep_1-0.0.1"]))), ?assert(ec_file:is_symlink(filename:join([OutputDir, "releases", "0.0.1", - "sys.config"]))). + "sys.config"]))), + ?assert(ec_file:is_symlink(filename:join([OutputDir, "releases", "0.0.1", + "vm.args"]))). %%%=================================================================== |