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ů.

92 řádky
4.0 KiB

  1. -module(rebar_hooks).
  2. -export([run_all_hooks/5
  3. ,run_all_hooks/6
  4. ,run_project_and_app_hooks/5
  5. ,format_error/1]).
  6. -include("rebar.hrl").
  7. -include_lib("providers/include/providers.hrl").
  8. -spec run_all_hooks(file:filename_all(), pre | post,
  9. atom() | {atom(), atom()} | string(),
  10. [providers:t()], rebar_app_info:t(), rebar_state:t()) -> rebar_app_info:t().
  11. run_all_hooks(Dir, Type, Command, Providers, AppInfo, State) ->
  12. State1 = rebar_state:current_app(State, AppInfo),
  13. State2 = run_provider_hooks(Dir, Type, Command, Providers, rebar_app_info:opts(AppInfo), State1),
  14. run_hooks(Dir, Type, Command, rebar_app_info:opts(AppInfo), State1),
  15. rebar_state:current_app(State2).
  16. run_all_hooks(Dir, Type, Command, Providers, State) ->
  17. run_provider_hooks(Dir, Type, Command, Providers, rebar_state:opts(State), State),
  18. run_hooks(Dir, Type, Command, rebar_state:opts(State), State).
  19. run_project_and_app_hooks(Dir, Type, Command, Providers, State) ->
  20. ProjectApps = rebar_state:project_apps(State),
  21. [rebar_hooks:run_all_hooks(Dir, Type, Command, Providers, AppInfo, State) || AppInfo <- ProjectApps],
  22. run_all_hooks(Dir, Type, Command, Providers, State).
  23. run_provider_hooks(Dir, Type, Command, Providers, Opts, State) ->
  24. case rebar_opts:get(Opts, provider_hooks, []) of
  25. [] ->
  26. State;
  27. AllHooks ->
  28. TypeHooks = proplists:get_value(Type, AllHooks, []),
  29. run_provider_hooks_(Dir, Type, Command, Providers, TypeHooks, rebar_state:opts(State, Opts))
  30. end.
  31. run_provider_hooks_(_Dir, _Type, _Command, _Providers, [], State) ->
  32. State;
  33. run_provider_hooks_(Dir, Type, Command, Providers, TypeHooks, State) ->
  34. case proplists:get_all_values(Command, TypeHooks) of
  35. [] ->
  36. State;
  37. HookProviders ->
  38. rebar_paths:set_paths([plugins], State),
  39. Providers1 = rebar_state:providers(State),
  40. State1 = rebar_state:providers(rebar_state:dir(State, Dir), Providers++Providers1),
  41. case rebar_core:do(HookProviders, State1) of
  42. {error, ProviderName} ->
  43. ?DEBUG(format_error({bad_provider, Type, Command, ProviderName}), []),
  44. throw(?PRV_ERROR({bad_provider, Type, Command, ProviderName}));
  45. {ok, State2} ->
  46. rebar_paths:set_paths([deps], State2),
  47. State2
  48. end
  49. end.
  50. format_error({bad_provider, Type, Command, {Name, Namespace}}) ->
  51. io_lib:format("Unable to run ~ts hooks for '~p', command '~p' in namespace '~p' not found.", [Type, Command, Namespace, Name]);
  52. format_error({bad_provider, Type, Command, Name}) ->
  53. io_lib:format("Unable to run ~ts hooks for '~p', command '~p' not found.", [Type, Command, Name]).
  54. run_hooks(Dir, pre, Command, Opts, State) ->
  55. run_hooks(Dir, pre_hooks, Command, Opts, State);
  56. run_hooks(Dir, post, Command, Opts, State) ->
  57. run_hooks(Dir, post_hooks, Command, Opts, State);
  58. run_hooks(Dir, Type, Command, Opts, State) ->
  59. case rebar_opts:get(Opts, Type, []) of
  60. [] ->
  61. ?DEBUG("run_hooks(~p, ~p, ~p) -> no hooks defined\n", [Dir, Type, Command]),
  62. ok;
  63. Hooks ->
  64. Env = rebar_env:create_env(State, Opts),
  65. lists:foreach(fun({_, C, _}=Hook) when C =:= Command ->
  66. apply_hook(Dir, Env, Hook);
  67. ({C, _}=Hook) when C =:= Command ->
  68. apply_hook(Dir, Env, Hook);
  69. (_) ->
  70. continue
  71. end, Hooks)
  72. end.
  73. apply_hook(Dir, Env, {Arch, Command, Hook}) ->
  74. case rebar_utils:is_arch(Arch) of
  75. true ->
  76. apply_hook(Dir, Env, {Command, Hook});
  77. false ->
  78. ok
  79. end;
  80. apply_hook(Dir, Env, {Command, Hook}) ->
  81. Msg = lists:flatten(io_lib:format("Hook for ~p failed!~n", [Command])),
  82. rebar_utils:sh(Hook, [use_stdout, {cd, Dir}, {env, Env}, {abort_on_error, Msg}]).