anchor.diff:      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,
  
positive.code: 
  -spec report_error(rlx_state:t(), error()) -> none() | error().
  report_error(State, Error) ->
      io:format(format_error(Error)),
      usage(),
      case rlx_state:caller(State) of
          command_line ->
              erlang:halt(127);
  
negative.code:      {config, $c, "config", {string, ""}, "The path to a config file"},
       {root_dir, $r, "root", string, "The project root directory"}].
  
  -spec format_error(Reason::term()) -> string().
  format_error({invalid_return_value, Provider, 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)]).
  
  