diff options
-rw-r--r-- | README.md | 1 | ||||
-rwxr-xr-x | bootstrap | 1 | ||||
-rw-r--r-- | priv/shell-completion/bash/rebar3 | 23 | ||||
-rw-r--r-- | priv/shell-completion/zsh/_rebar3 | 24 | ||||
-rw-r--r-- | rebar.config | 2 | ||||
-rw-r--r-- | rebar.lock | 2 | ||||
-rw-r--r-- | src/rebar.app.src | 1 | ||||
-rw-r--r-- | src/rebar_prv_common_test.erl | 12 | ||||
-rw-r--r-- | src/rebar_prv_install_deps.erl | 7 | ||||
-rw-r--r-- | src/rebar_prv_release.erl | 5 | ||||
-rw-r--r-- | src/rebar_prv_relup.erl | 67 | ||||
-rw-r--r-- | src/rebar_prv_tar.erl | 9 |
12 files changed, 135 insertions, 19 deletions
@@ -45,6 +45,7 @@ limit scope. | pkgs | List available packages | | plugins | List or upgrade plugins | | release | Build release of project | +| relup | Creates relup from 2 releases | | report | Report on environment and versions for bug reports | | shell | Run shell with project apps in path | | tar | Package release into tarball | @@ -232,6 +232,7 @@ setup_env() -> application:load(rebar), {ok, Providers} = application:get_env(rebar, providers), Providers1 = Providers -- [rebar_prv_release, + rebar_prv_relup, rebar_prv_tar], application:set_env(rebar, providers, Providers1). diff --git a/priv/shell-completion/bash/rebar3 b/priv/shell-completion/bash/rebar3 index ff8997d..4e28d3d 100644 --- a/priv/shell-completion/bash/rebar3 +++ b/priv/shell-completion/bash/rebar3 @@ -25,6 +25,7 @@ _rebar3() pkgs \ plugins \ release \ + relup \ report \ shell \ tar \ @@ -119,6 +120,28 @@ _rebar3() --system_libs \ --version \ --root" + elif [[ ${prev} == relup ]] ; then + sopts="-n -v -g -u -o -h -l -p -V -d -i -a -c -r" + lopts="--relname \ + --relvsn \ + --goal \ + --upfrom \ + --output-dir \ + --help \ + --lib-dir \ + --path \ + --default-libs \ + --verbose \ + --dev-mode \ + --include-erts \ + --override \ + --config \ + --overlay_vars \ + --vm_args \ + --sys_config \ + --system_libs \ + --version \ + --root" elif [[ ${prev} == report ]] ; then : elif [[ ${prev} == shell ]] ; then diff --git a/priv/shell-completion/zsh/_rebar3 b/priv/shell-completion/zsh/_rebar3 index 456e6c8..b03b7c9 100644 --- a/priv/shell-completion/zsh/_rebar3 +++ b/priv/shell-completion/zsh/_rebar3 @@ -139,6 +139,29 @@ _rebar3 () { '(-r --root)'{-r,--root}'[The project root directory]:system libs:_files -/' \ && ret=0 ;; + (relup) + _arguments \ + '(-n --relname)'{-n,--relname}'[Specify the name for the release that will be generated.]:relname' \ + '(-v --relvsn)'{-n,--relname}'[Specify the version for the release.]:relvsn' \ + '(-g --goal)'{-g,--goal}'[Specify a target constraint on the system. These are usually the OTP.]:goal' \ + '(-u --upfrom)'{-u,--upfrom}'[Only valid with relup target, specify the release to upgrade from.]:upfrom' \ + '(-o --output-dir)'{-o,--output-dir}'[The output directory for the release. This is ./ by default.]:out directory:_files -/' \ + '(-l --lib-dir)'{-l,--output-dir}'[Additional dir that should be searched for OTP Apps]:lib directory:_files -/' \ + '(-p --path)'{-p,--path}'[Additional dir to add to the code path]:path directory:_files -/' \ + '(--default-libs)--default-libs[Whether to use the default system added lib dirs]:default libs:(true false)' \ + '(-V --verbose)'{-V,--verbose}'[Verbosity level, maybe between 0 and 3 ,default: 2]:verbosity level:(0 1 2 3)' \ + '(-d --dev-mode)'{-d,--dev-mode}'[Symlink the applications and configuration into the release instead of copying]' \ + '(-i --include-erts)'{-i,--dev-mode}'[If true include a copy of erts used to build with, if a path include erts at that path. If false, do not include erts]' \ + '(-a --override)'{-a,--override}'[Provide an app name and a directory to override in the form <appname>:<app directory>]:override' \ + '(-c --config)'{-c,--config}'[The path to a config file]:config file:_files ' \ + '(--overlay_vars)--overlay_vars[Path to a file of overlay variables]:overlay variables file:_files' \ + '(--vm_args)--vm_args[Path to a file to use for vm.args]:vm args file:_files' \ + '(--sys_config)--sys_config[Path to a file to use for sys.config]:sys config file:_files' \ + '(--system_libs)--system_libs[Path to dir of Erlang system libs]:system libs:_files -/' \ + '(--version)--version[Print relx version]' \ + '(-r --root)'{-r,--root}'[The project root directory]:system libs:_files -/' \ + && ret=0 + ;; (report) _arguments '1: :_rebar3_tasks' && ret=0 ;; @@ -209,6 +232,7 @@ _rebar3_tasks() { 'pkgs:List available packages.' 'plugins:List or upgrade plugins.' 'release:Build release of project.' + 'relup:Create relup from 2 releases.' 'report:Provide a crash report to be sent to the rebar3 issues page.' 'shell:Run shell with project apps and deps in path.' 'tar:Tar archive of release built of project.' diff --git a/rebar.config b/rebar.config index ab679dc..bd0f517 100644 --- a/rebar.config +++ b/rebar.config @@ -6,7 +6,7 @@ {providers, "1.4.1"}, {getopt, "0.8.2"}, {bbmustache, "1.0.1"}, - {relx, "2.1.0"}]}. + {relx, "3.0.0"}]}. {escript_name, rebar3}. {escript_emu_args, "%%! +sbtu +A0\n"}. @@ -1,5 +1,5 @@ [{<<"bbmustache">>,{pkg,<<"bbmustache">>,<<"1.0.1">>},0}, {<<"providers">>,{pkg,<<"providers">>,<<"1.4.1">>},0}, {<<"erlware_commons">>,{pkg,<<"erlware_commons">>,<<"0.12.0">>},0}, - {<<"relx">>,{pkg,<<"relx">>,<<"2.1.0">>},0}, + {<<"relx">>,{pkg,<<"relx">>,<<"3.0.0">>},0}, {<<"getopt">>,{pkg,<<"getopt">>,<<"0.8.2">>},0}]. diff --git a/src/rebar.app.src b/src/rebar.app.src index 0ec0fcb..5abb643 100644 --- a/src/rebar.app.src +++ b/src/rebar.app.src @@ -48,6 +48,7 @@ rebar_prv_plugins, rebar_prv_plugins_upgrade, rebar_prv_release, + rebar_prv_relup, rebar_prv_report, rebar_prv_shell, rebar_prv_tar, diff --git a/src/rebar_prv_common_test.erl b/src/rebar_prv_common_test.erl index 6bf0533..2b024cf 100644 --- a/src/rebar_prv_common_test.erl +++ b/src/rebar_prv_common_test.erl @@ -105,14 +105,18 @@ run_test_verbose(Opts) -> handle_results(ct:run_test(Opts)). run_test_quiet(Opts) -> Pid = self(), + Ref = erlang:make_ref(), LogDir = proplists:get_value(logdir, Opts), - erlang:spawn_monitor(fun() -> + {_, Monitor} = erlang:spawn_monitor(fun() -> {ok, F} = file:open(filename:join([LogDir, "ct.latest.log"]), [write]), true = group_leader(F, self()), - Pid ! ct:run_test(Opts) + Pid ! {Ref, ct:run_test(Opts)} end), - receive Result -> handle_quiet_results(Opts, Result) end. + receive + {Ref, Result} -> handle_quiet_results(Opts, Result); + {'DOWN', Monitor, _, _, Reason} -> handle_results(?PRV_ERROR(Reason)) + end. handle_results(Results) when is_list(Results) -> Result = lists:foldl(fun sum_results/2, {0, 0, {0,0}}, Results), @@ -132,8 +136,6 @@ sum_results({Passed, Failed, {UserSkipped, AutoSkipped}}, handle_quiet_results(_, {error, _} = Result) -> handle_results(Result); -handle_quiet_results(_, {'DOWN', _, _, _, Reason}) -> - handle_results(?PRV_ERROR(Reason)); handle_quiet_results(CTOpts, Results) when is_list(Results) -> _ = [format_result(Result) || Result <- Results], case handle_results(Results) of diff --git a/src/rebar_prv_install_deps.erl b/src/rebar_prv_install_deps.erl index cfce1b7..768d41a 100644 --- a/src/rebar_prv_install_deps.erl +++ b/src/rebar_prv_install_deps.erl @@ -386,10 +386,9 @@ handle_dep(State, Profile, DepsDir, AppInfo, Locks, Level) -> S1 = rebar_state:new(S, C, rebar_app_info:dir(AppInfo)), S2 = rebar_state:apply_overrides(S1, Name), - Plugins = rebar_state:get(S2, plugins, []), - S3 = rebar_state:set(S2, {plugins, Profile}, Plugins), - - S4 = rebar_state:apply_profiles(S3, Profiles), + S3 = rebar_state:apply_profiles(S2, Profiles), + Plugins = rebar_state:get(S3, plugins, []), + S4 = rebar_state:set(S3, {plugins, Profile}, Plugins), AppInfo1 = rebar_app_info:state(AppInfo, S4), %% Dep may have plugins to install. Find and install here. diff --git a/src/rebar_prv_release.erl b/src/rebar_prv_release.erl index 982b392..dc58047 100644 --- a/src/rebar_prv_release.erl +++ b/src/rebar_prv_release.erl @@ -32,7 +32,6 @@ init(State) -> -spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}. do(State) -> - Caller = rebar_state:get(State, caller, api), Options = rebar_state:command_args(State), DepsDir = rebar_dir:deps_dir(State), ProjectAppDirs = lists:delete(".", ?DEFAULT_PROJECT_APP_DIRS), @@ -48,12 +47,12 @@ do(State) -> [] -> relx:main([{lib_dirs, LibDirs} ,{output_dir, OutputDir} - ,{caller, Caller}], AllOptions); + ,{caller, api}], AllOptions); Config -> relx:main([{lib_dirs, LibDirs} ,{config, lists:reverse(Config)} ,{output_dir, OutputDir} - ,{caller, Caller}], AllOptions) + ,{caller, api}], AllOptions) end, rebar_hooks:run_all_hooks(Cwd, post, ?PROVIDER, Providers, State), {ok, State} diff --git a/src/rebar_prv_relup.erl b/src/rebar_prv_relup.erl new file mode 100644 index 0000000..aed12a6 --- /dev/null +++ b/src/rebar_prv_relup.erl @@ -0,0 +1,67 @@ +%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*- +%% ex: ts=4 sw=4 et + +-module(rebar_prv_relup). + +-behaviour(provider). + +-export([init/1, + do/1, + format_error/1]). + +-include("rebar.hrl"). + +-define(PROVIDER, relup). +-define(DEPS, [release]). + +%% =================================================================== +%% Public API +%% =================================================================== + +-spec init(rebar_state:t()) -> {ok, rebar_state:t()}. +init(State) -> + Provider = providers:create([{name, ?PROVIDER}, + {module, ?MODULE}, + {bare, true}, + {deps, ?DEPS}, + {example, "rebar3 relup"}, + {short_desc, "Create relup of releases."}, + {desc, "Create relup of releases."}, + {opts, relx:opt_spec_list()}]), + State1 = rebar_state:add_provider(State, Provider), + {ok, State1}. + +-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}. +do(State) -> + Options = rebar_state:command_args(State), + DepsDir = rebar_dir:deps_dir(State), + ProjectAppDirs = lists:delete(".", ?DEFAULT_PROJECT_APP_DIRS), + LibDirs = rebar_utils:filtermap(fun ec_file:exists/1, + [?DEFAULT_CHECKOUTS_DIR, DepsDir | ProjectAppDirs]), + OutputDir = filename:join(rebar_dir:base_dir(State), ?DEFAULT_RELEASE_DIR), + AllOptions = string:join(["relup" | Options], " "), + Cwd = rebar_state:dir(State), + Providers = rebar_state:providers(State), + rebar_hooks:run_all_hooks(Cwd, pre, ?PROVIDER, Providers, State), + try + case rebar_state:get(State, relx, []) of + [] -> + relx:main([{lib_dirs, LibDirs} + ,{output_dir, OutputDir} + ,{caller, api}], AllOptions); + Config -> + relx:main([{lib_dirs, LibDirs} + ,{config, lists:reverse(Config)} + ,{output_dir, OutputDir} + ,{caller, api}], AllOptions) + end, + rebar_hooks:run_all_hooks(Cwd, post, ?PROVIDER, Providers, State), + {ok, State} + catch + throw:T -> + {error, {rlx_prv_release, T}} + end. + +-spec format_error(any()) -> iolist(). +format_error(Reason) -> + io_lib:format("~p", [Reason]). diff --git a/src/rebar_prv_tar.erl b/src/rebar_prv_tar.erl index 0c04d72..17d7b0b 100644 --- a/src/rebar_prv_tar.erl +++ b/src/rebar_prv_tar.erl @@ -12,7 +12,7 @@ -include("rebar.hrl"). -define(PROVIDER, tar). --define(DEPS, [compile]). +-define(DEPS, [release]). %% =================================================================== %% Public API @@ -32,14 +32,13 @@ init(State) -> -spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}. do(State) -> - Caller = rebar_state:get(State, caller, api), Options = rebar_state:command_args(State), DepsDir = rebar_dir:deps_dir(State), ProjectAppDirs = lists:delete(".", ?DEFAULT_PROJECT_APP_DIRS), LibDirs = rebar_utils:filtermap(fun ec_file:exists/1, [?DEFAULT_CHECKOUTS_DIR, DepsDir | ProjectAppDirs]), OutputDir = filename:join(rebar_dir:base_dir(State), ?DEFAULT_RELEASE_DIR), - AllOptions = string:join(["release", "tar" | Options], " "), + AllOptions = string:join(["tar" | Options], " "), Cwd = rebar_state:dir(State), Providers = rebar_state:providers(State), rebar_hooks:run_all_hooks(Cwd, pre, ?PROVIDER, Providers, State), @@ -47,12 +46,12 @@ do(State) -> [] -> relx:main([{lib_dirs, LibDirs} ,{output_dir, OutputDir} - ,{caller, Caller}], AllOptions); + ,{caller, api}], AllOptions); Config -> relx:main([{lib_dirs, LibDirs} ,{config, lists:reverse(Config)} ,{output_dir, OutputDir} - ,{caller, Caller}], AllOptions) + ,{caller, api}], AllOptions) end, rebar_hooks:run_all_hooks(Cwd, post, ?PROVIDER, Providers, State), {ok, State}. |