Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

74 řádky
3.2 KiB

před 10 roky
před 10 roky
před 10 roky
před 10 roky
před 10 roky
před 10 roky
před 10 roky
  1. -module(rebar_prv_edoc).
  2. -behaviour(provider).
  3. -export([init/1,
  4. do/1,
  5. format_error/1]).
  6. -include("rebar.hrl").
  7. -define(PROVIDER, edoc).
  8. -define(DEPS, [compile]).
  9. %% ===================================================================
  10. %% Public API
  11. %% ===================================================================
  12. -spec init(rebar_state:t()) -> {ok, rebar_state:t()}.
  13. init(State) ->
  14. State1 = rebar_state:add_provider(State, providers:create([{name, ?PROVIDER},
  15. {module, ?MODULE},
  16. {bare, true},
  17. {deps, ?DEPS},
  18. {example, "rebar3 edoc"},
  19. {short_desc, "Generate documentation using edoc."},
  20. {desc, "Generate documentation using edoc."},
  21. {opts, []},
  22. {profiles, [docs]}])),
  23. {ok, State1}.
  24. -spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
  25. do(State) ->
  26. code:add_pathsa(rebar_state:code_paths(State, all_deps)),
  27. ProjectApps = rebar_state:project_apps(State),
  28. Providers = rebar_state:providers(State),
  29. EdocOpts = rebar_state:get(State, edoc_opts, []),
  30. ShouldAccPaths = not has_configured_paths(EdocOpts),
  31. Cwd = rebar_state:dir(State),
  32. rebar_hooks:run_all_hooks(Cwd, pre, ?PROVIDER, Providers, State),
  33. lists:foldl(fun(AppInfo, EdocOptsAcc) ->
  34. rebar_hooks:run_all_hooks(Cwd, pre, ?PROVIDER, Providers, AppInfo, State),
  35. AppName = ec_cnv:to_list(rebar_app_info:name(AppInfo)),
  36. ?INFO("Running edoc for ~s", [AppName]),
  37. AppDir = rebar_app_info:dir(AppInfo),
  38. ok = edoc:application(list_to_atom(AppName), AppDir, EdocOptsAcc),
  39. rebar_hooks:run_all_hooks(Cwd, post, ?PROVIDER, Providers, AppInfo, State),
  40. case ShouldAccPaths of
  41. true ->
  42. %% edoc wants / on all OSes
  43. add_to_paths(EdocOptsAcc, AppDir++"/doc");
  44. false ->
  45. EdocOptsAcc
  46. end
  47. end, EdocOpts, ProjectApps),
  48. rebar_hooks:run_all_hooks(Cwd, post, ?PROVIDER, Providers, State),
  49. rebar_utils:cleanup_code_path(rebar_state:code_paths(State, default)),
  50. {ok, State}.
  51. -spec format_error(any()) -> iolist().
  52. format_error(Reason) ->
  53. io_lib:format("~p", [Reason]).
  54. %% ===================================================================
  55. %% Internal functions
  56. %% ===================================================================
  57. has_configured_paths(EdocOpts) ->
  58. proplists:get_value(dir, EdocOpts) =/= undefined.
  59. add_to_paths([], Path) ->
  60. [{doc_path, [Path]}];
  61. add_to_paths([{doc_path, Paths}|T], Path) ->
  62. [{doc_path, [Path | Paths]} | T];
  63. add_to_paths([H|T], Path) ->
  64. [H | add_to_paths(Path, T)].