You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
3.1 KiB

пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
пре 10 година
  1. %% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*-
  2. %% ex: ts=4 sw=4 et
  3. -module(rebar_prv_help).
  4. -behaviour(provider).
  5. -export([init/1,
  6. do/1,
  7. format_error/1]).
  8. -include("rebar.hrl").
  9. -define(PROVIDER, help).
  10. -define(DEPS, []).
  11. %% ===================================================================
  12. %% Public API
  13. %% ===================================================================
  14. -spec init(rebar_state:t()) -> {ok, rebar_state:t()}.
  15. init(State) ->
  16. State1 = rebar_state:add_provider(State, providers:create([{name, ?PROVIDER},
  17. {module, ?MODULE},
  18. {bare, true},
  19. {deps, ?DEPS},
  20. {example, "rebar3 help <task>"},
  21. {short_desc, "Display a list of tasks or help for a given task or subtask."},
  22. {desc, "Display a list of tasks or help for a given task or subtask."},
  23. {opts, [
  24. {help_task, undefined, undefined, string, "Task to print help for."}
  25. ]}])),
  26. {ok, State1}.
  27. -spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
  28. do(State) ->
  29. case rebar_state:command_args(State) of
  30. [] ->
  31. help(State),
  32. {ok, State};
  33. [Name] -> % default namespace
  34. task_help(default, list_to_atom(Name), State);
  35. [Namespace, Name] ->
  36. task_help(list_to_atom(Namespace), list_to_atom(Name), State);
  37. _ ->
  38. {error, "Too many arguments given. " ++
  39. "Usage: rebar3 help [<namespace>] <task>"}
  40. end.
  41. -spec format_error(any()) -> iolist().
  42. format_error(Reason) ->
  43. io_lib:format("~p", [Reason]).
  44. %%
  45. %% print help/usage string
  46. %%
  47. help(State) ->
  48. ?CONSOLE("Rebar3 is a tool for working with Erlang projects.~n", []),
  49. OptSpecList = rebar3:global_option_spec_list(),
  50. getopt:usage(OptSpecList, "rebar3", "", []),
  51. ?CONSOLE(" Set the environment variable DEBUG=1 for detailed output.~n", []),
  52. ?CONSOLE("Several tasks are available:~n", []),
  53. providers:help(rebar_state:providers(State)),
  54. ?CONSOLE("~nRun 'rebar3 help <TASK>' for details.", []).
  55. task_help(Namespace, Name, State) ->
  56. Providers = rebar_state:providers(State),
  57. case providers:get_provider(Name, Providers, Namespace) of
  58. not_found ->
  59. case providers:get_providers_by_namespace(Name, Providers) of
  60. [] ->
  61. {error, io_lib:format("Unknown task ~p", [Name])};
  62. NSProviders ->
  63. providers:help(NSProviders),
  64. {ok, State}
  65. end;
  66. Provider ->
  67. providers:help(Provider),
  68. {ok, State}
  69. end.