aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJordan Wilberding <[email protected]>2013-09-16 10:30:15 -0700
committerJordan Wilberding <[email protected]>2013-09-16 10:30:15 -0700
commit47d157ee780c9c8fde1fc66ebc769ac7c10f0521 (patch)
tree533ba1b9ee980a664aaad19e3b6c6d15176a4cce
parent55f0f5aa4c25d21171113a75f91a37d12a4c78ee (diff)
parent26d1d19cc204d3ba63037b703f1b040a960d9725 (diff)
downloadrelx-v0.2.0.tar.gz
relx-v0.2.0.tar.bz2
relx-v0.2.0.zip
Merge pull request #40 from tsloughter/masterv0.2.00.2.0
Misc fixes, log improvements and README improvements
-rw-r--r--README.md83
-rw-r--r--examples/relx.config (renamed from examples/relcool.config)0
-rw-r--r--examples/relx_simple.config (renamed from examples/relcool_simple.config)0
-rw-r--r--src/relx.erl29
-rw-r--r--src/rlx_app_discovery.erl6
-rw-r--r--src/rlx_cmd_args.erl7
-rw-r--r--src/rlx_depsolver.erl1
-rw-r--r--src/rlx_dscv_util.erl4
-rw-r--r--src/rlx_log.erl74
-rw-r--r--src/rlx_prv_assembler.erl10
-rw-r--r--src/rlx_prv_overlay.erl2
-rw-r--r--src/rlx_prv_release.erl2
-rw-r--r--src/rlx_rel_discovery.erl6
-rw-r--r--src/rlx_release.erl10
-rw-r--r--src/rlx_state.erl41
-rw-r--r--src/rlx_topo.erl4
-rw-r--r--src/rlx_util.erl2
17 files changed, 166 insertions, 115 deletions
diff --git a/README.md b/README.md
index 5e1223f..ba4b391 100644
--- a/README.md
+++ b/README.md
@@ -1,27 +1,29 @@
[![Build Status](https://drone.io/github.com/erlware/relx/status.png)](https://drone.io/github.com/erlware/relx/latest)
-# NAME
+Relx
+=======
-relx - A release assembler for erlang
+A release assembler for Erlang.
-# SYNOPSIS
+Synopsis
+--------
relx [*options*] [*release-specification-file*]
-# DESCRIPTION
+Description
+-----------
Relx assembles releases for an Erlang/OTP release. Given a release
specification and a list of directories in which to search for OTP
applications it will generate a release output. That output depends
heavily on what plugins available and what options are defined, but
-usually it is simple a well configured release directory.
-
- relx -c relx.config -l ~/my-dirs --relname foo --relvsn 0.0.1 --target-spec myapp --target-spec getopt>=0.5.1 -o output-dir
+usually it is simply a well configured release directory.
The *release-specification-file* is optional but otherwise contains
additional specification information for releases.
-# BUILDING
+Building
+--------
To build relx and generate a standalone escript executable:
@@ -29,39 +31,36 @@ To build relx and generate a standalone escript executable:
This creates the executable `relx`.
-# OPTIONS
-
--r *STRING*, \--root *STRING*
-: Specify the root directory for the project (if different from cwd)
-
--n *STRING*, \--relname *STRING*
-: Specify the name for the release that will be generated
-
--v *STRING*, \--relvsn=*STRING*
-: Specify the version for the release
-
--g *STRING*, \--goals *STRING*
-: Specify a goal to the system. These are usually the OTP
- Apps that are part of the release
-
--o *STRING*, \--output-dir *STRING*
-: The output directory for the release. This is `./` by default.
-
--l *STRING*, \--lib-dir *STRING*
-: Additional dirs that should be searched for OTP Apps
-
--V *INTEGER*, \--verbose *INTEGER*
-: The verbosity level of the system. Valid values are 1 - 3
-
--c *INTEGER*, \--config *INTEGER*
-: The custom config file for the relx system
-
-# CONFIGURATION FILES
-
-Configuration files
-
-# SEE ALSO
-
-`reltool` (1).
+Config File
+-----------
+
+By default `relx` looks for `relx.config` in the current working directory:
+
+```erlang
+{release, {relname, "vsn"},
+ [app1,
+ app2]}.
+
+{extended_start_script, true}.
+```
+
+Options
+-------
+
+| Short | Long | Type | Default | Description |
+|:-----:|:------------:|:-------:|:------:|------------------------------------------------------------------------------------------- |
+| -r | --root | string | ./ | Name for the release that will be generated |
+| -v | --relvsn | string | | Version for the release |
+| -g | --goal | string | | A goal for the system. These are usually the OTP apps that are part of the release |
+| -u | --upfrom | string | | The release to upgrade from. Only valid with relup target |
+| -o | --output-dir | string | ./ | The output directory for the release |
+| -l | --lib-dir | string | | Additional dirs to search for OTP apps |
+| | --disable-default-libs | boolean | false | Disable use of the default system added lib dirs |
+| -V | --verbose | integer | 0 | The verbosity level between 0 and 2 |
+| -a | --override_app | string | | An app name and a directory to override in the form appname:dir |
+| -c | --config | string | ./relx.config | Config file path |
+
+Wiki
+----
[relx wiki](https://github.com/erlware/relx/wiki)
diff --git a/examples/relcool.config b/examples/relx.config
index 77d7acf..77d7acf 100644
--- a/examples/relcool.config
+++ b/examples/relx.config
diff --git a/examples/relcool_simple.config b/examples/relx_simple.config
index 88e9e8d..88e9e8d 100644
--- a/examples/relcool_simple.config
+++ b/examples/relx_simple.config
diff --git a/src/relx.erl b/src/relx.erl
index 7419352..bc3fbaa 100644
--- a/src/relx.erl
+++ b/src/relx.erl
@@ -47,7 +47,12 @@ main(Args) ->
OptSpecList = opt_spec_list(),
Result = case getopt:parse(OptSpecList, Args) of
{ok, {Options, NonOptions}} ->
- do([{caller, command_line} | Options], NonOptions);
+ case lists:member(help, Options) of
+ true ->
+ usage();
+ false ->
+ do([{caller, command_line} | Options], NonOptions)
+ end;
{error, Detail} ->
?RLX_ERROR({opt_parse, Detail})
end,
@@ -174,6 +179,8 @@ opt_spec_list() ->
"Only valid with relup target, specify the release to upgrade from"},
{output_dir, $o, "output-dir", string,
"The output directory for the release. This is `./` by default."},
+ {help, $h, "help", undefined,
+ "Print usage"},
{lib_dir, $l, "lib-dir", string,
"Additional dirs that should be searched for OTP Apps"},
{disable_default_libs, undefined, "disable-default-libs",
@@ -186,14 +193,16 @@ opt_spec_list() ->
{config, $c, "config", {string, ""}, "The path to a config file"},
{root_dir, $r, "root", string, "The project root directory"}].
--spec format_error(Reason::term()) -> iolist().
+-spec format_error(Reason::term()) -> string().
format_error({invalid_return_value, Provider, Value}) ->
- [rlx_provider:format(Provider), " returned an invalid value ",
- io_lib:format("~p", [Value])];
+ io_lib:format(lists:flatten([rlx_provider:format(Provider), " returned an invalid value ",
+ io_lib:format("~p", [Value])]), []);
format_error({opt_parse, {invalid_option, Opt}}) ->
io_lib:format("invalid option ~s~n", [Opt]);
format_error({opt_parse, Arg}) ->
io_lib:format("~p~n", [Arg]);
+format_error({error, {relx, Reason}}) ->
+ format_error(Reason);
format_error({error, {Module, Reason}}) ->
io_lib:format("~s~n", [Module:format_error(Reason)]).
@@ -268,8 +277,16 @@ usage() ->
-spec report_error(rlx_state:t(), error()) -> none() | error().
report_error(State, Error) ->
- io:format(format_error(Error)),
- usage(),
+ case Error of
+ {error, {relx, {opt_parse, _}}} ->
+ io:format(standard_error, format_error(Error), []),
+ usage();
+ {error, {rlx_cmd_args, _}} ->
+ io:format(standard_error, format_error(Error), []),
+ usage();
+ _ ->
+ io:format(standard_error, format_error(Error), [])
+ end,
case rlx_state:caller(State) of
command_line ->
erlang:halt(127);
diff --git a/src/rlx_app_discovery.erl b/src/rlx_app_discovery.erl
index e6b6e2c..d321638 100644
--- a/src/rlx_app_discovery.erl
+++ b/src/rlx_app_discovery.erl
@@ -35,12 +35,12 @@
%% @doc recursively dig down into the library directories specified in the state
%% looking for OTP Applications
--spec do(rlx_state:t(), [filename:name()]) -> {ok, [rlx_app_info:t()]} | relx:error().
+-spec do(rlx_state:t(), [file:name()]) -> {ok, [rlx_app_info:t()]} | relx:error().
do(State, LibDirs) ->
rlx_log:info(rlx_state:log(State),
fun() ->
["Resolving OTP Applications from directories:\n",
- [[rlx_util:indent(1), LibDir, "\n"] || LibDir <- LibDirs]]
+ [[rlx_util:indent(2), LibDir, "\n"] || LibDir <- LibDirs]]
end),
resolve_app_metadata(State, LibDirs).
@@ -72,7 +72,7 @@ resolve_app_metadata(State, LibDirs) ->
rlx_log:debug(rlx_state:log(State),
fun() ->
["Resolved the following OTP Applications from the system: \n",
- [[rlx_app_info:format(1, App), "\n"] || App <- AppMeta1]]
+ [[rlx_app_info:format(2, App), "\n"] || App <- AppMeta1]]
end),
{ok, AppMeta1};
Errors ->
diff --git a/src/rlx_cmd_args.erl b/src/rlx_cmd_args.erl
index 4fbadba..d144953 100644
--- a/src/rlx_cmd_args.erl
+++ b/src/rlx_cmd_args.erl
@@ -100,7 +100,8 @@ handle_config(Opts, Targets, CommandLineConfig) ->
convert_targets(Targets) ->
convert_targets(Targets, []).
--spec convert_targets([string()], [string()]) -> {ok, release | relup} | relx:error().
+-spec convert_targets([string()], [rlx_state:action()]) ->
+ {ok, [rlx_state:action()]} | relx:error().
convert_targets([], []) ->
{ok, [release]};
convert_targets([], Acc) ->
@@ -134,7 +135,7 @@ create_log(Opts, Acc) ->
LogLevel = proplists:get_value(log_level, Opts, 0),
if
LogLevel >= 0, LogLevel =< 2 ->
- create_goals(Opts, [{log, rlx_log:new(LogLevel)} | Acc]);
+ create_goals(Opts, [{log, rlx_log:new(LogLevel, command_line)} | Acc]);
true ->
?RLX_ERROR({invalid_log_level, LogLevel})
end.
@@ -245,7 +246,7 @@ create_disable_default_libs(Opts, Acc) ->
Def = proplists:get_value(disable_default_libs, Opts, false),
create_upfrom(Opts, [{disable_default_libs, Def} | Acc]).
--spec create_upfrom([getopt:option()], rcl:cmd_args()) ->
+-spec create_upfrom([getopt:option()], rlx_state:cmd_args()) ->
{ok, rlx_state:cmd_args()} | relx:error().
create_upfrom(Opts, Acc) ->
case proplists:get_value(upfrom, Opts, undefined) of
diff --git a/src/rlx_depsolver.erl b/src/rlx_depsolver.erl
index 2b6e420..20423d0 100644
--- a/src/rlx_depsolver.erl
+++ b/src/rlx_depsolver.erl
@@ -100,6 +100,7 @@
-export_type([t/0,
pkg/0,
constraint_op/0,
+ raw_constraint/0,
pkg_name/0,
vsn/0,
constraint/0,
diff --git a/src/rlx_dscv_util.erl b/src/rlx_dscv_util.erl
index 3d90b08..779534c 100644
--- a/src/rlx_dscv_util.erl
+++ b/src/rlx_dscv_util.erl
@@ -33,7 +33,7 @@
%% Types
%%============================================================================
--type process_fun(Result) :: fun((filename:name(), file | directory) ->
+-type process_fun(Result) :: fun((file:name(), file | directory) ->
{ok, Result} |
{error, term()} |
{ok, Result, Recurse::boolean()} |
@@ -46,7 +46,7 @@
%% @doc recursively dig down into the library directories specified in the state
%% looking for OTP Applications
--spec do(process_fun([term()] | term()), [filename:name()]) ->
+-spec do(process_fun([term()] | term()), [file:name()]) ->
[term() | {error, term()}].
do(ProcessDir, LibDirs) ->
lists:flatten(ec_plists:map(fun(LibDir) ->
diff --git a/src/rlx_log.erl b/src/rlx_log.erl
index 901ae7c..608c0af 100644
--- a/src/rlx_log.erl
+++ b/src/rlx_log.erl
@@ -23,6 +23,7 @@
-module(rlx_log).
-export([new/1,
+ new/2,
log/4,
should/2,
debug/2,
@@ -35,14 +36,27 @@
atom_log_level/1,
format/1]).
--export_type([int_log_level/0,
+-export_type([t/0,
+ int_log_level/0,
atom_log_level/0,
log_level/0,
- log_fun/0,
- t/0]).
+ log_fun/0]).
-include_lib("relx/include/relx.hrl").
+-define(RED, 31).
+-define(GREEN, 32).
+-define(YELLOW, 33).
+-define(BLUE, 34).
+-define(MAGENTA, 35).
+-define(CYAN, 36).
+
+-define(PREFIX, "===> ").
+
+-record(state_t, {mod=?MODULE :: rlx_log,
+ log_level=0 :: int_log_level(),
+ caller=api :: api | command_line}).
+
%%============================================================================
%% types
%%============================================================================
@@ -55,18 +69,23 @@
%% and warn
-type atom_log_level() :: error | info | debug.
--opaque t() :: {?MODULE, int_log_level()}.
-
-type log_fun() :: fun(() -> iolist()).
+-type color() :: 31..36.
+
+-opaque t() :: record(state_t).
+
%%============================================================================
%% API
%%============================================================================
%% @doc Create a new 'log level' for the system
-spec new(log_level()) -> t().
-new(LogLevel) when LogLevel >= 0, LogLevel =< 2 ->
- {?MODULE, LogLevel};
-new(AtomLogLevel)
+new(LogLevel) ->
+ new(LogLevel, api).
+
+new(LogLevel, Caller) when LogLevel >= 0, LogLevel =< 2 ->
+ #state_t{mod=?MODULE, log_level=LogLevel, caller=Caller};
+new(AtomLogLevel, Caller)
when AtomLogLevel =:= error;
AtomLogLevel =:= info;
AtomLogLevel =:= debug ->
@@ -75,7 +94,7 @@ new(AtomLogLevel)
info -> 1;
debug -> 2
end,
- new(LogLevel).
+ new(LogLevel, Caller).
%% @doc log at the debug level given the current log state with a string or
@@ -83,7 +102,7 @@ new(AtomLogLevel)
-spec debug(t(), string() | log_fun()) -> ok.
debug(LogState, Fun)
when erlang:is_function(Fun) ->
- log(LogState, ?RLX_DEBUG, Fun);
+ log(LogState, ?RLX_DEBUG, fun() -> colorize(LogState, ?CYAN, false, Fun()) end);
debug(LogState, String) ->
debug(LogState, "~s~n", [String]).
@@ -91,14 +110,14 @@ debug(LogState, String) ->
%% and argements @see io:format/2
-spec debug(t(), string(), [any()]) -> ok.
debug(LogState, FormatString, Args) ->
- log(LogState, ?RLX_DEBUG, FormatString, Args).
+ log(LogState, ?RLX_DEBUG, colorize(LogState, ?CYAN, false, FormatString), Args).
%% @doc log at the info level given the current log state with a string or
%% function that returns a string
-spec info(t(), string() | log_fun()) -> ok.
info(LogState, Fun)
when erlang:is_function(Fun) ->
- log(LogState, ?RLX_INFO, Fun);
+ log(LogState, ?RLX_INFO, fun() -> colorize(LogState, ?GREEN, false, Fun()) end);
info(LogState, String) ->
info(LogState, "~s~n", [String]).
@@ -106,14 +125,14 @@ info(LogState, String) ->
%% and argements @see io:format/2
-spec info(t(), string(), [any()]) -> ok.
info(LogState, FormatString, Args) ->
- log(LogState, ?RLX_INFO, FormatString, Args).
+ log(LogState, ?RLX_INFO, colorize(LogState, ?GREEN, false, FormatString), Args).
%% @doc log at the error level given the current log state with a string or
%% format string that returns a function
-spec error(t(), string() | log_fun()) -> ok.
error(LogState, Fun)
when erlang:is_function(Fun) ->
- log(LogState, ?RLX_ERROR, Fun);
+ log(LogState, ?RLX_ERROR, fun() -> colorize(LogState, ?RED, false, Fun()) end);
error(LogState, String) ->
error(LogState, "~s~n", [String]).
@@ -121,21 +140,20 @@ error(LogState, String) ->
%% and argements @see io:format/2
-spec error(t(), string(), [any()]) -> ok.
error(LogState, FormatString, Args) ->
- log(LogState, ?RLX_ERROR, FormatString, Args).
+ log(LogState, ?RLX_ERROR, colorize(LogState, ?GREEN, false, FormatString), Args).
%% @doc Execute the fun passed in if log level is as expected.
-spec log(t(), int_log_level(), log_fun()) -> ok.
-log({?MODULE, DetailLogLevel}, LogLevel, Fun)
+log(#state_t{mod=?MODULE, log_level=DetailLogLevel}, LogLevel, Fun)
when DetailLogLevel >= LogLevel ->
io:format("~s~n", [Fun()]);
log(_, _, _) ->
ok.
-
%% @doc when the module log level is less then or equal to the log level for the
%% call then write the log info out. When its not then ignore the call.
-spec log(t(), int_log_level(), string(), [any()]) -> ok.
-log({?MODULE, DetailLogLevel}, LogLevel, FormatString, Args)
+log(#state_t{mod=?MODULE, log_level=DetailLogLevel}, LogLevel, FormatString, Args)
when DetailLogLevel >= LogLevel,
erlang:is_list(Args) ->
io:format(FormatString, Args);
@@ -145,7 +163,7 @@ log(_, _, _, _) ->
%% @doc return a boolean indicating if the system should log for the specified
%% levelg
-spec should(t(), int_log_level() | any()) -> boolean().
-should({?MODULE, DetailLogLevel}, LogLevel)
+should(#state_t{mod=?MODULE, log_level=DetailLogLevel}, LogLevel)
when DetailLogLevel >= LogLevel ->
true;
should(_, _) ->
@@ -153,16 +171,16 @@ should(_, _) ->
%% @doc get the current log level as an integer
-spec log_level(t()) -> int_log_level().
-log_level({?MODULE, DetailLogLevel}) ->
+log_level(#state_t{mod=?MODULE, log_level=DetailLogLevel}) ->
DetailLogLevel.
%% @doc get the current log level as an atom
-spec atom_log_level(t()) -> atom_log_level().
-atom_log_level({?MODULE, ?RLX_ERROR}) ->
+atom_log_level(#state_t{mod=?MODULE, log_level=?RLX_ERROR}) ->
error;
-atom_log_level({?MODULE, ?RLX_INFO}) ->
+atom_log_level(#state_t{mod=?MODULE, log_level=?RLX_INFO}) ->
info;
-atom_log_level({?MODULE, ?RLX_DEBUG}) ->
+atom_log_level(#state_t{mod=?MODULE, log_level=?RLX_DEBUG}) ->
debug.
-spec format(t()) -> iolist().
@@ -172,6 +190,16 @@ format(Log) ->
erlang:atom_to_list(atom_log_level(Log)),
<<")">>].
+-spec colorize(t(), color(), boolean(), string()) -> string().
+colorize(#state_t{caller=command_line}, Color, false, Msg) when is_integer(Color) ->
+ colorize_(Color, 0, Msg);
+colorize(_LogState, _Color, _Bold, Msg) ->
+ Msg.
+
+-spec colorize_(color(), integer(), string()) -> string().
+colorize_(Color, Bold, Msg) when is_integer(Color), is_integer(Bold)->
+ lists:flatten(io_lib:format("\033[~B;~Bm~s~s\033[0m", [Bold, Color, ?PREFIX, Msg])).
+
%%%===================================================================
%%% Test Functions
%%%===================================================================
diff --git a/src/rlx_prv_assembler.erl b/src/rlx_prv_assembler.erl
index 70c38ec..d47a850 100644
--- a/src/rlx_prv_assembler.erl
+++ b/src/rlx_prv_assembler.erl
@@ -101,19 +101,19 @@ format_error({release_script_generation_error, RelFile}) ->
[RelFile]);
format_error({release_script_generation_warning, Module, Warnings}) ->
["Warnings generating release \s",
- rlx_util:indent(1), Module:format_warning(Warnings)];
+ rlx_util:indent(2), Module:format_warning(Warnings)];
format_error({unable_to_create_output_dir, OutputDir}) ->
io_lib:format("Unable to create output directory (possible permissions issue): ~s",
[OutputDir]);
format_error({release_script_generation_error, Module, Errors}) ->
["Errors generating release \n",
- rlx_util:indent(1), Module:format_error(Errors)];
+ rlx_util:indent(2), Module:format_error(Errors)];
format_error({relup_generation_error, CurrentName, UpFromName}) ->
io_lib:format("Unknown internal release error generating the relup from ~s to ~s",
[UpFromName, CurrentName]);
format_error({relup_generation_warning, Module, Warnings}) ->
["Warnings generating relup \s",
- rlx_util:indent(1), Module:format_warning(Warnings)];
+ rlx_util:indent(2), Module:format_warning(Warnings)];
format_error({relup_script_generation_error,
{relup_script_generation_error, systools_relup,
{missing_sasl, _}}}) ->
@@ -121,10 +121,10 @@ format_error({relup_script_generation_error,
"in both the current release and the release to upgrade from.";
format_error({relup_script_generation_error, Module, Errors}) ->
["Errors generating relup \n",
- rlx_util:indent(1), Module:format_error(Errors)];
+ rlx_util:indent(2), Module:format_error(Errors)];
format_error({unable_to_make_symlink, AppDir, TargetDir, Reason}) ->
io_lib:format("Unable to symlink directory ~s to ~s because \n~s~s",
- [AppDir, TargetDir, rlx_util:indent(1),
+ [AppDir, TargetDir, rlx_util:indent(2),
file:format_error(Reason)]);
format_error({tar_unknown_generation_error, Module, Vsn}) ->
io_lib:format("Tarball generation error of ~s ~s",
diff --git a/src/rlx_prv_overlay.erl b/src/rlx_prv_overlay.erl
index f242d21..e1edb6c 100644
--- a/src/rlx_prv_overlay.erl
+++ b/src/rlx_prv_overlay.erl
@@ -68,7 +68,7 @@ format_error({dir_render_failed, Dir, Error}) ->
[Dir, Error]);
format_error({unable_to_make_symlink, AppDir, TargetDir, Reason}) ->
io_lib:format("Unable to symlink directory ~s to ~s because \n~s~s",
- [AppDir, TargetDir, rlx_util:indent(1),
+ [AppDir, TargetDir, rlx_util:indent(2),
file:format_error(Reason)]);
format_error({copy_failed, FromFile, ToFile, Err}) ->
io_lib:format("Unable to copy from ~s to ~s because of ~p",
diff --git a/src/rlx_prv_release.erl b/src/rlx_prv_release.erl
index cf13953..908573b 100644
--- a/src/rlx_prv_release.erl
+++ b/src/rlx_prv_release.erl
@@ -175,7 +175,7 @@ set_resolved(State, Release0, Pkgs) ->
rlx_release:vsn(Release1)]),
rlx_log:debug(rlx_state:log(State),
fun() ->
- rlx_release:format(1, Release1)
+ rlx_release:format(0, Release1)
end),
{ok, rlx_state:add_realized_release(State, Release1)};
{error, E} ->
diff --git a/src/rlx_rel_discovery.erl b/src/rlx_rel_discovery.erl
index 3cdca3e..1616f52 100644
--- a/src/rlx_rel_discovery.erl
+++ b/src/rlx_rel_discovery.erl
@@ -35,13 +35,13 @@
%% @doc recursively dig down into the library directories specified in the state
%% looking for OTP Applications
--spec do(rlx_state:t(), [filename:name()], [rlx_app_info:t()]) ->
+-spec do(rlx_state:t(), [file:name()], [rlx_app_info:t()]) ->
{ok, [rlx_release:t()]} | relx:error().
do(State, LibDirs, AppMeta) ->
rlx_log:info(rlx_state:log(State),
fun() ->
- ["Resolving available releases from directories:\n",
- [[rlx_util:indent(1), LibDir, "\n"] || LibDir <- LibDirs]]
+ ["Resolving available OTP Releases from directories:\n",
+ [[rlx_util:indent(2), LibDir, "\n"] || LibDir <- LibDirs]]
end),
resolve_rel_metadata(State, LibDirs, AppMeta).
diff --git a/src/rlx_release.erl b/src/rlx_release.erl
index 68193fa..471a6f7 100644
--- a/src/rlx_release.erl
+++ b/src/rlx_release.erl
@@ -196,14 +196,14 @@ format(Indent, #release_t{name=Name, vsn=Vsn, erts=ErtsVsn, realized=Realized,
goals = Goals, applications=Apps}) ->
BaseIndent = rlx_util:indent(Indent),
[BaseIndent, "release: ", rlx_util:to_string(Name), "-", Vsn, "\n",
- rlx_util:indent(Indent + 1), " erts-", ErtsVsn,
+ rlx_util:indent(Indent + 2), " erts-", ErtsVsn,
", realized = ", erlang:atom_to_list(Realized), "\n",
- BaseIndent, "goals: \n",
- [[rlx_util:indent(Indent + 1), format_goal(Goal), ",\n"] || Goal <- Goals],
+ rlx_util:indent(Indent + 1), "goals: \n",
+ [[rlx_util:indent(Indent + 2), format_goal(Goal), ",\n"] || Goal <- Goals],
case Realized of
true ->
- [BaseIndent, "applications: \n",
- [[rlx_util:indent(Indent + 1), io_lib:format("~p", [App]), ",\n"] ||
+ [rlx_util:indent(Indent + 1), "applications: \n",
+ [[rlx_util:indent(Indent + 2), io_lib:format("~p", [App]), ",\n"] ||
App <- Apps]];
false ->
[]
diff --git a/src/rlx_state.erl b/src/rlx_state.erl
index d03631d..6d3c4ee 100644
--- a/src/rlx_state.erl
+++ b/src/rlx_state.erl
@@ -66,13 +66,14 @@
-export_type([t/0,
- releases/0,
- cmd_args/0]).
+ releases/0,
+ cmd_args/0,
+ action/0]).
-record(state_t, {log :: rlx_log:t(),
root_dir :: file:name(),
caller :: caller(),
- actions=[] :: [atom()],
+ actions=[] :: [action()],
output_dir :: file:name(),
lib_dirs=[] :: [file:name()],
config_file=[] :: file:filename() | undefined,
@@ -99,6 +100,7 @@
rlx_release:t()).
-type cmd_args() :: proplists:proplist().
-type caller() :: command_line | api.
+-type action() :: release | relup | tar.
-opaque t() :: record(state_t).
@@ -106,18 +108,21 @@
%% API
%%============================================================================
%% @doc Create a new 'log level' for the system
--spec new(proplists:proplist(), [atom()]) -> t().
+-spec new(proplists:proplist(), undefined | [atom()]) -> t().
+new(PropList, undefined) ->
+ new(PropList, [release]);
new(PropList, Targets)
when erlang:is_list(PropList),
erlang:is_list(Targets) ->
{ok, Root} = file:get_cwd(),
+ Caller = proplists:get_value(caller, PropList, api),
State0 =
- #state_t{log = proplists:get_value(log, PropList, rlx_log:new(error)),
+ #state_t{log = proplists:get_value(log, PropList, rlx_log:new(error, Caller)),
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),
actions = Targets,
- caller = proplists:get_value(caller, PropList, api),
+ caller = Caller,
goals=proplists:get_value(goals, PropList, []),
providers = [],
configured_releases=ec_dictionary:new(ec_dict),
@@ -133,7 +138,7 @@ new(PropList, Targets)
proplists:get_value(disable_default_libs, PropList, false)).
%% @doc the actions targeted for this system
--spec actions(t()) -> atom().
+-spec actions(t()) -> [action()].
actions(#state_t{actions=Actions}) ->
Actions.
@@ -317,17 +322,17 @@ format(#state_t{log=LogState, output_dir=OutDir, lib_dirs=LibDirs,
Values1 = ec_dictionary:to_list(Values0),
[rlx_util:indent(Indent),
<<"state(">>, erlang:atom_to_list(Caller), <<"):\n">>,
- rlx_util:indent(Indent + 1), <<"log: ">>, rlx_log:format(LogState), <<",\n">>,
- rlx_util:indent(Indent + 1), "config file: ", rlx_util:optional_to_string(ConfigFile), "\n",
- rlx_util:indent(Indent + 1), "goals: \n",
- [[rlx_util:indent(Indent + 2), rlx_depsolver:format_constraint(Goal), ",\n"] || Goal <- Goals],
- rlx_util:indent(Indent + 1), "output_dir: ", OutDir, "\n",
- rlx_util:indent(Indent + 1), "lib_dirs: \n",
- [[rlx_util:indent(Indent + 2), LibDir, ",\n"] || LibDir <- LibDirs],
- rlx_util:indent(Indent + 1), "providers: \n",
- [[rlx_util:indent(Indent + 2), rlx_provider:format(Provider), ",\n"] || Provider <- Providers],
- rlx_util:indent(Indent + 1), "provider config values: \n",
- [[rlx_util:indent(Indent + 2), io_lib:format("~p", [Value]), ",\n"] || Value <- Values1]].
+ rlx_util:indent(Indent + 2), <<"log: ">>, rlx_log:format(LogState), <<",\n">>,
+ rlx_util:indent(Indent + 2), "config file: ", rlx_util:optional_to_string(ConfigFile), "\n",
+ rlx_util:indent(Indent + 2), "goals: \n",
+ [[rlx_util:indent(Indent + 3), rlx_depsolver:format_constraint(Goal), ",\n"] || Goal <- Goals],
+ rlx_util:indent(Indent + 2), "output_dir: ", OutDir, "\n",
+ rlx_util:indent(Indent + 2), "lib_dirs: \n",
+ [[rlx_util:indent(Indent + 3), LibDir, ",\n"] || LibDir <- LibDirs],
+ rlx_util:indent(Indent + 2), "providers: \n",
+ [[rlx_util:indent(Indent + 3), rlx_provider:format(Provider), ",\n"] || Provider <- Providers],
+ rlx_util:indent(Indent + 2), "provider config values: \n",
+ [[rlx_util:indent(Indent + 3), io_lib:format("~p", [Value]), ",\n"] || Value <- Values1]].
%%%===================================================================
%%% Internal Functions
diff --git a/src/rlx_topo.erl b/src/rlx_topo.erl
index 11928c1..1b3593b 100644
--- a/src/rlx_topo.erl
+++ b/src/rlx_topo.erl
@@ -71,9 +71,9 @@ format_error({cycle, Pairs}) ->
"before we can continue:\n",
case Pairs of
[{P1, P2}] ->
- [rlx_util:indent(1), erlang:atom_to_list(P2), "->", erlang:atom_to_list(P1)];
+ [rlx_util:indent(2), erlang:atom_to_list(P2), "->", erlang:atom_to_list(P1)];
[{P1, P2} | Rest] ->
- [rlx_util:indent(1), erlang:atom_to_list(P2), "->", erlang:atom_to_list(P1),
+ [rlx_util:indent(2), erlang:atom_to_list(P2), "->", erlang:atom_to_list(P1),
[["-> ", erlang:atom_to_list(PP2), " -> ", erlang:atom_to_list(PP1)] || {PP1, PP2} <- Rest]];
[] ->
[]
diff --git a/src/rlx_util.erl b/src/rlx_util.erl
index ac6af5c..53e9122 100644
--- a/src/rlx_util.erl
+++ b/src/rlx_util.erl
@@ -30,7 +30,7 @@
indent/1,
optional_to_string/1]).
--define(ONE_LEVEL_INDENT, " ").
+-define(ONE_LEVEL_INDENT, " ").
%%============================================================================
%% types
%%============================================================================