anchor.diff:       {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)]).
   
  
positive.code:       "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."},
       {lib_dir, $l, "lib-dir", string,
        "Additional dirs that should be searched for OTP Apps"},
       {disable_default_libs, undefined, "disable-default-libs",
  
negative.code: 
  -spec report_error(rlx_state:t(), error()) -> none() | error().
  report_error(State, Error) ->
      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);
  